Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Testparametrisering i Pytest: Kørsel af Tests med Flere Input | Beherskelse af Pytest-Rammeværket
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Python Strukturel Programmering

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

question mark

Overvej en funktion, der multiplicerer to tal. Udfyld testtilfældet ved at indsætte de manglende dele:

Select the correct answer

question mark

Hvad er den primære fordel ved at angive identifikatorer ved hjælp af id eller ids i @pytest.mark.parametrize?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 4. Kapitel 4

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

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

question mark

Overvej en funktion, der multiplicerer to tal. Udfyld testtilfældet ved at indsætte de manglende dele:

Select the correct answer

question mark

Hvad er den primære fordel ved at angive identifikatorer ved hjælp af id eller ids i @pytest.mark.parametrize?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 4. Kapitel 4
some-alt