Paramétrisation des Tests dans Pytest : Exécution des Tests avec Plusieurs Entrées
Les tests paramétrés sont essentiels pour améliorer la couverture des tests sans avoir à écrire de nombreuses fonctions de test pour des scénarios qui ne diffèrent que par leurs entrées et sorties attendues. Cette approche permet non seulement de gagner du temps, mais aussi d'accroître la clarté et la maintenabilité des suites de tests en :
- Réduisant la duplication de code et le risque d'erreurs dans le code de test ;
- Permettant l'ajout facile de nouveaux cas de test en ajoutant simplement des paramètres ;
- Facilitant des tests exhaustifs sur un large éventail d'entrées.
Considérons une fonction simple qui calcule la moyenne de deux nombres. Une erreur logique peut survenir si l'on oublie de mettre des parenthèses. Nous utiliserons @pytest.mark.parametrize pour tester cette fonction avec plusieurs paires de nombres.
# 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}"
Cet exemple montre comment exécuter test_calculate_average avec trois ensembles de nombres différents, en vérifiant si la fonction calcule correctement leur moyenne.
Syntaxe avec id
Le paramètre id est utilisé pour attribuer un identifiant à chaque ensemble d'entrées, ce qui aide à identifier plus facilement les tests dans le résultat :
@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
L'utilisation de pytest.param permet un contrôle plus précis sur chaque cas de test, y compris la définition directe d'identifiants individuels.
Syntaxe avec ids
Vous pouvez également fournir un identifiant unique pour chaque cas de test à l'aide de ids, ce qui rend les rapports de test plus lisibles :
@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
Dans ce code, chaque ensemble de paramètres possède un identifiant associé qui décrit le cas de test, lequel apparaîtra dans le résultat du test.
Voici à quoi pourrait ressembler la sortie :
===================== 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. Considérez une fonction qui multiplie deux nombres. Complétez le cas de test en remplissant les parties manquantes :
2. Quel est l'avantage principal de spécifier des identifiants à l'aide de id ou ids dans @pytest.mark.parametrize ?
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion
Génial!
Completion taux amélioré à 3.13
Paramétrisation des Tests dans Pytest : Exécution des Tests avec Plusieurs Entrées
Glissez pour afficher le menu
Les tests paramétrés sont essentiels pour améliorer la couverture des tests sans avoir à écrire de nombreuses fonctions de test pour des scénarios qui ne diffèrent que par leurs entrées et sorties attendues. Cette approche permet non seulement de gagner du temps, mais aussi d'accroître la clarté et la maintenabilité des suites de tests en :
- Réduisant la duplication de code et le risque d'erreurs dans le code de test ;
- Permettant l'ajout facile de nouveaux cas de test en ajoutant simplement des paramètres ;
- Facilitant des tests exhaustifs sur un large éventail d'entrées.
Considérons une fonction simple qui calcule la moyenne de deux nombres. Une erreur logique peut survenir si l'on oublie de mettre des parenthèses. Nous utiliserons @pytest.mark.parametrize pour tester cette fonction avec plusieurs paires de nombres.
# 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}"
Cet exemple montre comment exécuter test_calculate_average avec trois ensembles de nombres différents, en vérifiant si la fonction calcule correctement leur moyenne.
Syntaxe avec id
Le paramètre id est utilisé pour attribuer un identifiant à chaque ensemble d'entrées, ce qui aide à identifier plus facilement les tests dans le résultat :
@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
L'utilisation de pytest.param permet un contrôle plus précis sur chaque cas de test, y compris la définition directe d'identifiants individuels.
Syntaxe avec ids
Vous pouvez également fournir un identifiant unique pour chaque cas de test à l'aide de ids, ce qui rend les rapports de test plus lisibles :
@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
Dans ce code, chaque ensemble de paramètres possède un identifiant associé qui décrit le cas de test, lequel apparaîtra dans le résultat du test.
Voici à quoi pourrait ressembler la sortie :
===================== 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. Considérez une fonction qui multiplie deux nombres. Complétez le cas de test en remplissant les parties manquantes :
2. Quel est l'avantage principal de spécifier des identifiants à l'aide de id ou ids dans @pytest.mark.parametrize ?
Merci pour vos commentaires !