[PYTHON] Starten Sie einen temporären http-Server lokal mit Pytest

Durch die Einrichtung eines lokalen Servers bei der Ausführung eines Komponententests können Tests durchgeführt werden, die nicht von außen abhängen.

Praktisch für die API- und Crawler-Entwicklung.

Der Fluss ist so

Implementierung

conftest.py


import pytest
from http.server import (
    HTTPServer as SuperHTTPServer,
    SimpleHTTPRequestHandler
)
import threading


class HTTPServer(SuperHTTPServer):
    """
Klasse für Wrapper zum Ausführen von Simple HTTP Server mit Thread.
    Ctrl +Nur Thread bleibt tot, wenn er mit C beendet wird.
Tastaturunterbrechungsdurchläufe.
    """
    def run(self):
        try:
            self.serve_forever()
        except KeyboardInterrupt:
            pass
        finally:
            self.server_close()


@pytest.fixture()
def http_server():
    host, port = '127.0.0.1', 8888
    url = f'http://{host}:{port}/index.html'
    # serve_Laufen Sie für immer unter Faden
    server = HTTPServer((host, port), SimpleHTTPRequestHandler)
    thread = threading.Thread(None, server.run)
    thread.start()
    yield url  #Übergang zum Test hier
    #Gewinde beenden
    server.shutdown()
    thread.join()

Übertragen Sie die Steuerung mit der Anweisung "Yield" an die Testfunktion. Das "setUp" und das "tearDown" im Unit-Test stehen vor bzw. nach der "Yield" -Anweisung.

Platzieren Sie den Inhalt im Ausführungsverzeichnis.

index.html


<html>Hello pytest!</html>

Verwenden Sie das Gerät (http_server) in der Testfunktion

test_httpserver.py


import requests


def test_index(http_server):
    url = http_server
    response = requests.get(url)
    assert response.text == '<html>Hello pytest!</html>'

Ausführungsergebnis

$ pytest --setup-show test_httpserver.py
========================================= test session starts =========================================platform linux -- Python 3.8.1, pytest-5.3.3, py-1.8.1, pluggy-0.13.1
rootdir: /home/skokado/workspace/sandbox
collected 1 item

test_httpserver.py
        SETUP    F http_server
        test_httpserver.py::test_index (fixtures used: http_server).
        TEARDOWN F http_server

========================================== 1 passed in 0.60s ==========================================

Die Gerätegenerierung kann mit der Option "--setup-show" verfolgt werden. Sie können sehen, dass die Funktion test_index das Gerät http_server verwendet.

Andere

Bankushi (@vaaaaanquish) habe ich als Referenz verwendet.

Referenz- Schreiben Sie einen Unit-Test für Web-Scraping mit http.server in Python

Recommended Posts

Starten Sie einen temporären http-Server lokal mit Pytest
Starten Sie mit Docker einen einfachen Python-Webserver
Erstellen Sie mit Docker eine CentOS Linux 8-Umgebung und starten Sie Apache HTTP Server
Erstellen Sie in Tornado einen HTTP-Server (Hello World)
Einfacher HTTP-Server mit Python
Erstellen eines Flask-Servers mit Docker
Richten Sie mit Docker einen Samba-Server ein
Erstellen Sie einen lokalen Server mit einem einzeiligen Befehl [Mac]
Richten Sie einen einfachen HTTPS-Server mit Asyncio ein
Richten Sie einen lokalen Server mit Go-File-Upload ein.
Starten Sie Django in einer virtuellen Umgebung mit Pipenv
Spielen Sie den Server mit zwei PCs
Starten Sie einen Prozess mit einer Planungsrichtlinie unter Linux
Richten Sie einen lokalen Server mit Go-File-Download ein.
Starten Sie einen Webserver mit Python und Flask
Hängen Sie das Verzeichnis eines anderen Servers mit sshfs ein
Laden Sie lokal erstellte Pakete mit Go Module
[Mac] Ich möchte einen einfachen HTTP-Server erstellen, auf dem CGI mit Python ausgeführt wird
Ich habe mit Play with Docker einen gebrauchsfertigen Syslog-Server erstellt
Ein Server, der POST-Daten mit flask / python wiedergibt
Erstellen Sie einen Home Music Server mit Centos8 + Universal Media Server
Erstellen Sie einen Webserver in der Sprache Go (net / http) (1)
Erstellen Sie mit Quarry einen gefälschten Minecraft-Server in Python
[Vagrant] Richten Sie einen einfachen API-Server mit Python ein