Mettre en place le développement piloté par les tests.
Nous allons commencer par un developpement d'une fonction python en deux itérations.
Si il n'est pas déjà installé, installer python3
dans votre environment Linux (VM
ou WSL
):
apt-get install python3
La commande python3 --version && pip3 --version
devrait retourner quelque chose comme ceci:
Python 3.11.6
pip 23.2.1 from ... (python 3.11)
Ensuite, installer la bibliothèque pytest
:
pip3 install pytest
Créer les fichiers main.py
et test.py
qui contiendront respectivement les fonctions à développer et leurs tests.
Tip
Si cette partie pose des difficultés, demander de l'aide. 🙋♀️🙋♂️
Commençons par quelque chose de simple et basique, une fonction qui renvoie Hello World !
. Le test correspondant se représenterait comme suit:
import main
def test_hello():
assert main.hello() == "Hello World !"
Le test défini ci-dessus est valide si l'assertion suivante est vraie:
Le retour de la fonction
hello()
demain
est une chaine de caractères contenantHello World !
.
Ajouter le code ci-dessus dans le fichier test.py
et exécuter ce test avec la commande pytest
.
pytest test.py
Vous avez maintenant l'objectif que vous voulez atteindre avec la fonction. 🚀
Coder la fonction pour rendre l'assertion vraie. Ajouter dans le fichier main.py
la fonction python
suivante :
def hello():
return "Hello world !"
La fonction doit maintenant remplir l'objectif précédemment fixé.
Tester la fonction hello()
.
pytest test.py
Tip
Le test passe au vert - Vous pouvez passer à la suite.
Caution
Le test reste au rouge - Reprenez à l'étape 2.
À partir d'ici, la fonction répond à l'objectif fixé à l'étape 1.
L'étape de refactorisation va permettre d'assurer qualité et respect des bonnes pratiques dans le code livré, refactoriser la fonction hello()
dans le fichier main.py
.
Note
N'oubliez pas: Refactoriser c'est améliorer, simplifier et optimiser le code d'une fonction pour le rendre plus pertinent. Par exemple, en rendant une fonction plus modulaire.
def hello(msg="Hello world!"):
return msg
Exécuter à nouveau les tests pour confirmer que la refactorisation n'a pas d'impact.
pytest test.py
Tip
Le test reste est vert - Félicitation, la fonctionnalité est complète grâce à votre implémentation de la méthode Red-Green-Refactor 🚀
Caution
Le test passe au rouge - Une erreur c'est inserée dans le code, recommencer l'itération 4. Refactoriser.
Nous allons maintenant mettre à l'échelle la méthodologie.
Créer une GitHub Action qui permet, pour chaque push, d'exécuter les tests via pytest
.
Réaliser une suite de fonction pour créer et gérer des évènements.
Définissons un évènement comme étant un tuple (T1
, t
, n
), où t
est égal au temps de l’évènement en seconde à partir du timestamp T1
(date et heure du début de l’évènement). n
sera le nom de l’évènement.
- Les évènements sont stockés dans un tableau.
- Créer un évènement.
- Retourner une liste d'évènements.
- Retourner une liste de tous les événements dans l’ordre chronologique.
- Retourner le nom du premier évènement dans la liste.
- Retourner le nom du prochain évènement.
Important
Chacunes des fonctionnalités doivent être représentées par au moins trois commits:
- Un premier commit dont le message suivra le format
test: nom_de_la_fonction()
, contenant le test de la fonction à développer. - Un second commit dont le message suivra le format
code: nom_de_la_fonction()
, contenant le code de la fonction à développer. - Un troisième commit dont le message suivra le format
refactor: nom_de_la_fonction()
, contenant le code de la fonction à développer.
Tip
Pour les phases de code et de refactorisation, vous pouvez tester localement avec pytest
, et pousser uniquement lors du premier passage au vert et au terme de la refactorisation.
Utiliser Flask
pour transformer cet ensemble de fonctions en une API REST.
Exemple d'API Flask à un endpoint:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "<p>Hello, World!</p>"
Placer chacunes de vos fonctions sous une route différente. (ex: @app.route("/list")
).
python main.py