Prüfzeiten¶
Bei der Softwareentwicklung geht es meistens nicht darum, neuen Code zu schreiben, sondern bestehenden Code zu ändern. Es ist ein wichtiger Teil des Softwareentwicklungsprozesses, sicherzustellen, dass der bestehende Code weiterhin so funktioniert, wie wir es erwarten. Eine Möglichkeit, das Verhalten unserer App sicherzustellen, ist eine Testsuite.
Testlauf durchführen¶
Es stellt sich heraus, dass das Projekt aus dem Kern-Tutorial bereits über eine
Testsuite verfügt! Als wir unser Projekt ursprünglich erstellt haben, wurden
zwei Verzeichnisse auf oberster Ebene generiert: src und tests. Der Ordner
src enthält den Code für unsere App, der Ordner tests enthält unsere
Testsuite. Im Ordner tests befindet sich eine Datei namens test_app.py mit
folgendem Inhalt:
def test_first():
"""Ein erster Test für die App"""
assert 1 + 1 == 2
Dies ist ein Pytest Testfall – ein Code-Block, der ausgeführt werden kann, um bestimmte Verhaltensweisen Ihrer App zu überprüfen. In diesem Fall ist der Test ein Platzhalter und testet nichts an unserer App – aber es ist ein Test, den wir durchführen können.
Wir können diese Testsuite mit der Option --test für briefcase dev
ausführen. Da dies das erste Mal ist, dass wir Tests ausführen, müssen wir auch
die Option -r übergeben, um sicherzustellen, dass die Testanforderungen auch
installiert werden:
(beeware-venv) $ briefcase dev --test -r
[helloworld] Anforderungen werden installiert...
...
Entwicklungsanforderungen werden installiert... fertig
[helloworld] Testsuite wird in der Entwicklungsumgebung ausgeführt...
===========================================================================
============================= Testsitzung beginnt ==============================
Plattform darwin -- Python 3.11.0, pytest-7.2.0, pluggy-1.0.0 -- /Users/brutus/beeware-tutorial/beeware-venv/bin/python3.11
cachedir: /var/folders/b_/khqk71xd45d049kxc_59ltp80000gn/T/.pytest_cache
rootdir: /Users/brutus
plugins: anyio-3.6.2
Sammeln ... 1 Element gesammelt
tests/test_app.py::test_first BESTANDEN [100 %]
============================== 1 bestanden in 0,01 s ===============================
(beeware-venv) $ briefcase dev --test -r
[helloworld] Anforderungen werden installiert...
...
Installiere Entwicklungsvoraussetzungen... fertig
[helloworld] Führe Testsuite in der Entwicklungsumgebung aus...
===========================================================================
============================= Testsitzung beginnt ==============================
Plattform Linux -- Python 3.11.0
pytest==7.2.0
py==1.11.0
pluggy==1.0.0
cachedir: /tmp/.pytest_cache
rootdir: /home/brutus
plugins: anyio-3.6.2
Sammeln ... 1 Element gesammelt
tests/test_app.py::test_first BESTANDEN [100%]
============================== 1 bestanden in 0,01 s ===============================
(beeware-venv) C:\...>briefcase dev --test -r
[helloworld] Anforderungen werden installiert...
...
Entwicklungsanforderungen werden installiert... fertig
[helloworld] Testsuite wird in der Entwicklungsumgebung ausgeführt...
===========================================================================
============================= Testsitzung beginnt ==============================
Plattform win32 -- Python 3.11.0
pytest==7.2.0
py==1.11.0
pluggy==1.0.0
cachedir: C:\Users\brutus\AppData\Local\Temp\.pytest_cache
rootdir: C:\Users\brutus
plugins: anyio-3.6.2
Sammeln ... 1 Element gesammelt
tests/test_app.py::test_first BESTANDEN [100%]
============================== 1 bestanden in 0,01 s ===============================
Erfolgreich! Wir haben soeben einen einzigen Test durchgeführt, der bestätigt, dass die Python-Mathematik so funktioniert, wie wir es erwartet haben (was für eine Erleichterung!).
Lassen Sie uns diesen Platzhaltertest durch einen Test ersetzen, der überprüft,
ob sich unsere Methode Gruß() so verhält, wie wir es erwarten. Ersetzen Sie
den Inhalt von test_app.py durch den folgenden:
from helloworld.app import greeting
def test_name():
"""Wenn ein Name angegeben wird, enthält die Begrüßung den Namen"""
assert greeting("Alice") == "Hallo, Alice"
def test_empty():
"""Wenn kein Name angegeben wird, wird eine allgemeine Begrüßung ausgegeben"""
assert greeting("") == "Hallo, Fremder"
Dies definiert zwei neue Tests, die beiden erwarteten Verhaltensweisen überprüfen: die Ausgabe, wenn ein Name angegeben wird, und die Ausgabe, wenn der Name leer ist.
Wir können nun die Testsuite erneut ausführen. Diesmal brauchen wir die Option
-r nicht, da die Testanforderungen bereits installiert wurden; wir müssen nur
die Option --test verwenden:
(beeware-venv) $ briefcase dev --test
[helloworld] Testsuite in der Entwicklungsumgebung wird ausgeführt...
===========================================================================
============================= Testsitzung beginnt ==============================
...
Sammeln ... 2 Elemente gesammelt
tests/test_app.py::test_name BESTANDEN [ 50%]
tests/test_app.py::test_empty BESTANDEN [100%]
============================== 2 bestanden in 0,11 s ===============================
(beeware-venv) $ briefcase dev --test
[helloworld] Testsuite in der Entwicklungsumgebung wird ausgeführt...
===========================================================================
============================= Testsitzung beginnt ==============================
...
Sammeln ... 2 Elemente gesammelt
tests/test_app.py::test_name BESTANDEN [ 50%]
tests/test_app.py::test_empty BESTANDEN [100%]
============================== 2 bestanden in 0,11 s ===============================
(beeware-venv) C:\...>briefcase dev --test
[helloworld] Testsuite in der Entwicklungsumgebung wird ausgeführt...
===========================================================================
============================= Testsitzung beginnt ==============================
...
Sammeln ... 2 Elemente gesammelt
tests/test_app.py::test_name BESTANDEN [ 50%]
tests/test_app.py::test_empty BESTANDEN [100%]
============================== 2 bestanden in 0,11 s ===============================
Ausgezeichnet! Unsere Utility-Methode Gruß() funktioniert wie erwartet.
Testgetriebene Entwicklung¶
Jetzt, da wir eine Test-Suite haben, können wir sie nutzen, um die Entwicklung
neuer Funktionen voranzutreiben. Ändern wir unsere Anwendung, um eine spezielle
Begrüßung für einen bestimmten Benutzer zu erhalten. Wir können damit beginnen,
indem wir einen Testfall für das neue Verhalten, das wir gerne sehen möchten, am
Ende von test_app.py hinzufügen:
def test_brutus():
"""Wenn der Name Brutus lautet, wird eine spezielle Begrüßung ausgegeben"""
assert greeting("Brutus") == "Hütet euch vor den IDEs von Python!"
Führen Sie dann die Testsuite mit diesem neuen Test aus:
(beeware-venv) $ briefcase dev --test
[helloworld] Testsuite in der Entwicklungsumgebung ausführen...
===========================================================================
============================= Testsitzung beginnt ==============================
...
Datensammlung ... 3 Elemente gesammelt
tests/test_app.py::test_name BESTANDEN [ 33%]
tests/test_app.py::test_empty BESTANDEN [ 66%]
tests/test_app.py::test_brutus FEHLGESCHLAGEN [100%]
=================================== FEHLER ===================================
_________________________________ test_brutus __________________________________
def test_brutus():
"""Wenn der Name Brutus lautet, wird eine spezielle Begrüßung ausgegeben"""
> assert greeting("Brutus") == "BeeWare the IDEs of Python!"
E AssertionError: assert 'Hello, Brutus' == 'BeeWare the IDEs of Python!'
E - BeeWare the IDEs of Python!
E + Hallo, Brutus
tests/test_app.py:19: AssertionError
=========================== Kurze Testzusammenfassung ============================
FEHLGESCHLAGEN tests/test_app.py::test_brutus - AssertionError: assert 'Hallo, Brutus...
========================= 1 fehlgeschlagen, 2 bestanden in 0,14 s ==========================
(beeware-venv) $ briefcase dev --test
[helloworld] Testsuite in der Entwicklungsumgebung ausführen...
===========================================================================
============================= Testsitzung beginnt ==============================
...
Sammeln ... 3 Elemente gesammelt
tests/test_app.py::test_name BESTANDEN [ 33%]
tests/test_app.py::test_empty BESTANDEN [ 66%]
tests/test_app.py::test_brutus FEHLGESCHLAGEN [100%]
=================================== FEHLER ===================================
_________________________________ test_brutus __________________________________
def test_brutus():
"""Wenn der Name Brutus lautet, gib eine spezielle Begrüßung aus"""
> assert greeting("Brutus") == "BeeWare the IDEs of Python!"
E AssertionError: assert 'Hello, Brutus' == 'BeeWare the IDEs of Python!'
E - BeeWare the IDEs of Python!
E + Hello, Brutus
tests/test_app.py:19: AssertionError
=========================== Kurze Testzusammenfassung ============================
FEHLGESCHLAGEN tests/test_app.py::test_brutus - AssertionError: assert 'Hello, Brutus...
========================= 1 fehlgeschlagen, 2 bestanden in 0,14 s ==========================
============================== 2 bestanden in 0,11 s ===============================
(beeware-venv) C:\...>briefcase dev --test
[helloworld] Testsuite in der Entwicklungsumgebung ausführen...
===========================================================================
============================= Testsitzung beginnt ==============================
...
Datensammlung ... 3 Elemente gesammelt
tests/test_app.py::test_name BESTANDEN [ 33%]
tests/test_app.py::test_empty BESTANDEN [ 66 %]
tests/test_app.py::test_brutus FEHLGESCHLAGEN [100 %]
=================================== FEHLER ===================================
_________________________________ test_brutus __________________________________
def test_brutus():
"""Wenn der Name Brutus ist, gib eine spezielle Begrüßung aus"""
> assert greeting("Brutus") == "BeeWare the IDEs of Python!"
E AssertionError: assert 'Hello, Brutus' == 'BeeWare the IDEs of Python!'
E - BeeWare the IDEs of Python!
E + Hallo, Brutus
tests/test_app.py:19: AssertionError
=========================== Kurze Testzusammenfassung ============================
FEHLGESCHLAGEN tests/test_app.py::test_brutus - AssertionError: assert 'Hallo, Brutus...
========================= 1 fehlgeschlagen, 2 bestanden in 0,14 s ==========================
Dieses Mal sehen wir einen Testfehler - und die Ausgabe erklärt die Quelle des
Fehlers: der Test erwartet die Ausgabe "BeeWare the IDEs of Python!", aber
unsere Implementierung von Gruß() gibt "Hallo, Brutus" zurück. Ändern wir die
Implementierung von Gruß() in src/helloworld/app.py, um das neue Verhalten
zu erhalten:
def greeting(name):
if name:
if name == "Brutus":
return "Hütet euch vor den IDEs von Python!"
else:
return f"Hallo, {name}"
else:
return "Hallo, Fremder"
Wenn wir die Tests noch einmal durchführen, sehen wir, dass die Tests bestanden wurden:
(beeware-venv) $ briefcase dev --test
[helloworld] Testsuite in der Entwicklungsumgebung ausführen...
===========================================================================
============================= Testsitzung beginnt ==============================
...
Datensammlung ... 3 Elemente gesammelt
tests/test_app.py::test_name BESTANDEN [ 33%]
tests/test_app.py::test_empty BESTANDEN [ 66 %]
tests/test_app.py::test_brutus BESTANDEN [100 %]
============================== 3 bestanden in 0,15 s ===============================
(beeware-venv) $ briefcase dev --test
[helloworld] Testsuite in der Entwicklungsumgebung ausführen...
===========================================================================
============================= Testsitzung beginnt ==============================
...
Datensammlung ... 3 Elemente gesammelt
tests/test_app.py::test_name BESTANDEN [ 33%]
tests/test_app.py::test_empty BESTANDEN [ 66 %]
tests/test_app.py::test_brutus BESTANDEN [100 %]
============================== 3 bestanden in 0,15 s ===============================
(beeware-venv) C:\...>briefcase dev --test
[helloworld] Testsuite in der Entwicklungsumgebung ausführen...
===========================================================================
============================= Testsitzung beginnt ==============================
...
Datensammlung ... 3 Elemente gesammelt
tests/test_app.py::test_name BESTANDEN [ 33%]
tests/test_app.py::test_empty BESTANDEN [ 66 %]
tests/test_app.py::test_brutus BESTANDEN [100 %]
============================== 3 bestanden in 0,15 s ===============================
Laufzeittests¶
Bislang haben wir die Tests im Entwicklungsmodus ausgeführt. Dies ist besonders nützlich, wenn Sie neue Funktionen entwickeln, da Sie schnell Tests und Code hinzufügen können, damit diese Tests erfolgreich sind. Irgendwann werden Sie jedoch sicherstellen wollen, dass Ihr Code auch als Anwendungspaket korrekt ausgeführt wird.
Die Optionen --test und -r können auch an den Befehl run übergeben werden.
Wenn Sie briefcase run --test -r verwenden, wird die gleiche Testsuite
ausgeführt, allerdings innerhalb des Anwendungspakets und nicht in Ihrer
Entwicklungsumgebung:
(beeware-venv) $ briefcase run --test -r
[helloworld] Anwendungscode wird aktualisiert...
Installation von src/helloworld... fertig
Installation der Tests... fertig
[helloworld] Aktualisierung der Anforderungen...
...
[helloworld] Erstellen von build/helloworld/macos/app/Hello World.app (Testmodus)
[helloworld] Starten der Testsuite...
===========================================================================
Konfiguration der isolierten Python-Umgebung...
Python-Laufzeitumgebung wird vorinitialisiert...
PythonHome: /Users/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contents/Resources/support/python-stdlib
PYTHONPATH:
- /Users/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contents/Resources/support/python311.zip
- /Users/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contents/Resources/support/python-stdlib
- /Users/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contents/Resources/support/python-stdlib/lib-dynload
- /Users/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contents/Resources/app_packages
- /Benutzer/brutus/beeware-tutorial/helloworld/macOS/app/Hello World/Hello World.app/Contents/Resources/app
argc/argv konfigurieren...
Python-Laufzeitumgebung initialisieren...
Python-NSLog-Handler wird installiert...
App-Modul wird ausgeführt: tests.helloworld
---------------------------------------------------------------------------
============================= Testsitzung beginnt ==============================
...
Sammeln ... 3 Elemente gesammelt
tests/test_app.py::test_name BESTANDEN [ 33%]
tests/test_app.py::test_empty BESTANDEN [ 66%]
tests/test_app.py::test_brutus BESTANDEN [100%]
============================== 3 bestanden in 0,21 s ===============================
[helloworld] Testsuite bestanden!
(beeware-venv) $ briefcase run --test -r
[helloworld] Anwendungskonfiguration wird fertiggestellt...
Zielplattform: ubuntu:jammy (Vendor-Base-Debian)
Glibc-Version wird ermittelt... fertig
Glibc 2.35 wird verwendet
Python 3.10 wird verwendet
[helloworld] Anwendungscode wird aktualisiert...
Installiere src/helloworld... fertig
Installiere Tests... fertig
[helloworld] Aktualisiere Anforderungen...
...
[helloworld] Erstellte build/helloworld/linux/ubuntu/jammy/helloworld-0.0.1/usr/bin/helloworld (Testmodus)
[helloworld] Testsuite wird gestartet...
===========================================================================
============================= Testsitzung beginnt ==============================
...
Sammeln ... 3 Elemente gesammelt
tests/test_app.py::test_name BESTANDEN [ 33 %]
tests/test_app.py::test_empty BESTANDEN [ 66 %]
tests/test_app.py::test_brutus BESTANDEN [100 %]
============================== 3 bestanden in 0,21 s ===============================
(beeware-venv) C:\...>briefcase run --test -r
[helloworld] Anwendungscode wird aktualisiert...
Installation von src/helloworld... fertig
Installation der Tests... fertig
[helloworld] Anforderungen werden aktualisiert...
...
[helloworld] Erstellte build\helloworld\windows\app\src\Hello World.exe (Testmodus)
===========================================================================
Protokoll gestartet: 02.12.2022 10:57:34Z
Vorinitialisierung der Python-Laufzeitumgebung...
PythonHome: C:\Users\brutus\beeware-tutorial\helloworld\windows\app\Hello World\src
PYTHONPATH:
- C:\Users\brutus\beeware-tutorial\helloworld\windows\app\Hello World\src\python311.zip
- C:\Users\brutus\beeware-tutorial\helloworld\windows\app\Hello World\src
- C:\Users\brutus\beeware-tutorial\helloworld\windows\app\Hello World\src\app_packages
- C:\Users\brutus\beeware-tutorial\helloworld\windows\app\Hello World\src\app
Konfiguriere argc/argv...
Initialisiere Python-Laufzeitumgebung...
Führe App-Modul aus: tests.helloworld
---------------------------------------------------------------------------
============================= Testsitzung beginnt ==============================
...
Sammeln ... 3 Elemente gesammelt
tests/test_app.py::test_name BESTANDEN [ 33%]
tests/test_app.py::test_empty BESTANDEN [ 66%]
tests/test_app.py::test_brutus BESTANDEN [100%]
============================== 3 bestanden in 0,21 s ===============================
Wie bei briefcase dev --test wird die Option -r nur bei der ersten
Ausführung der Testsuite benötigt, um sicherzustellen, dass die
Testabhängigkeiten vorhanden sind. Bei späteren Durchläufen können Sie diese
Option weglassen.
Sie können auch die Option --test auf mobilen Backends verwenden: - so
funktionieren briefcase run iOS --test und briefcase run android --test, die
Testsuite auf dem von Ihnen ausgewählten mobilen Gerät ausführen.