[PYTHON] Geben Sie die Pytest-Clean-Parameter für den Test der Kolbeneinheit an

Einführung

Das letzte Mal habe ich Pytest verwendet, um einen Unit-Test des Kolbens durchzuführen. Es wurde jedoch sehr schwer zu erkennen, da ich den Kolben-Client in einer Testfunktion erstellt und getestet habe. Dieses Mal werden wir verschiedene Pytest-Funktionen verwenden, um den Test ein wenig einfacher zu sehen.

Umgebung

Trennung von Test und Vorverarbeitung / Nachbearbeitung

Früher habe ich den Kolben-Client und die Testquelle in einer Funktion kombiniert, aber es wird schwierig zu erkennen, wenn die Anzahl der Testfunktionen zunimmt. Genau genommen ist die Clienterstellung kein Test, daher ist es nicht gut, von Leistungstests und Funktionsergebnissen beeinflusst zu werden. Daher wird das Erstellen / Löschen von Clients vom Testen getrennt.

Quelle getestet werden

Die zu testende Quelle verwendet die Quelle des vorherigen Kolbens.

flask_mod.py


from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/')
def root():
    return "root"

@app.route('/sample/<message>')
def sample(message):
    return 'sample_' + message

Quelle der Vorverarbeitung und Nachbearbeitung

Erstellen Sie Vor- und Nachbearbeitungsfunktionen und registrieren Sie sie mit `@ pytest.fixture `Dekorationen. Dies ist ein Bild, in das die Testfunktion in die Ausbeute dieser Funktion eingebettet ist. Die Vorverarbeitung wird vor der Ausbeute und die Nachbearbeitung nach der Ausbeute beschrieben. In diesem Beispiel wird ein Testclient generiert und als Ergebnis angegeben. Danach wird Löschen verwendet, um den Client zu löschen.

pytest_flask.py


@pytest.fixture
def client():
    app.config['TESTING'] = True
    test_client = app.test_client()
    yield test_client
    test_client.delete()

Testfunktion

Erstellen Sie eine Testfunktion und geben Sie das Argument an, das den angegebenen Wert für die Quelle der Vor- und Nachbearbeitung erhält. Dieses Argument muss denselben Namen haben wie die Vorverarbeitungs- und Nachbearbeitungsfunktionen. Danach wird die Testquelle normal beschrieben. Im Beispiel hat die Funktion `test_flask_simple ()` ein Argument, um den von fixture generierten Client zu empfangen, und get wird zum Testen ausgegeben.

pytest_flask.py


import pytest
from flask_mod import app

@pytest.fixture
def client():
    app.config['TESTING'] = True
    test_client = app.test_client()
    yield test_client
    test_client.delete()


def test_flask_simple(client):
    result = client.get('/')
    assert b'root' == result.data

Ausführungsergebnis

Nachdem Sie die Quelle des Testziels und der Testmethode haben, führen Sie es aus.

PS C:\Users\xxxx\program\python> pytest .\pytest_flask.py
======= test session starts ========  
platform win32 -- Python 3.6.5, pytest-5.3.5, py-1.8.1, pluggy-0.13.1
rootdir: C:\Users\xxxx\program\python\flask
collected 1 item

pytest_flask.py .      [100%]  

======== 1 passed in 0.21s =========  

Wenn Sie sich das Ergebnis ansehen, ist der zuvor erstellte pytest_flask 100% und endet normal. Der Test war in Ordnung und ich konnte den Client mit Fixture erfolgreich erstellen und zerstören.

Verwenden Sie die Testquelle mit mehreren Parametern erneut.

Sie möchten häufig eine Testquelle erstellen und mit verschiedenen Argumenten testen. Registrieren Sie sich in diesem Fall mit dem Argument `param der Dekoration`` @ pytest.fixture () ``.

Definition von Testparametern

Vorverarbeitungs- und Nachbearbeitungsfunktionen `@ pytest.fixture ()` Decorator-Parameter beschreiben die Testparameter in einem Tupellistenformat. Bereiten Sie ein Argument in der Funktion vor, um diese Parameter zu erhalten, und geben Sie param mit Ausbeute an. In diesem Beispiel ist die zu testende Quelle "sample (message)", also definieren wir die Parameter, die dem Kolben zuerst im Taple gegeben werden sollen, und setzen die Antwort in das zweite.

pytest_flask.py


@pytest.fixture(params=[('message', b'sample_message'),('sample', b'sample_sample')])
def client(request):
    app.config['TESTING'] = True
    test_client = app.test_client()
    yield test_client, request.param
    test_client.delete()

Testfunktion

Da der Wert, der durch "Ausbeute" in den Vorverarbeitungs- und Nachverarbeitungsfunktionen gegeben ist, im Argument der Testfunktion als Taple enthalten ist, werden die erforderlichen Elemente extrahiert und verwendet. Im Beispiel enthält das erste Argument im `client `den Client, und das zweite enthält eines der in params angegebenen Tapples. Daher extrahieren wir es und verwenden es für die URL- und Ergebnisbestätigung.

pytest_flask.py


import pytest
from flask_mod import app

@pytest.fixture(params=[('message', b'sample_message'),('sample', b'sample_sample')])
def client(request):
    app.config['TESTING'] = True
    test_client = app.test_client()
    yield test_client, request.param
    test_client.delete()

def test_flask_simple(client):
    test_client = client[0]
    test_param = client[1]
    result = test_client.get('/sample/' + test_param[0])
    assert test_param[1] == result.data

Ausführungsergebnis

Nachdem Sie die Quelle des Testziels und der Testmethode haben, führen Sie es aus.

PS Users\xxxx\program\python>  pytest -v .\pytest_flask.py
======= test session starts ========
platform win32 -- Python 3.6.5, pytest-5.3.5, py-1.8.1, pluggy-0.13.1 -- c:\users\xxxx\appdata\local\programs\python\python36-32\python.exe
cachedir: .pytest_cache
rootdir:  C:\Users\xxxx\program\python\flask
collected 2 items                                                                                                                    

pytest_flask.py::test_flask_simple[client0] PASSED   [ 50%] 
pytest_flask.py::test_flask_simple[client1] PASSED   [100%] 

======== 2 passed in 0.20s ========= 

Wenn Sie sich das Ergebnis ansehen, wird die zuvor erstellte Funktion test_flask_simple zweimal PASSIERT. Dies bedeutet, dass ich zwei Taples in das Gerät gegeben habe, also habe ich es zweimal getestet und beide waren in Ordnung.

Versuchen Sie, einen zu scheitern

Geben Sie nur einem von ihnen einen falschen Wert, um sicherzustellen, dass die Werte ordnungsgemäß übergeben werden.

PS Users\xxxx\program\python>  pytest -v .\pytest_flask.py
======= test session starts ========
platform win32 -- Python 3.6.5, pytest-5.3.5, py-1.8.1, pluggy-0.13.1 -- c:\users\xxxx\appdata\local\programs\python\python36-32\python.exe
cachedir: .pytest_cache
rootdir:  C:\Users\xxxx\program\python\flask
collected 2 items

pytest_flask.py::test_flask_simple[client0] FAILED                 [ 50%]
pytest_flask.py::test_flask_simple[client1] PASSED                 [100%] 

============= FAILURES ============= 
_______ test_flask_simple[client0] _______ 

client = (<FlaskClient <Flask 'flask_mod'>>, ('message', b'sample_detail'))

    def test_flask_simple(client):
        test_client = client[0]
        test_param = client[1]
        result = test_client.get('/sample/' + test_param[0])
>       assert test_param[1] == result.data
E       AssertionError: assert b'sample_detail' == b'sample_message'
E         At index 7 diff: b'd' != b'm'
E         Full diff:
E         - b'sample_detail'
E         + b'sample_message'

pytest_flask.py:17: AssertionError
============= 1 failed, 1 passed in 0.27s =============

Wenn ich einen Wert angegeben habe, bei dem nur einer fehlgeschlagen ist, ist eine der Funktionen fehlgeschlagen und fehlgeschlagen.

abschließend

Der hier zusammengefasste Pytest ist nur ein kleiner Teil der Funktionalität. Darüber hinaus gibt es bequemere Funktionen wie eine Funktion zum automatischen Erstellen einer Kombination von Parametern und eine Funktion zum Speichern von Daten. Wie diesmal jedoch gibt es einige Macken bei der Verwendung, und es kann auf den ersten Blick schwierig sein, sie zu verwenden. Es verfügt jedoch über viele praktische und benutzerfreundliche Funktionen. Je mehr Sie sich daran gewöhnen, desto eher können Sie eine Vielzahl von Tests erstellen. Informationen zum Überprüfen der Abdeckung, die mit Komponententests geliefert wird, finden Sie unter Überprüfen der Python-Abdeckung mit pytest-cov.

Recommended Posts

Geben Sie die Pytest-Clean-Parameter für den Test der Kolbeneinheit an
Ich habe einen Unit-Test für verschiedene Sprachen geschrieben
Geben Sie die Pytest-Clean-Parameter für den Test der Kolbeneinheit an
Python-Unit-Test
So führen Sie einen Komponententest durch Teil 2 Klassendesign zum Testen
Testen Sie den Kolben mit einem Pytest
Abfrageparameter für Flask GET abrufen
Ich habe einen Unit-Test für verschiedene Sprachen geschrieben
Python-Unit-Test
So führen Sie einen Komponententest durch Teil 2 Klassendesign zum Testen