Tutoriel PyTest : Installer, Écrire et Exécuter des Tests Python en Toute Confiance
Qu'est-ce que PyTest ?
PyTest est un framework de test puissant, open source, qui permet aux développeurs d'écrire des cas de test concis et scalables pour projets Python — qu'il s'agisse de tests unitaires, d'intégration ou de vérifications API de bout en bout. Il supporte l'exécution parallèle, l'injection de fixtures, la paramétrisation, et des rapports riches dès la sortie de la boîte.
Pourquoi Choisir PyTest ?
- Syntaxe simple et lisible qui réduit le boilerplate
- Découverte et exécution automatique des tests
- Exécuter tests spécifiques ou groupes avec
-ket marqueurs - Support intégré pour exécutions parallèles via
pytest-xdist - Extensible via fixtures, hooks et plugins
- Gratuit et activement maintenu par la communauté
Installation de PyTest
Installez la dernière version stable avec pip :
pip install pytest
Vérifiez l'installation :
pytest --version
Pour contrôler une version spécifique, vous pouvez épingler une release, ex: pip install pytest==7.4.0.
Démarrage : Un Test de Base
Créez un répertoire de projet et ajoutez un fichier de test nommé test_sample1.py :
import pytest
def test_file1_method1():
x = 5
y = 6
assert x + 1 == y, "Addition échouée"
assert x == y, "Les valeurs devraient correspondre"
def test_file1_method2():
x = 5
y = 6
assert x + 1 == y, "Addition échouée"
Lancez la suite de tests :
pytest
Exemple de sortie :
==================== test session starts ====================
collected 2 items
test_sample1.py F. [100%]
=================================== FAILURES ===================================
...
Comprendre les Assertions
Les assertions PyTest se comportent comme les instructions standard Python assert. En cas d'échec, le test s'arrête et PyTest rapporte l'emplacement exact et le message :
assert "hello" == "Hai", "Salutation non correspondante"
Règles de Découverte des Tests
- Les fichiers doivent commencer par
test_ou finir par_test.py. - Les fonctions de test doivent commencer par
test_. - Autres fichiers ou fonctions sont ignorés sauf spécification explicite.
Exécuter des Tests Spécifiques
Exécuter tous les tests d'un répertoire :
pytest
Exécuter un seul fichier :
pytest test_sample1.py
Filtrer par sous-chaîne :
pytest -k method1 -v
Exécuter par marqueur :
pytest -m set1
Exécution Parallèle
Installez le plugin xdist et lancez une exécution parallèle à 4 workers :
pip install pytest-xdist pytest -n 4
Utiliser les Fixtures
Définissez une logique de setup réutilisable une fois et injectez-la dans les tests :
import pytest
@pytest.fixture
def supply_data():
return [25, 35, 45]
def test_compare_with_first(supply_data):
assert supply_data[0] == 25
Placez le code fixture dans conftest.py pour partager à travers plusieurs modules de test.
Tests Paramétrisés
Exécutez un seul test avec de multiples entrées :
import pytest
@pytest.mark.parametrize("a, b, expected", [(5, 5, 10), (3, 5, 8)])
def test_add(a, b, expected):
assert a + b == expected
Sauter et Échecs Attendus
Utilisez des marqueurs pour sauter ou attendre des échecs sans polluer les résultats :
import pytest
@pytest.mark.skip(reason="Fonctionnalité pas encore disponible")
def test_future_feature():
pass
@pytest.mark.xfail(reason="Bug connu")
def test_known_issue():
assert 1 == 2
Génération de Rapports XML
Générez un fichier XML compatible JUnit pour pipelines CI :
pytest -v --junitxml=result.xml
Exemple Pratique : Test d'une API Publique
Voici un framework minimal qui teste https://reqres.in/ :
# conftest.py
import pytest
@pytest.fixture
def base_url():
return "https://reqres.in/api"
# test_list_user.py
import requests, json
import pytest
@pytest.mark.parametrize("user_id, first_name", [(1, "George"), (2, "Janet")])
def test_valid_user(base_url, user_id, first_name):
resp = requests.get(f"{base_url}/users/{user_id}")
data = json.loads(resp.text)
assert resp.status_code == 200
assert data["data"]["id"] == user_id
assert data["data"]["first_name"] == first_name
def test_invalid_user(base_url):
resp = requests.get(f"{base_url}/users/50")
assert resp.status_code == 404
# test_login_user.py
import requests, json
import pytest
def test_login_success(base_url):
payload = {"email": "test@test.com", "password": "something"}
resp = requests.post(f"{base_url}/login/", data=payload)
data = json.loads(resp.text)
assert resp.status_code == 200
assert data["token"] == "QpwL5tke4Pnpja7X"
def test_login_missing_password(base_url):
payload = {"email": "test@test.com"}
resp = requests.post(f"{base_url}/login/", data=payload)
data = json.loads(resp.text)
assert resp.status_code == 400
assert data["error"] == "Missing password"
Conclusion
Ce tutoriel a couvert l'installation de PyTest, l'écriture de tests clairs, l'utilisation de fixtures et marqueurs, l'exécution parallèle, la génération de rapports XML, et la construction d'une suite de test API simple. Avec ces fondations, vous pouvez faire évoluer vos pratiques de test Python en toute confiance.
Python
- Comment Installer WordPress sur Google Cloud : Guide Étape par Étape
- Framework de Test Automatisé Coded UI : Guide Complet pour Débutants
- Découvrez votre clé de sécurité réseau : étapes simples pour trouver et protéger votre Wi‑Fi
- Appels Wi-Fi expliqués : fonctionnement et importance
- Explorer la 6G : le futur de la connectivité ultra-rapide
- Guide expert : installation de niveleurs de quai pour efficacité maximale
- Comprendre les tests de décharges partielles : protéger les équipements haute tension
- Prévenir la cavitation des pompes : causes, symptômes et solutions
- Brasage du Cuivre Expliqué : Techniques et Astuces pour Connexions Solides et Fiables