Skip to content

kl290/WA7

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Unit Tests in Python mit pytest & unittest

| Author: Kevin Lehmann |
| Aufgabe: (Wochen)Aufgabe 7 "Modularisierung"|

08.01.-10.01.2025: Erste Schritte mit pytest

Grundlagen

Erster Test mit pytest:

# Funktion
def add(a, b):
    return a + b

# Testfunktion
def test_add():
    assert add(1, 2) == 3
    assert add(-1, 1) == 0
    assert add(-1, -1) == -2

Ausführung im Terminal:

pytest test_math.py

Ergebnis:

collected 1 item
Unittest/test_math.py .
[100%]
1 passed in 0.09s

Erklärung der Ausgabe

  • 1 passed in 0.09s: Ein Test wurde erfolgreich durchgeführt.

  • . (Punkt): Bedeutet, dass der Test fehlerfrei durchgelaufen ist.

  • collected 1 item: Ein Test wurde erfasst und ausgeführt.


Zweite Übung: Test bei falscher Implementierung

Was passiert, wenn die Funktion verändert wird?

def add(a, b):
    return a - b

Testausgabe:

E       assert -1 == 3
E        +  where -1 = add(1, 2)
1 failed in 0.10s

Erklärung der Fehlermeldung

  • E assert -1 == 3: Der Test erwartete 3, aber die Funktion gab -1 zurück.

  • 1 failed in 0.10s: Ein Test schlug fehl.


Dritte Übung: Test auf ValueError (z. B. Division durch Null)

Funktion:

def divide(a, b):
    if b == 0:
        raise ValueError("Division durch Null ist nicht erlaubt")
    return a / b

Testfunktion:

import pytest
from test_div import divide

def test_divide():
    with pytest.raises(ValueError):
        divide(1, 0)

Ausführung:

pytest test_divide.py

Ergebnis:

collected 1 item
Unittest_divide.py .
1 passed in 0.06s

13.01.-15.01.2025: Unittests mit unittest

Test für eine Eingabefunktion

Funktion:

def eingabe_zahl(prompt):
    while True:
        try:
            return float(input(prompt))
        except ValueError:
            print("Ungültige Eingabe. Bitte eine gültige Zahl eingeben!")

Test mit unittest:

import unittest
from unittest.mock import patch
from eingabe import eingabe_zahl

class TestEingabeZahl(unittest.TestCase):

    @patch('builtins.input', return_value='5')
    def test_gueltige_eingabe(self, mock_input):
        result = eingabe_zahl("Gib eine Zahl ein: ")
        self.assertEqual(result, 5.0)

    @patch('builtins.input', side_effect=['abc', '3.14'])
    def test_ungueltige_eingabe(self, mock_input):
        result = eingabe_zahl("Gib eine Zahl ein: ")
        self.assertEqual(result, 3.14)

if __name__ == '__main__':
    unittest.main()

Erklärung: - @patch('builtins.input', return_value='5'): Simuliert eine Eingabe von 5. - side_effect=['abc', '3.14']: Erst eine falsche Eingabe (abc), dann eine richtige (3.14). - assertEqual(result, 3.14): Prüft, ob die Funktion korrekt auf ungültige Eingaben reagiert.

Unittest ausführen:

python3 -m unittest test_eingabe.py

12.03.-14.03.2025: Erweiterung der Eingabefunktion

Eingabe mit Bereichsprüfung (Range) und Datentypwahl

Erweiterte Funktion:

def eingabe_zahl(prompt, min_val = None, max_val = None, return_type = float):
    while True:
        eingabe = input(prompt)

        try:
            zahl = return_type(eingabe)

            if min_val is not None and zahl < min_val:
                print(f"Die Zahl muss mindestens {min_val} sein!")
                continue

            if max_val is not None and zahl > max_val:
                print(f"Die Zahl darf höchstens {max_val} sein!")
                continue

            return zahl

        except (ValueError, TypeError):
            print(f"Ungültige Eingabe '{eingabe}'. Bitte eine gültige Zahl eingeben!")

Parametererklärung

  • min_val=None, max_val=None: Optional, um einen Wertebereich zu definieren.

  • return_type=float: Ermöglicht die Wahl zwischen Ganzzahlen (int) und Fließkommazahlen (float).

  • Eingabeprüfung:

  • Gibt eine Fehlermeldung aus, wenn der Wert außerhalb des definierten Bereichs liegt.

  • Wiederholt die Eingabeaufforderung, falls eine falsche Eingabe gemacht wird.


Tests ausführen

Unittests im Terminal:

python3 test_eingabe.py

Pytest im Terminal:

pytest test_eingabe.py

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages