Flask-Unit-Tests mit Pytest und Coverage

Beginner

This tutorial is from open-source community. Access the source code

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.