Ceci est un texte traduit automatiquement qui peut contenir des erreurs !
Maintenant que nous avons créé des classes et travaillé sur la validation, nous disposons d’une bonne base pour commencer les tests. Le test est une partie importante du processus de développement et nous aide à garantir que notre code fonctionne comme prévu.
Comment pouvons-nous être certains que le code fonctionne correctement si nous ne le testons pas ?
Qu’est-ce que le Test d’Unité ?
Le Test d’Unité est une méthode pour tester automatiquement et systématiquement de petites parties de notre code. En Python, nous utilisons un module nommé pytest pour écrire et exécuter des tests. Une « unité » est la partie testable la plus petite d’une application, souvent une fonction ou une méthode unique. Lorsque nous utilisons pytest, il est important de suivre les conventions de nommage appropriées afin que pytest puisse trouver nos tests, par exemple en préfixant les fichiers de test avec test_, ainsi que les fonctions de test avec test_.
Exemple d’un test d’unité :
def test_add():
assert 0.3 + 0.3 + 0.3 == 0.9
Exécutée en tapant pytest dans le terminal.
Fun fact
Le code ci-dessus échouera, car .3+.3+.3 devient 0.8999999999 en Python !
Exercice 1 - Installer pytest
Installez pytest dans votre environnement virtuel. Pour ce faire, exécutez la commande suivante dans le terminal :
pip install pytest
Exercice 2 - Créer un test
Créez un nouveau fichier dans votre dossier de projet nommé test_data.py. Dans ce fichier, vous devez créer un test pour la classe Person que vous avez créée dans le module précédent. Le test doit vérifier qu’une instance de Person peut être créée avec des valeurs valides.
Exemple d’apparence possible du test :
from main import Person
def test_person_working():
bob_kaare = Person(name="Bob Kåre",
eye_color=EyeColor.BLUE,
phone_number=PhoneNumber("12345678"),
email=Email("bob_kaare@example.com"))
assert bob_kaare.name == "Bob Kåre"
assert bob_kaare.eye_color == EyeColor.BLUE
Ce type de test est appelé « happy path » (test du chemin principal), car nous vérifions que tout fonctionne comme prévu lorsque des valeurs valides sont fournies, et il n’est pas particulièrement utile.
Exercice 3 - Tester la validation
Créez plusieurs tests dans test_person.py pour vérifier que la validation de Email et PhoneNumber fonctionne correctement. Testez à la fois des valeurs valides et invalides. Vous devez utiliser une fonction de pytest nommée raises, qui vérifie qu’une erreur spécifique est levée.
import pytest
def test_exception():
with pytest.raises(KeyError):
my_dict = {"a": 1, "b": 2}
value = my_dict["c"] # Ceci va "lever" une KeyError
Tip
Vous pouvez créer autant de fonctions que vous le souhaitez, tant que le nom de la fonction commence par test_.
Solution : Exemple de test pour un e-mail invalide
from main import Email
import pytest
def test_invalid_email():
with pytest.raises(ValueError):
email = Email("not-an-email")
Pourquoi faire cela ?
En disposant de bons tests pour notre code, nous pouvons être certains qu’il fonctionne comme il se doit et identifier facilement si quelque chose a mal tourné lorsque nous apportons des modifications au code. Cela est particulièrement important dans les grands projets où plusieurs développeurs collaborent et où il est facile de commettre des erreurs.
Vidéo : Pourquoi les tests protègent le code contre de nouveaux bugs
La vidéo explique pourquoi la mise en œuvre d’essais est importante et comment des essais automatisés peuvent révéler des erreurs après des modifications dans le code.
En utilisant par exemple des logiciels comme Jest ou Selenium, on peut tester automatiquement les sites Web et ainsi s’assurer que tout fonctionne correctement après chaque modification du code. Nous voulons bien sûr savoir que l‘“inscription utilisateur”, le “paiement” et la “connexion” fonctionnent comme il se doit, n’est-ce pas ?
Pensez aux scénarios suivants
Que se passe-t-il (ou devrait se passer) si… :
- Un utilisateur essaie de s’inscrire avec une adresse e-mail déjà utilisée ?
- Un utilisateur a une date de naissance dans le futur ?
- Un utilisateur saisit le nom « jOHN dOE » ?
Exercice 4 - Test automatique (CI)
Lorsque nous publions du code sur GitHub, nous pouvons configurer un outil appelé GitHub Actions qui peut exécuter nos tests automatiquement à chaque modification apportée au code. Cela s’appelle l’intégration continue (IC ou CI), et cela nous aide à garantir que notre code fonctionne toujours correctement.
Créez un fichier dans votre dossier de projet nommé .github/workflows/pytest.yml. Dans ce fichier, vous devez ajouter le code suivant :
name: Pytest
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pytest
# Installez toutes les autres dépendances dont votre projet a besoin
pip install -r requirements.txt
- name: Run tests with pytest
run: pytest
Si vous l’avez configuré correctement, vous devriez maintenant voir un nouvel onglet dans votre dépôt GitHub appelé “Actions”. Ici, vous pourrez voir que vos tests sont exécutés automatiquement chaque fois que vous apportez une modification au code, et vous serez averti si l’un des tests échoue (croix rouge et par e-mail).
Remarque sur la structure des fichiers
La structure de vos fichiers déterminera si GitHub Functions fonctionne ou non. Assurez-vous que le dossier .github se trouve dans le répertoire racine de votre projet, et qu’il en va de même pour un dossier tests où se trouvent vos fichiers de tests.
Vous pouvez éventuellement modifier le fichier pytest.yml pour pointer vers le bon dossier.
Les fichiers d’Actions peuvent également être utilisés pour tester votre code sur plusieurs versions de Python ou des systèmes d’exploitation ; ils peuvent aussi servir à construire et publier automatiquement vos logiciels, par exemple publier un site web ou mettre à jour une application dans l’App Store ou Google Play.
Couverture de code
Il existe également quelque chose appelé « Couverture de code » (Code Coverage), qui peut vous aider à voir combien de votre code est réellement testé. Cela peut être utile pour déterminer si vous avez suffisamment de tests ou s’il y a des parties de votre code qui ne sont pas testées du tout.
Certains employeurs exigent que vous atteigniez un certain pourcentage de couverture de code par les tests avant de pouvoir le déployer, afin de garantir que le code est robuste et fonctionne comme prévu.

