Test-Parametrisierung in Pytest: Ausführen von Tests mit Mehreren Eingaben
Parametrisierte Tests sind entscheidend, um die Testabdeckung zu erhöhen, ohne zahlreiche Testfunktionen für Szenarien zu schreiben, die sich nur durch ihre Eingaben und erwarteten Ausgaben unterscheiden. Dieser Ansatz spart nicht nur Zeit, sondern erhöht auch die Übersichtlichkeit und Wartbarkeit von Test-Suiten durch:
- Reduzierung von Code-Duplikation und potenziellen Fehlerquellen im Testcode;
- Ermöglichung der einfachen Hinzufügung neuer Testfälle durch das bloße Hinzufügen von Parametern;
- Erleichterung umfassender Tests über eine breite Palette von Eingabewerten.
Betrachten wir eine einfache Funktion, die den Durchschnitt zweier Zahlen berechnet. Es kann zu einem logischen Fehler kommen, wenn man vergisst, Klammern zu setzen. Wir verwenden @pytest.mark.parametrize, um diese Funktion mit mehreren Zahlenpaaren zu testen.
# Function to test
def calculate_average(num1, num2):
return (num1 + num2) / 2
# Test function using pytest's parametrize
import pytest
@pytest.mark.parametrize(
"num1, num2, expected",
[
(10, 20, 15),
(20, 30, 25),
(5, 5, 5)
])
def test_calculate_average(num1, num2, expected):
assert (calculate_average(num1, num2) == expected), f"Average of {num1} and {num2} should be equal to {(num1 + num2) / 2}"
Dieses Beispiel zeigt, wie test_calculate_average mit drei verschiedenen Zahlenpaaren ausgeführt wird, um zu überprüfen, ob die Funktion deren Durchschnitt korrekt berechnet.
Syntax mit id
Der Parameter id wird verwendet, um jedem Eingabesatz eine Kennung zuzuweisen, was die Identifizierung von Tests im Testergebnis erleichtert:
@pytest.mark.parametrize("num1, num2, expected", [
pytest.param(10, 20, 15, id="integers"),
pytest.param(20, 30, 25, id="more integers"),
pytest.param(5, 5, 5, id="equal numbers")
])
def test_calculate_average_with_ids(num1, num2, expected):
assert calculate_average(num1, num2) == expected
Die Verwendung von pytest.param ermöglicht eine detailliertere Steuerung jedes Testfalls, einschließlich der direkten Vergabe individueller IDs.
Syntax mit ids
Es ist auch möglich, für jeden Testfall mit ids eine eindeutige Kennung zu vergeben, was die Testberichte übersichtlicher macht:
@pytest.mark.parametrize("num1, num2, expected", [
(10, 20, 15),
(20, 30, 25),
(5, 5, 5)
], ids=["integers", "more integers", "equal numbers"])
def test_calculate_average_with_ids(num1, num2, expected):
assert calculate_average(num1, num2) == expected
In diesem Code hat jeder Parametersatz eine zugeordnete ID, die den Testfall beschreibt und im Testergebnis angezeigt wird.
So könnte die Ausgabe aussehen:
===================== test session starts ======================
collected 3 items
test_example.py::test_calculate_average_with_ids[integers] FAILED
test_example.py::test_calculate_average_with_ids[more integers] PASSED
test_example.py::test_calculate_average_with_ids[equal numbers] PASSED
=========================== FAILURES ===========================
________________ test_calculate_average_with_ids[integers] ________________
num1 = 10, num2 = 20, expected = 15
def test_calculate_average_with_ids(num1, num2, expected):
> assert calculate_average(num1, num2) == expected
E assert 20 == 15
E + where 20 = calculate_average(10, 20)
test_example.py:10: AssertionError
================== 1 failed, 2 passed in 0.23s ==================
1. Betrachten Sie eine Funktion, die zwei Zahlen multipliziert. Vervollständigen Sie den Testfall, indem Sie die fehlenden Teile ausfüllen:
2. Was ist der Hauptvorteil der Angabe von Kennungen mit id oder ids in @pytest.mark.parametrize?
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
Can you explain why the first test case failed?
How do I add more test cases using parametrize?
What are the benefits of using ids in pytest parameterized tests?
Awesome!
Completion rate improved to 3.13
Test-Parametrisierung in Pytest: Ausführen von Tests mit Mehreren Eingaben
Swipe um das Menü anzuzeigen
Parametrisierte Tests sind entscheidend, um die Testabdeckung zu erhöhen, ohne zahlreiche Testfunktionen für Szenarien zu schreiben, die sich nur durch ihre Eingaben und erwarteten Ausgaben unterscheiden. Dieser Ansatz spart nicht nur Zeit, sondern erhöht auch die Übersichtlichkeit und Wartbarkeit von Test-Suiten durch:
- Reduzierung von Code-Duplikation und potenziellen Fehlerquellen im Testcode;
- Ermöglichung der einfachen Hinzufügung neuer Testfälle durch das bloße Hinzufügen von Parametern;
- Erleichterung umfassender Tests über eine breite Palette von Eingabewerten.
Betrachten wir eine einfache Funktion, die den Durchschnitt zweier Zahlen berechnet. Es kann zu einem logischen Fehler kommen, wenn man vergisst, Klammern zu setzen. Wir verwenden @pytest.mark.parametrize, um diese Funktion mit mehreren Zahlenpaaren zu testen.
# Function to test
def calculate_average(num1, num2):
return (num1 + num2) / 2
# Test function using pytest's parametrize
import pytest
@pytest.mark.parametrize(
"num1, num2, expected",
[
(10, 20, 15),
(20, 30, 25),
(5, 5, 5)
])
def test_calculate_average(num1, num2, expected):
assert (calculate_average(num1, num2) == expected), f"Average of {num1} and {num2} should be equal to {(num1 + num2) / 2}"
Dieses Beispiel zeigt, wie test_calculate_average mit drei verschiedenen Zahlenpaaren ausgeführt wird, um zu überprüfen, ob die Funktion deren Durchschnitt korrekt berechnet.
Syntax mit id
Der Parameter id wird verwendet, um jedem Eingabesatz eine Kennung zuzuweisen, was die Identifizierung von Tests im Testergebnis erleichtert:
@pytest.mark.parametrize("num1, num2, expected", [
pytest.param(10, 20, 15, id="integers"),
pytest.param(20, 30, 25, id="more integers"),
pytest.param(5, 5, 5, id="equal numbers")
])
def test_calculate_average_with_ids(num1, num2, expected):
assert calculate_average(num1, num2) == expected
Die Verwendung von pytest.param ermöglicht eine detailliertere Steuerung jedes Testfalls, einschließlich der direkten Vergabe individueller IDs.
Syntax mit ids
Es ist auch möglich, für jeden Testfall mit ids eine eindeutige Kennung zu vergeben, was die Testberichte übersichtlicher macht:
@pytest.mark.parametrize("num1, num2, expected", [
(10, 20, 15),
(20, 30, 25),
(5, 5, 5)
], ids=["integers", "more integers", "equal numbers"])
def test_calculate_average_with_ids(num1, num2, expected):
assert calculate_average(num1, num2) == expected
In diesem Code hat jeder Parametersatz eine zugeordnete ID, die den Testfall beschreibt und im Testergebnis angezeigt wird.
So könnte die Ausgabe aussehen:
===================== test session starts ======================
collected 3 items
test_example.py::test_calculate_average_with_ids[integers] FAILED
test_example.py::test_calculate_average_with_ids[more integers] PASSED
test_example.py::test_calculate_average_with_ids[equal numbers] PASSED
=========================== FAILURES ===========================
________________ test_calculate_average_with_ids[integers] ________________
num1 = 10, num2 = 20, expected = 15
def test_calculate_average_with_ids(num1, num2, expected):
> assert calculate_average(num1, num2) == expected
E assert 20 == 15
E + where 20 = calculate_average(10, 20)
test_example.py:10: AssertionError
================== 1 failed, 2 passed in 0.23s ==================
1. Betrachten Sie eine Funktion, die zwei Zahlen multipliziert. Vervollständigen Sie den Testfall, indem Sie die fehlenden Teile ausfüllen:
2. Was ist der Hauptvorteil der Angabe von Kennungen mit id oder ids in @pytest.mark.parametrize?
Danke für Ihr Feedback!