Unit-Tests und Validierung

Skip to content

Dies ist ein maschinell übersetzter Text, der Fehler enthalten kann!

Nun, da wir Klassen erstellt und mit der Validierung gearbeitet haben, haben wir eine gute Grundlage, um mit dem Testen zu beginnen. Testing ist ein wichtiger Teil des Entwicklungsprozesses und hilft uns, sicherzustellen, dass unser Code wie erwartet funktioniert.

Denn wie können wir sicher sein, dass der Code wie vorgesehen funktioniert, wenn wir ihn nicht testen?

Was ist Unit Testing?

Unit Testing ist eine Methode, um kleine Teile unseres Codes automatisch und systematisch zu testen. In Python verwenden wir ein Modul namens pytest, um Tests zu schreiben und auszuführen. Eine “Unit” ist der kleinste testbare Teil einer Anwendung, oft eine einzelne Funktion oder Methode. Wenn wir pytest verwenden, ist es wichtig, dass wir die richtigen Namenskonventionen befolgen, damit pytest unsere Tests finden kann, wie z. B. das Benennen von Testdateien mit test_ davor und Testfunktionen mit test_ davor.

Beispiel für einen Unit Test:

def test_add():
    # Sjekker om addisjon fungerer som forventet.
    # Überprüft, ob die Addition wie erwartet funktioniert.
    assert 0.3 + 0.3 + 0.3 == 0.9

Wird ausgeführt, indem man pytest im Terminal eingibt.

Fun fact

Der obige Code wird fehlschlagen, da .3+.3+.3 in Python zu 0.8999999999 wird!

Easy Aufgabe 1 - Installieren Sie pytest

Installieren Sie pytest in Ihrer virtuellen Umgebung. Dies geschieht durch Ausführen des folgenden Befehls im Terminal:

pip install pytest
# Installer pytest - Testrammeverk
# Installiert pytest - Testframework

Easy Aufgabe 2 - Erstelle einen Test

Erstelle eine neue Datei in deinem Projektordner mit dem Namen test_data.py. In dieser Datei sollst du einen Test für die Person Klasse erstellen, die du im vorherigen Modul erstellt hast. Der Test soll überprüfen, ob eine Person mit gültigen Werten erstellt werden kann.

Beispiel, wie der Test aussehen könnte:

from main import Person

def test_person_working():
    bob_kaare = Person(name="Bob Kåre",
                       eye_color=EyeColor.BLUE,
                       phone_number=PhoneNumber("12345678"),
                       email=Email("bob_kaare@example.com"))
    assert bob_kaare.name == "Bob Kåre" # Sjekker at navnet er korrekt. -> Überprüft, ob der Name korrekt ist.
    assert bob_kaare.eye_color == EyeColor.BLUE # Sjekker at øyenfargen er korrekt. -> Überprüft, ob die Augenfarbe korrekt ist.

Diese Art von Test wird als “Happy-Path”-Test bezeichnet, da wir testen, ob alles wie erwartet funktioniert, wenn wir gültige Werte eingeben, und ist nicht besonders nützlich.

Medium Aufgabe 3 - Testvalidierung

Erstellen Sie weitere Tests in test_person.py, die überprüfen, ob die Validierung in Email und PhoneNumber wie erwartet funktioniert. Testen Sie sowohl gültige als auch ungültige Werte. Hier müssen Sie eine Funktion in pytest verwenden, die raises heißt, die prüft, ob ein bestimmter Fehler ausgelöst wird.

import pytest

def test_exception():
    with pytest.raises(KeyError):
        my_dict = {"a": 1, "b": 2}
        value = my_dict["c"]  # Dies wird eine KeyError auslösen

Tip

Sie können so viele Funktionen erstellen, wie Sie möchten, solange der Funktionsname mit test_ beginnt.

Lösung: Beispiel für einen Test für ungültige E-Mail
from main import Email

import pytest

def test_invalid_email():
    with pytest.raises(ValueError):
        email = Email("not-an-email")

Warum das tun?

Durch gute Tests für unseren Code können wir sicherstellen, dass er wie erwartet funktioniert, und wir können leicht herausfinden, ob bei Änderungen am Code etwas schief gelaufen ist. Dies ist besonders wichtig in größeren Projekten, in denen viele Entwickler zusammenarbeiten und es leicht ist, Fehler zu machen.

Durch die Verwendung von Software wie Jest oder Selenium kann man beispielsweise Webseiten automatisch testen und so sicherstellen, dass alles nach jeder Codeänderung wie erwartet funktioniert. Wir möchten ja gerne wissen, dass “Benutzerregistrierung”, “Zahlung” und “Anmeldung” wie erwartet funktionieren, oder?

Denken Sie über die folgenden Szenarien nach

Was passiert (oder sollte passieren), wenn..:

  • Ein Benutzer versucht, sich mit einer E-Mail-Adresse zu registrieren, die bereits verwendet wird?
  • Ein Benutzer ein zukünftiges Geburtsdatum hat?
  • Ein Benutzer den Namen “jOHN dOE” eingibt?

A software tester walks into a bar...

Hard Aufgabe 4 - Automatisiertes Testen (CI)

Wenn wir Code auf GitHub veröffentlichen, können wir etwas namens GitHub Actions einrichten, das unsere Tests automatisch jedes Mal ausführt, wenn wir eine Änderung am Code vornehmen. Dies wird als Continuous Integration (CI) bezeichnet und hilft uns sicherzustellen, dass unser Code immer wie erwartet funktioniert.

Erstellen Sie eine Datei in Ihrem Projektordner mit dem Namen .github/workflows/pytest.yml. Fügen Sie in dieser Datei den folgenden Code hinzu:

name: Pytest

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: '3.11'
    - name: Install dependencies
      run: |

        python -m pip install --upgrade pip
        pip install pytest
        # Installiere alle anderen Abhängigkeiten, die dein Projekt benötigt
        pip install -r requirements.txt
    - name: Run tests with pytest
      run: pytest

Wenn du es richtig eingerichtet hast, solltest du jetzt einen neuen Tab in deinem GitHub-Repository sehen, der “Actions” heißt. Dort kannst du sehen, dass deine Tests automatisch ausgeführt werden, jedes Mal wenn du eine Änderung am Code vornimmst, und du wirst benachrichtigt, wenn einer der Tests fehlschlägt (rotes Kreuz und per E-Mail).

Merknad om filstruktur

Die Dateistruktur bestimmt, ob GitHub Actions funktioniert oder nicht. Stellen Sie sicher, dass sich der Ordner .github im Stammverzeichnis Ihres Projekts befindet, ebenso wie ein Ordner tests, in dem sich Ihre Testdateien befinden.

Sie können optional die Datei pytest.yml ändern, um auf das richtige Verzeichnis zu verweisen.

Solche Actions-Dateien können auch verwendet werden, um Ihren Code auf mehreren Versionen von Python oder Betriebssystemen zu testen. Sie können auch verwendet werden, um Ihre Software automatisch zu erstellen und zu veröffentlichen, z. B. eine Website zu veröffentlichen oder eine App im App Store oder Google Play zu aktualisieren.

Code Coverage

Es gibt auch etwas, das als “Code Coverage” bekannt ist, das Ihnen helfen kann, zu sehen, wie viel Ihres Codes tatsächlich getestet wird. Dies kann nützlich sein, um herauszufinden, ob Sie genügend Tests haben, oder ob es Teile Ihres Codes gibt, die überhaupt nicht getestet werden.

Einige Arbeitsplätze verlangen, dass Sie einen bestimmten Prozentsatz Ihres Codes mit Tests abdecken, bevor Sie ihn bereitstellen können, um sicherzustellen, dass der Code robust ist und wie erwartet funktioniert.

Unit Test Meme