La Programmation Orientée Objet appliquée aux tests
Attaquons-nous désormais aux tests de la classe Zone
!
Avant de coder, réfléchissons à ce que nous voudrons tester. Nous allons tester des méthodes importantes : find_zone_that_contains()
, add_inhabitant()
, population_density()
et average_agreeableness()
. Nous allons aussi tester que Zone.ZONES
renvoie bien la liste des zones de notre monde.
Bien. Nous voyons rapidement que chacun de ces tests nous obligera à créer au moins les quatre objets suivants : une zone, deux positions (pour créer la zone) et un agent. Ainsi :
position1 = script.Position(100, 33)
position2 = script.Position(101, 34)
zone = script.Zone(position1, position2)
agent = script.Agent(position1, agreeableness=1)
Ce serait vraiment fastidieux de dupliquer ce code à chaque écriture d'un test. Mais surtout, cela nous oblige à nous répéter et ce n'est pas très maintenable par la suite.
J'aimerais bien déclarer ces variables et les réutiliser dans mes fonctions qui testent des méthodes de la classe Zone
. Avez-vous une idée de la manière dont nous pourrions procéder ?
Je vous laisse réfléchir...
...
Et si nous créions une classe dans nos tests ? Nous pourrions ainsi déclarer des attributs de classe et les réutiliser à l'envi. Cela nous permettra également de bien différencier nos tests.
Réorganisation des tests
Créons une classe TestZone
et ajoutons 4 attributs de classe :
class TestZone:
POSITION1 = script.Position(100, 33)
POSITION2 = script.Position(101, 34)
ZONE = script.Zone(POSITION1, POSITION2)
AGENT = script.Agent(POSITION1, agreeableness=1)
Nous pouvons désormais écrire notre premier test.
Assurons-nous que toutes les zones sont bien créées :
class TestZone:
...
def test_get_zones(self):
assert len(script.Zone.ZONES) == 64800
Lançons le script avec Pytest... Et ça fonctionne !
Continuons :
class TestZone:
...
# - Zone :
# - trouver une zone qui contient une position
def test_find_zone_that_contains(self):
found_zone = script.Zone.find_zone_that_contains(self.POSITION1)
assert found_zone.corner1.longitude == self.ZONE.corner1.longitude
# - ajouter un habitant dans une zone
def test_add_inhabitant_in_zone(self):
self.ZONE.add_inhabitant(self.AGENT)
assert len(self.ZONE.inhabitants) == 1
# - récupérer toutes les instances Zone (Zone.ZONES)
# On devrait avoir exactement 64800 zones
def test_get_zones(self):
assert len(script.Zone.ZONES) == 64800
# - récupérer la densité de population d'une zone
def test_get_population_density(self):
assert self.ZONE.population_density() == 8.087793508722422e-05
# - récupérer l'agréabilité moyenne d'une zone
def test_get_average_agreeableness(self):
assert self.ZONE.average_agreeableness() == 1
Continuez de la même manière pour les classes Agent
et Position
. Nous verrons plus tard les classes AgreeablenessGraph
et IncomeGraph
. Je vous retrouve au chapitre suivant pour tester notre module download_agents.py
!
A vous de jouer !
Code de ce chapitre
Retrouvez l'intégralité du code de ce chapitre sur Github !