Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Testparametrisering i Pytest: Kjøring av Tester med Flere Inndata | Beherske Pytest-Rammeverket
Python Strukturert Programmering

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

question mark

Tenk på en funksjon som multipliserer to tall. Fullfør testtilfellet ved å fylle inn de manglende delene:

Select the correct answer

question mark

Hva er hovedfordelen med å spesifisere identifikatorer ved bruk av id eller ids i @pytest.mark.parametrize?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 4. Kapittel 4

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

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?

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

question mark

Tenk på en funksjon som multipliserer to tall. Fullfør testtilfellet ved å fylle inn de manglende delene:

Select the correct answer

question mark

Hva er hovedfordelen med å spesifisere identifikatorer ved bruk av id eller ids i @pytest.mark.parametrize?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 4. Kapittel 4
some-alt