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)
...