[PYTHON] Démarrez un serveur http temporaire localement avec Pytest

En mettant en place un serveur local lors de l'exécution d'un test unitaire, il est possible d'effectuer des tests qui ne dépendent pas de l'extérieur.

Pratique pour le développement d'API et de robots d'exploration.

Le flux est comme ça

la mise en oeuvre

conftest.py


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


class HTTPServer(SuperHTTPServer):
    """
Classe pour que le wrapper exécute Simple HTTP Server avec Thread.
    Ctrl +Seul Thread reste mort lorsqu'il est terminé par C.
Passes d'interruption de clavier.
    """
    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_Courir pour toujours sous le fil
    server = HTTPServer((host, port), SimpleHTTPRequestHandler)
    thread = threading.Thread(None, server.run)
    thread.start()
    yield url  #Transition à tester ici
    #Filetage final
    server.shutdown()
    thread.join()

Transférez le contrôle vers la fonction de test avec l'instruction yield. Les paramètres «setUp» et «tearDown» dans le test unitaire sont respectivement avant et après l'instruction «yield».

Placez le contenu dans le répertoire d'exécution.

index.html


<html>Hello pytest!</html>

Utilisez fixture (http_server) dans la fonction de test

test_httpserver.py


import requests


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

Résultat d'exécution

$ 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 ==========================================

La génération de projecteurs peut être tracée avec l'option --setup-show. Vous pouvez voir que la fonction test_index utilise le fixture http_server.

Autre

Bankushi (@vaaaaanquish), je l'ai utilisé comme référence.

Référence- Ecrire un test unitaire pour le web scraping en utilisant http.server en Python

Recommended Posts

Démarrez un serveur http temporaire localement avec Pytest
Démarrez un serveur Web Python simple avec Docker
Créez un environnement CentOS Linux 8 avec Docker et démarrez Apache HTTP Server
Créer un serveur "Hello World" (HTTP) dans Tornado
Serveur HTTP facile avec Python
Créer un serveur Flask avec Docker
Configurer un serveur Samba avec Docker
Créer un serveur local avec une commande sur une seule ligne [Mac]
Configurer un serveur HTTPS simple avec asyncio
Configurer un serveur local avec le téléchargement Go-File-
Démarrez Django dans un environnement virtuel à l'aide de Pipenv
Serveur de jeu avec deux PC
Démarrer un processus avec une politique de planification sous Linux
Configurer un serveur local avec le téléchargement Go-File-
Lancer un serveur Web avec Python et Flask
Monter le répertoire d'un autre serveur avec sshfs
Charger les packages créés localement avec le module Go
[Mac] Je souhaite créer un serveur HTTP simple qui exécute CGI avec Python
J'ai créé un serveur syslog prêt à l'emploi avec Play with Docker
Un serveur qui fait écho aux données POSTées avec flask / python
Créez un serveur de musique domestique avec Centos8 + Universal Media Server
Créer un serveur Web en langage Go (net / http) (1)
Créez un faux serveur Minecraft en Python avec Quarry
[Vagrant] Configurer un serveur API simple avec python