Ceci est un texte traduit automatiquement qui peut contenir des erreurs !
Maintenant que nous avons créé des classes et travaillé sur la validation, nous avons une bonne base pour commencer les tests. Les tests font partie intégrante du processus de développement et nous aident à garantir que notre code fonctionne comme prévu.
Comment pouvons-nous être sûrs que le code fonctionne comme il le devrait si nous ne le testons pas ?
Qu’est-ce que le Test Unitaire ?
Le Test Unitaire est une méthode pour tester automatiquement et systématiquement de petites parties de notre code. En Python, nous utilisons un module appelé pytest pour écrire et exécuter des tests. Une “unité” est la plus petite partie testable d’une application, souvent une seule fonction ou méthode. Lorsque nous utilisons pytest, il est important que nous suivions les conventions de nommage correctes pour que pytest puisse trouver nos tests, comme nommer les fichiers de test avec test_ devant, et les fonctions de test avec test_ devant.
Exemple d’un test unitaire :
def test_add():
# Sjekker om addisjon fungerer som forventet.
# Vérifie si l'addition fonctionne comme prévu.
assert 0.3 + 0.3 + 0.3 == 0.9
Exécuté 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
# Installer le paquet 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 Person peut être créée avec des valeurs valides.
Exemple de ce à quoi le test pourrait ressembler :
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" # Vérifie que le nom est correct
assert bob_kaare.eye_color == EyeColor.BLUE # Vérifie que la couleur des yeux est correcte
Ce type de test est appelé « happy path testing », car nous testons que tout fonctionne comme prévu lorsque nous fournissons des valeurs valides, et n’est pas très utile.
Exercice 3 - Test de validation
Créez davantage de tests dans test_person.py qui vérifient que la validation dans Email et PhoneNumber fonctionne comme prévu. Testez à la fois des valeurs valides et invalides. Ici, vous devez utiliser une fonction dans pytest qui s’appelle 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_.
Løsning: Eksempel på en test for ugyldig e-post
from main import Email
import pytest
def test_invalid_email():
with pytest.raises(ValueError):
email = Email("not-an-email")
Pourquoi faire cela ?
En ayant de bons tests pour notre code, nous pouvons être sûrs qu’il fonctionne comme prévu, et nous pouvons facilement déterminer si quelque chose s’est mal passé si nous apportons des modifications au code. Ceci est particulièrement important dans les projets plus importants, où de nombreux développeurs travaillent ensemble et il est facile de faire des erreurs.
En utilisant par exemple des logiciels tels que Jest ou Selenium, on peut tester automatiquement les pages web, et ainsi s’assurer que tout fonctionne comme prévu après chaque modification du code. Nous voulons bien sûr savoir que “l’inscription des utilisateurs”, “le paiement” et “la connexion” fonctionnent comme prévu, 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 - Tests Automatiques (CI)
Lors de la publication de code sur GitHub, nous pouvons configurer ce qu’on appelle GitHub Actions qui peut exécuter nos tests automatiquement chaque fois que nous apportons une modification au code. Cela s’appelle l’Intégration Continue (CI), et cela nous aide à nous assurer que notre code fonctionne toujours comme prévu.
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 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).
Merknad om filstruktur
La structure de vos fichiers déterminera si GitHub Actions fonctionne ou non. Assurez-vous que le dossier .github se trouve dans le dossier racine de votre projet, et qu’il en va de même pour un dossier tests où se trouvent vos fichiers de test.
Vous pouvez éventuellement modifier le fichier pytest.yml pour pointer vers le bon dossier.
De tels fichiers Actions peuvent également être utilisés pour tester votre code sur différentes versions de Python ou de systèmes d’exploitation. Ils peuvent également être utilisés pour construire et publier automatiquement vos logiciels, par exemple, publier un site web, ou mettre à jour une application dans l’App Store ou Google Play.
Code Coverage
Il existe également ce qu’on appelle le « Code Coverage », qui peut vous aider à voir quelle quantité de votre code est réellement testée. Cela peut être utile pour déterminer si vous avez suffisamment de tests, ou s’il existe des parties de votre code qui ne sont pas testées du tout.
Certains lieux de travail exigent que vous ayez un certain pourcentage de votre code couvert par des tests avant de pouvoir le déployer, afin de garantir que le code est robuste et fonctionne comme prévu.

