Testparametrisering i Pytest: Kørsel af Tests med Flere Input
Parametriseret testning er afgørende for at forbedre testdækningen uden at skulle skrive adskillige testfunktioner for scenarier, der kun adskiller sig ved deres input og forventede output. Denne tilgang sparer ikke kun tid, men øger også klarheden og vedligeholdelsen af testsuiter ved:
- At reducere kode-duplikering og risikoen for fejl i testkoden;
- At muliggøre nem tilføjelse af nye testtilfælde ved blot at tilføje parametre;
- At lette omfattende testning på tværs af et bredt udvalg af input.
Lad os overveje en simpel funktion, der beregner gennemsnittet af to tal. Der kan opstå en logisk fejl, hvis man glemmer at sætte parenteser. Vi bruger @pytest.mark.parametrize til at teste denne funktion med flere 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}"
Dette eksempel demonstrerer, hvordan test_calculate_average kan køres med tre forskellige sæt tal, hvor det kontrolleres, om funktionen korrekt beregner deres gennemsnit.
Syntaks med id
Parameteren id bruges til at tildele en identifikator til hvert sæt input, hvilket gør det lettere at identificere tests i testoutputtet:
@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
Brug af pytest.param giver mere detaljeret kontrol over hvert testtilfælde, herunder direkte tildeling af individuelle ID'er.
Syntaks med ids
Du kan også angive et unikt ID for hvert testtilfælde ved hjælp af ids, hvilket gør test-rapporter mere læsbare:
@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 denne kode har hvert sæt parametre et tilknyttet ID, der beskriver testtilfældet, hvilket vil fremgå af testoutputtet.
Her er et eksempel på, hvordan outputtet kan se ud:
===================== 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. Overvej en funktion, der multiplicerer to tal. Udfyld testtilfældet ved at indsætte de manglende dele:
2. Hvad er den primære fordel ved at angive identifikatorer ved hjælp af id eller ids i @pytest.mark.parametrize?
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
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?
Fantastisk!
Completion rate forbedret til 3.13
Testparametrisering i Pytest: Kørsel af Tests med Flere Input
Stryg for at vise menuen
Parametriseret testning er afgørende for at forbedre testdækningen uden at skulle skrive adskillige testfunktioner for scenarier, der kun adskiller sig ved deres input og forventede output. Denne tilgang sparer ikke kun tid, men øger også klarheden og vedligeholdelsen af testsuiter ved:
- At reducere kode-duplikering og risikoen for fejl i testkoden;
- At muliggøre nem tilføjelse af nye testtilfælde ved blot at tilføje parametre;
- At lette omfattende testning på tværs af et bredt udvalg af input.
Lad os overveje en simpel funktion, der beregner gennemsnittet af to tal. Der kan opstå en logisk fejl, hvis man glemmer at sætte parenteser. Vi bruger @pytest.mark.parametrize til at teste denne funktion med flere 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}"
Dette eksempel demonstrerer, hvordan test_calculate_average kan køres med tre forskellige sæt tal, hvor det kontrolleres, om funktionen korrekt beregner deres gennemsnit.
Syntaks med id
Parameteren id bruges til at tildele en identifikator til hvert sæt input, hvilket gør det lettere at identificere tests i testoutputtet:
@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
Brug af pytest.param giver mere detaljeret kontrol over hvert testtilfælde, herunder direkte tildeling af individuelle ID'er.
Syntaks med ids
Du kan også angive et unikt ID for hvert testtilfælde ved hjælp af ids, hvilket gør test-rapporter mere læsbare:
@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 denne kode har hvert sæt parametre et tilknyttet ID, der beskriver testtilfældet, hvilket vil fremgå af testoutputtet.
Her er et eksempel på, hvordan outputtet kan se ud:
===================== 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. Overvej en funktion, der multiplicerer to tal. Udfyld testtilfældet ved at indsætte de manglende dele:
2. Hvad er den primære fordel ved at angive identifikatorer ved hjælp af id eller ids i @pytest.mark.parametrize?
Tak for dine kommentarer!