Zum Inhalt

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.