• 4 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis Ă  jour le 18/02/2022

🔴 ✅ Ajoutez une fonctionnalité en TDD : red / green

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Comment les phases du TDD se traduisent en code ? Voyons-le tout de suite !

đź”´  Red

Commençons par ajouter le premier test de notre nouveau graphique. Je vais commencer par tester que le titre est correct.

class TestAgreeablenessPerAgeGraph:
def setup_method(self):
script.Zone._initialize_zones()
self.zone = script.Zone.ZONES[0]
self.graph = script.AgreeablenessPerAgeGraph()
self.zones = script.Zone.ZONES
for _ in range(0, 10):
self.zone.add_inhabitant(script.Agent(script.Position(-180, -89), agreeableness=1, age=50))
def test_title(self):
assert self.graph.title == 'Nice people are young'

Je lance les tests... Effectivement, je vois une erreur.

AttributeError: module 'program.world' has no attribute 'AgreeablenessPerAgeGraph'

La prochaine Ă©tape est donc de faire en sorte que ce test passe. Je ne m'occupe pas du tout du reste de mon application mais uniquement de ce test.

âś…  Green

En effet, la classe n'existe pas encore ! Je vais la créer.

class AgreeablenessPerAgeGraph(BaseGraph):
def __init__(self):
super(AgreeablenessPerAgeGraph, self).__init__()

Si je relance mon test, je dĂ©couvre une autre erreur :  AssertionError: assert 'Your graph title' == 'Nice people are young'.

Mon objet est bien crĂ©Ă© mais la valeur attendue n'est pas correcte. Pourquoi ? Car  AgreeablenessPerAgeGraph()  hĂ©rite de la classe  BaseGraph()  dans laquelle nous avons indiquĂ© des valeurs "par dĂ©faut".

Empressons-nous de corriger cela.

class AgreeablenessPerAgeGraph(BaseGraph):
def __init__(self):
super(AgreeablenessPerAgeGraph, self).__init__()
self.title = "Nice people are young"

Relançons... Le test est vert ! Parfait ! Nous pouvons passer à l'écriture du test suivant. Nous aurons alors de nouveau du rouge, puis du vert lorsque nous le corrigerons.

Les tests finaux :

class TestAgreeablenessPerAgeGraph:
def setup_method(self):
script.Zone._initialize_zones()
self.zone = script.Zone.ZONES[0]
self.graph = script.AgreeablenessPerAgeGraph()
self.zones = script.Zone.ZONES
for _ in range(0, 10):
self.zone.add_inhabitant(script.Agent(script.Position(-180, -89), agreeableness=1, age=50))
def test_title(self):
assert self.graph.title == 'Nice people are young'
def test_x_label(self):
assert self.graph.x_label == 'age'
def test_y_label(self):
assert self.graph.y_label == 'agreeableness'
def test_xy_values(self):
assert len(self.graph.xy_values(self.zones)) == 2
def test_age(self):
assert self.graph.xy_values(self.zones)[0][50] == 50
def test_average_agreeableness_by_age(self):
assert self.graph.xy_values(self.zones)[1][50] == 1

Et le code que nous avons ajouté :

class AgreeablenessPerAgeGraph(BaseGraph):
def __init__(self):
super(AgreeablenessPerAgeGraph, self).__init__()
self.title = "Nice people are young"
self.x_label = "age"
self.y_label = "agreeableness"
def xy_values(self, zones):
agreeableness_by_age = defaultdict(float)
population_by_age = defaultdict(int)
for zone in zones:
for inhabitant in zone.inhabitants:
agreeableness_by_age[inhabitant.age] += inhabitant.agreeableness
population_by_age[inhabitant.age] += 1
x_values = range(0, 100)
y_values = [agreeableness_by_age[age] / (population_by_age[age] or 1) for age in range(0, 100)]
return x_values, y_values

Nous finissons par mettre Ă  jour la boucle  main()  afin de lancer le programme :

def main():
...
agreeableness_per_age_graph = AgreeablenessPerAgeGraph()
agreeableness_per_age_graph.show(Zone.ZONES)
...

Exemple de certificat de réussite
Exemple de certificat de réussite