• 4 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

Ce cours est en vidéo.

Vous pouvez obtenir un certificat de réussite à l'issue de ce cours.

J'ai tout compris !

Mis Ă  jour le 07/10/2017

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

 

Code du chapitre

Retrouvez l'intégralité du code de ce chapitre sur Github !

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