Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Test-Parametrisierung in Pytest: Ausführen von Tests mit Mehreren Eingaben | Pytest Framework
Python Fortgeschrittene Konzepte

bookTest-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?

question mark

Betrachten Sie eine Funktion, die zwei Zahlen multipliziert. Vervollständigen Sie den Testfall, indem Sie die fehlenden Teile ausfüllen:

Select the correct answer

question mark

Was ist der Hauptvorteil der Angabe von Kennungen mit id oder ids in @pytest.mark.parametrize?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 4. Kapitel 4

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Suggested prompts:

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?

bookTest-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?

question mark

Betrachten Sie eine Funktion, die zwei Zahlen multipliziert. Vervollständigen Sie den Testfall, indem Sie die fehlenden Teile ausfüllen:

Select the correct answer

question mark

Was ist der Hauptvorteil der Angabe von Kennungen mit id oder ids in @pytest.mark.parametrize?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 4. Kapitel 4
some-alt