Testparametrisering i Pytest: Kjøring av Tester med Flere Inndata
Parameterisert testing er avgjørende for å forbedre testdekningen uten å måtte skrive mange testfunksjoner for scenarier som kun skiller seg i input og forventet output. Denne tilnærmingen sparer ikke bare tid, men øker også klarheten og vedlikeholdbarheten til testsett ved å:
- Redusere kode-duplisering og potensialet for feil i testkoden;
- Gjøre det enkelt å legge til nye testtilfeller ved å bare legge til parametere;
- Legge til rette for omfattende testing på tvers av et bredt spekter av inputverdier.
La oss se på en enkel funksjon som beregner gjennomsnittet av to tall. Det kan oppstå en logisk feil hvis man glemmer å sette parenteser. Vi bruker @pytest.mark.parametrize for å teste denne funksjonen med flere tallpar.
# 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 eksempelet viser hvordan man kan kjøre test_calculate_average med tre ulike sett av tall, og sjekke om funksjonen beregner gjennomsnittet korrekt.
Syntaks med id
Parameteret id brukes for å tildele en identifikator til hvert sett med input, noe som gjør det enklere å identifisere tester i testutskriften:
@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
Ved å bruke pytest.param får man mer detaljert kontroll over hvert testtilfelle, inkludert å sette individuelle ID-er direkte.
Syntaks med ids
Du kan også angi en unik ID for hvert testtilfelle ved å bruke ids, noe som gjør testresultatene mer lesbare:
@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 koden har hvert sett med parametere en tilhørende ID som beskriver testtilfellet, og som vil vises i testutskriften.
Slik kan utdataene 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. Tenk på en funksjon som multipliserer to tall. Fullfør testtilfellet ved å fylle inn de manglende delene:
2. Hva er hovedfordelen med å spesifisere identifikatorer ved bruk av id eller ids i @pytest.mark.parametrize?
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
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
Testparametrisering i Pytest: Kjøring av Tester med Flere Inndata
Sveip for å vise menyen
Parameterisert testing er avgjørende for å forbedre testdekningen uten å måtte skrive mange testfunksjoner for scenarier som kun skiller seg i input og forventet output. Denne tilnærmingen sparer ikke bare tid, men øker også klarheten og vedlikeholdbarheten til testsett ved å:
- Redusere kode-duplisering og potensialet for feil i testkoden;
- Gjøre det enkelt å legge til nye testtilfeller ved å bare legge til parametere;
- Legge til rette for omfattende testing på tvers av et bredt spekter av inputverdier.
La oss se på en enkel funksjon som beregner gjennomsnittet av to tall. Det kan oppstå en logisk feil hvis man glemmer å sette parenteser. Vi bruker @pytest.mark.parametrize for å teste denne funksjonen med flere tallpar.
# 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 eksempelet viser hvordan man kan kjøre test_calculate_average med tre ulike sett av tall, og sjekke om funksjonen beregner gjennomsnittet korrekt.
Syntaks med id
Parameteret id brukes for å tildele en identifikator til hvert sett med input, noe som gjør det enklere å identifisere tester i testutskriften:
@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
Ved å bruke pytest.param får man mer detaljert kontroll over hvert testtilfelle, inkludert å sette individuelle ID-er direkte.
Syntaks med ids
Du kan også angi en unik ID for hvert testtilfelle ved å bruke ids, noe som gjør testresultatene mer lesbare:
@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 koden har hvert sett med parametere en tilhørende ID som beskriver testtilfellet, og som vil vises i testutskriften.
Slik kan utdataene 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. Tenk på en funksjon som multipliserer to tall. Fullfør testtilfellet ved å fylle inn de manglende delene:
2. Hva er hovedfordelen med å spesifisere identifikatorer ved bruk av id eller ids i @pytest.mark.parametrize?
Takk for tilbakemeldingene dine!