Einführung
In diesem Lab werden wir lernen, wie man Unit-Tests für eine Flask-Anwendung schreibt. Wir werden pytest und coverage verwenden, um unseren Code zu testen und zu messen. Am Ende dieses Labs werden Sie verstehen, wie Sie sicherstellen können, dass Ihre Anwendung wie erwartet funktioniert, und welche Bereiche Verbesserungen benötigen.
Hinweis: Sie müssen die Code-Datei selbst erstellen und in der Umgebung ausführen. Sie können den Status des Flask-Diensts auf Web 5000 vorab anzeigen.
Installiere Pytest und Coverage
Zunächst müssen wir pytest und coverage installieren. Dies sind jeweils Werkzeuge zum Testen und zur Code-Messung. Führen Sie im Terminal den folgenden Befehl aus, um sie zu installieren:
pip install pytest coverage
Setup und Fixtures
Als nächstes werden wir Test-Fixtures in einer Datei namens conftest.py einrichten. Eine Fixture ist eine Funktion, die vor jeder Testfunktion ausgeführt wird, auf die sie angewendet wird.
In diesem Schritt werden wir eine temporäre Datenbank erstellen und sie mit einigen Daten für das Testing befüllen.
Hier ist der Code, den Sie in tests/conftest.py hinzufügen sollten:
## tests/conftest.py
import os
import tempfile
import pytest
from flaskr import create_app
from flaskr.db import get_db, init_db
with open(os.path.join(os.path.dirname(__file__), 'data.sql'), 'rb') as f:
_data_sql = f.read().decode('utf8')
@pytest.fixture
def app():
db_fd, db_path = tempfile.mkstemp()
app = create_app({
'TESTING': True,
'DATABASE': db_path,
})
with app.app_context():
init_db()
get_db().executescript(_data_sql)
yield app
os.close(db_fd)
os.unlink(db_path)
@pytest.fixture
def client(app):
return app.test_client()
@pytest.fixture
def runner(app):
return app.test_cli_runner()
Schreibe Tests für die Factory
Als nächstes werden wir Tests für die Factory-Funktion schreiben, die für das Erstellen der Flask-Anwendung verantwortlich ist. Diese Tests gewährleisten, dass die Anwendung sich gemäß der übergebenen Konfiguration so verhält, wie erwartet.
Hier ist der Code, den Sie in tests/test_factory.py hinzufügen sollten:
## tests/test_factory.py
from flaskr import create_app
def test_config():
assert not create_app().testing
assert create_app({'TESTING': True}).testing
def test_hello(client):
response = client.get('/hello')
assert response.data == b'Hello, World!'
Teste die Datenbankverbindung
Nachdem wir die Factory getestet haben, werden wir die Datenbankverbindung testen. Diese Tests gewährleisten, dass die Datenbankverbindung wie erwartet hergestellt und geschlossen wird.
Hier ist der Code, den Sie in tests/test_db.py hinzufügen sollten:
## tests/test_db.py
import sqlite3
import pytest
from flaskr.db import get_db
def test_get_close_db(app):
with app.app_context():
db = get_db()
assert db is get_db()
with pytest.raises(sqlite3.ProgrammingError) as e:
db.execute('SELECT 1')
assert 'closed' in str(e.value)
Teste die Authentifizierung
Als nächstes werden wir Tests für die Benutzerauthentifizierung schreiben. Diese Tests gewährleisten, dass Benutzer sich wie erwartet einloggen und ausloggen können und dass bei Bedarf entsprechende Fehlermeldungen angezeigt werden.
Hier ist der Code, den Sie in tests/test_auth.py hinzufügen sollten:
## tests/test_auth.py
import pytest
from flask import g, session
from flaskr.db import get_db
def test_login(client, auth):
assert client.get('/auth/login').status_code == 200
response = auth.login()
assert response.headers["Location"] == "/"
with client:
client.get('/')
assert session['user_id'] == 1
assert g.user['username'] == 'test'
Teste Blog-Beiträge
Schließlich werden wir Tests für Blog-Beiträge schreiben. Diese Tests gewährleisten, dass Benutzer Blog-Beiträge wie erwartet erstellen, aktualisieren und löschen können.
Hier ist der Code, den Sie in tests/test_blog.py hinzufügen sollten:
## tests/test_blog.py
import pytest
from flaskr.db import get_db
def test_create(client, auth, app):
auth.login()
assert client.get('/create').status_code == 200
client.post('/create', data={'title': 'created', 'body': ''})
with app.app_context():
db = get_db()
count = db.execute('SELECT COUNT(id) FROM post').fetchone()[0]
assert count == 2
Führe die Tests aus
Jetzt, nachdem wir unsere Tests geschrieben haben, können wir sie mit dem Befehl pytest ausführen:
pytest
Um die Codeabdeckung Ihrer Tests zu messen, verwenden Sie den Befehl coverage, um pytest auszuführen:
coverage run -m pytest
Sie können einen einfachen Codeabdeckungsbericht in der Konsole mit dem folgenden Befehl anzeigen:
coverage report
Zusammenfassung
In diesem Lab haben wir gelernt, wie man mit pytest und coverage Unit-Tests für eine Flask-Anwendung schreibt. Diese Tools helfen uns sicherzustellen, dass unsere Anwendung wie erwartet funktioniert und uns Bereiche identifizieren, die Verbesserungen benötigen. Das Schreiben von Tests für Ihren Code ist eine gute Praxis, da es Ihnen hilft, Fehler zu entdecken, bevor sie zu einem Problem werden.