Testparametrisering i Pytest: Köra Tester med Flera Indata
Parametriserad testning är avgörande för att förbättra testtäckningen utan att behöva skriva många testfunktioner för scenarier som endast skiljer sig åt i sina indata och förväntade utdata. Denna metod sparar inte bara tid utan ökar även tydligheten och underhållbarheten i testsuiten genom att:
- Minska kodupprepning och risken för fel i testkoden;
- Möjliggöra enkel tilläggning av nya testfall genom att bara lägga till parametrar;
- Underlätta omfattande testning över ett brett spektrum av indata.
Låt oss titta på en enkel funktion som beräknar medelvärdet av två tal. Det kan uppstå ett logiskt fel om man glömmer att sätta parenteser. Vi använder @pytest.mark.parametrize för att testa denna funktion med flera talpar.
# 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}"
Detta exempel visar hur man kör test_calculate_average med tre olika uppsättningar tal och kontrollerar om funktionen korrekt beräknar deras medelvärde.
Syntax med id
Parametern id används för att tilldela en identifierare till varje uppsättning indata, vilket gör det enklare att identifiera tester i testutdata:
@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
Genom att använda pytest.param får man mer detaljerad kontroll över varje testfall, inklusive att direkt ange individuella ID:n.
Syntax med ids
Du kan också ange ett unikt ID för varje testfall med hjälp av ids, vilket gör testresultaten mer lättlästa:
@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
I denna kod har varje uppsättning parametrar ett tillhörande ID som beskriver testfallet, vilket kommer att visas i testutdata.
Så här kan utdata se ut:
===================== 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. Anta en funktion som multiplicerar två tal. Komplettera testfallet genom att fylla i de saknade delarna:
2. Vad är den främsta fördelen med att ange identifierare med id eller ids i @pytest.mark.parametrize?
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
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?
Fantastiskt!
Completion betyg förbättrat till 3.13
Testparametrisering i Pytest: Köra Tester med Flera Indata
Svep för att visa menyn
Parametriserad testning är avgörande för att förbättra testtäckningen utan att behöva skriva många testfunktioner för scenarier som endast skiljer sig åt i sina indata och förväntade utdata. Denna metod sparar inte bara tid utan ökar även tydligheten och underhållbarheten i testsuiten genom att:
- Minska kodupprepning och risken för fel i testkoden;
- Möjliggöra enkel tilläggning av nya testfall genom att bara lägga till parametrar;
- Underlätta omfattande testning över ett brett spektrum av indata.
Låt oss titta på en enkel funktion som beräknar medelvärdet av två tal. Det kan uppstå ett logiskt fel om man glömmer att sätta parenteser. Vi använder @pytest.mark.parametrize för att testa denna funktion med flera talpar.
# 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}"
Detta exempel visar hur man kör test_calculate_average med tre olika uppsättningar tal och kontrollerar om funktionen korrekt beräknar deras medelvärde.
Syntax med id
Parametern id används för att tilldela en identifierare till varje uppsättning indata, vilket gör det enklare att identifiera tester i testutdata:
@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
Genom att använda pytest.param får man mer detaljerad kontroll över varje testfall, inklusive att direkt ange individuella ID:n.
Syntax med ids
Du kan också ange ett unikt ID för varje testfall med hjälp av ids, vilket gör testresultaten mer lättlästa:
@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
I denna kod har varje uppsättning parametrar ett tillhörande ID som beskriver testfallet, vilket kommer att visas i testutdata.
Så här kan utdata se ut:
===================== 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. Anta en funktion som multiplicerar två tal. Komplettera testfallet genom att fylla i de saknade delarna:
2. Vad är den främsta fördelen med att ange identifierare med id eller ids i @pytest.mark.parametrize?
Tack för dina kommentarer!