Testparametrisatie in Pytest: Tests Uitvoeren met Meerdere Invoerwaarden
Geparametriseerd testen is essentieel voor het verbeteren van de testdekking zonder talloze testfuncties te hoeven schrijven voor scenario's die alleen verschillen in hun invoer en verwachte uitvoer. Deze aanpak bespaart niet alleen tijd, maar verhoogt ook de duidelijkheid en het onderhoudsgemak van testreeksen door:
- Het verminderen van code duplicatie en de kans op fouten in testcode;
- Het eenvoudig toevoegen van nieuwe testgevallen door simpelweg parameters toe te voegen;
- Het mogelijk maken van uitgebreide tests over een breed scala aan invoerwaarden.
Laten we een eenvoudige functie bekijken die het gemiddelde van twee getallen berekent. Er kan een logische fout optreden als men vergeet haakjes te plaatsen. We gebruiken @pytest.mark.parametrize om deze functie te testen met verschillende paren getallen.
# 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}"
Dit voorbeeld toont hoe test_calculate_average wordt uitgevoerd met drie verschillende sets getallen, waarbij wordt gecontroleerd of de functie hun gemiddelde correct berekent.
Syntax met id
De parameter id wordt gebruikt om een identificatie toe te wijzen aan elke set invoerwaarden, wat helpt om tests gemakkelijker te herkennen in de testuitvoer:
@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
Het gebruik van pytest.param biedt meer gedetailleerde controle over elk testgeval, inclusief het direct instellen van individuele ID's.
Syntax met ids
Je kunt ook een unieke ID voor elk testgeval opgeven met ids, wat testrapporten leesbaarder maakt:
@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
In deze code heeft elke set parameters een bijbehorende ID die het testgeval beschrijft, welke zal verschijnen in de testuitvoer.
Hier volgt een voorbeeld van de uitvoer:
===================== 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. Beschouw een functie die twee getallen vermenigvuldigt. Vul de testcase aan door de ontbrekende delen in te vullen:
2. Wat is het belangrijkste voordeel van het specificeren van identificaties met id of ids in @pytest.mark.parametrize?
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
Geweldig!
Completion tarief verbeterd naar 3.13
Testparametrisatie in Pytest: Tests Uitvoeren met Meerdere Invoerwaarden
Veeg om het menu te tonen
Geparametriseerd testen is essentieel voor het verbeteren van de testdekking zonder talloze testfuncties te hoeven schrijven voor scenario's die alleen verschillen in hun invoer en verwachte uitvoer. Deze aanpak bespaart niet alleen tijd, maar verhoogt ook de duidelijkheid en het onderhoudsgemak van testreeksen door:
- Het verminderen van code duplicatie en de kans op fouten in testcode;
- Het eenvoudig toevoegen van nieuwe testgevallen door simpelweg parameters toe te voegen;
- Het mogelijk maken van uitgebreide tests over een breed scala aan invoerwaarden.
Laten we een eenvoudige functie bekijken die het gemiddelde van twee getallen berekent. Er kan een logische fout optreden als men vergeet haakjes te plaatsen. We gebruiken @pytest.mark.parametrize om deze functie te testen met verschillende paren getallen.
# 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}"
Dit voorbeeld toont hoe test_calculate_average wordt uitgevoerd met drie verschillende sets getallen, waarbij wordt gecontroleerd of de functie hun gemiddelde correct berekent.
Syntax met id
De parameter id wordt gebruikt om een identificatie toe te wijzen aan elke set invoerwaarden, wat helpt om tests gemakkelijker te herkennen in de testuitvoer:
@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
Het gebruik van pytest.param biedt meer gedetailleerde controle over elk testgeval, inclusief het direct instellen van individuele ID's.
Syntax met ids
Je kunt ook een unieke ID voor elk testgeval opgeven met ids, wat testrapporten leesbaarder maakt:
@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
In deze code heeft elke set parameters een bijbehorende ID die het testgeval beschrijft, welke zal verschijnen in de testuitvoer.
Hier volgt een voorbeeld van de uitvoer:
===================== 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. Beschouw een functie die twee getallen vermenigvuldigt. Vul de testcase aan door de ontbrekende delen in te vullen:
2. Wat is het belangrijkste voordeel van het specificeren van identificaties met id of ids in @pytest.mark.parametrize?
Bedankt voor je feedback!