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.
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.
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
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()
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
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.
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 () ``
.
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()
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
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.
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.
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