Intermédiaire
🧠 Fondamentaux
20 XP
0 personnes ont réussi
Fixtures simples
Quand tu ecris des tests pour une appli e-commerce, tu as besoin des memes donnees partout : un utilisateur test, un panier avec des articles, des produits avec des prix. Plutot que de copier-coller ces donnees dans chaque test, tu les centralises dans une fixture.
Une fixture, c'est une fonction qui prepare et renvoie des donnees fraiches pour les tests. Pense a un decor de theatre qu'on installe avant chaque scene : chaque test commence avec un etat propre et previsible.
En Python, une fixture peut etre une simple fonction :
L'avantage est triple : tes données de test sont au meme endroit, chaque test commence avec des données fraiches (pas de pollution entre les tests), et si la structure des données change, tu ne modifies qu'un seul endroit.
Écris une classe TestPanier qui teste un système de panier de courses. La classe doit contenir :
fixture() : méthode qui renvoie un dictionnaire representant un panier avec les clés "articles" (liste de dicts avec "nom" et "prix"), et "reduction" (un float entre 0 et 1, par ex 0.1 pour 10%).
total(panier) : méthode qui calcule le total du panier apres reduction.
test_total_normal() : teste le total avec la fixture. test_total_panier_vide() : teste un panier sans articles. test_total_sans_reduction() : teste un panier avec reduction a 0. test_total_reduction_totale() : teste un panier avec reduction a 1 (100%).
run() : exécute tous les tests et renvoie un dict {nom_du_test: True/False}.
t = TestPanier()
r = t.run()
assert all(r.values()), f'Tous les tests devraient passer mais on a {r}'
4 tests minimum
t = TestPanier()
r = t.run()
assert len(r) >= 4, f'Il faut au moins 4 tests, tu en as {len(r)}'
La fixture renvoie le bon format
t = TestPanier()
f = t.fixture()
assert 'articles' in f and 'reduction' in f, 'La fixture doit avoir les clés articles et reduction'
assert isinstance(f['articles'], list), 'articles doit etre une liste'
assert isinstance(f['reduction'], float), 'reduction doit etre un float'
Le total est correct
t = TestPanier()
assert t.total({'articles': [{'nom': 'A', 'prix': 100}], 'reduction': 0.2}) == 80.0, 'Le total de 100 avec 20% de reduction devrait etre 80'
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
class TestPanier:
def fixture(self):
return {
"articles": [
{"nom": "Clavier", "prix": 50.0},
{"nom": "Souris", "prix": 30.0},
{"nom": "Ecran", "prix": 200.0},
],
"reduction": 0.1
}
def total(self, panier):
sous_total = sum(a["prix"] for a in panier["articles"])
return sous_total * (1 - panier["reduction"])
def test_total_normal(self):
panier = self.fixture()
assert self.total(panier) == 252.0, "Le total avec 10% de reduction devrait etre 252.0"
def test_total_panier_vide(self):
panier = {"articles": [], "reduction": 0.1}
assert self.total(panier) == 0.0, "Un panier vide devrait donner 0"
def test_total_sans_reduction(self):
panier = self.fixture()
panier["reduction"] = 0
assert self.total(panier) == 280.0, "Sans reduction le total devrait etre 280.0"
def test_total_reduction_totale(self):
panier = self.fixture()
panier["reduction"] = 1
assert self.total(panier) == 0.0, "Une reduction de 100% devrait donner 0"
def run(self):
tests = [self.test_total_normal, self.test_total_panier_vide,
self.test_total_sans_reduction, self.test_total_reduction_totale]
résultats = {}
for test in tests:
try:
test()
résultats[test.__name__] = True
except (AssertionError, Exception):
résultats[test.__name__] = False
return résultats