Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Testparametrisering i Pytest: Köra Tester med Flera Indata | Behärska Pytest-ramverket
Python Strukturell Programmering

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

question mark

Anta en funktion som multiplicerar två tal. Komplettera testfallet genom att fylla i de saknade delarna:

Select the correct answer

question mark

Vad är den främsta fördelen med att ange identifierare med id eller ids i @pytest.mark.parametrize?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 4. Kapitel 4

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

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

question mark

Anta en funktion som multiplicerar två tal. Komplettera testfallet genom att fylla i de saknade delarna:

Select the correct answer

question mark

Vad är den främsta fördelen med att ange identifierare med id eller ids i @pytest.mark.parametrize?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 4. Kapitel 4
some-alt