TechTalk#9 – Writing fast tests with Django

 

TechTalk #9

Writing fast tests with Django

 

Lorsqu’un projet Djangocommence à vieillir, que des fonctionnalités ont été ajoutées, par des développeurs différents, au fil du temps, les tests ont tendance à devenir :

  • Lents
  • Non-fiables
  • Difficiles à lire
  • Non-conformes aux standards
  • Donc, à refactoriser

Ce Tech Talk expose les mauvaises pratiques que nous avons pu rencontrer et qu’il faut chercher à éviter, ainsi que les bonnes pratiquent à appliquer pour maintenir des tests utiles.

Idéalement, l’ensemble des testsdoivent s’exécuter en moins de 20 secondes. Les tests doivent couvrir minimum 80 à 90 % du code du projet.

Ceci pour permettre aux tests d’être joués régulièrement pendant le développement et systématiquement avant commit, ce qui évite de “pusher” des états de code ou les tests ne passent pas.

Pour pallier à la lenteur d’exécution des tests il existe plusieurs axes d’amélioration :

1.Un moyen simple consiste à mettre dans les settings de test le hash de password en mode MD5 (seulement pour les tests).

 

ripplemotion-agence-digitale-techtalk9

 

2.Il est important de garder à l’esprit que l’accès à la base de données demande des accès disque donc du temps d’attente I/O. Il faut donc privilégier les accès mémoires ou de faire dans la mesure du possible des requêtes globales plutôt que plusieurs petites requêtes. Dans notre cas, utiliser le mode « inmemory » de sqlite n’est pas envisageable car nous utilisons des fonctions avancées de postgres et postgis.

Un moyen simple de s’assurer que l’on n’accède pas à la base de données est d’utiliser “SimpleTestCase” pour les tests qui le permettent.

3.Un autre moyen d’améliorer la vitesse d’exécution des tests est simplement d’utiliser le paramètre manage.py « –keepdb », ce qui permet de conserver la base de test ce qui évite de rejouer les migrations chaque fois que l’on relance les tests.

4.NB : Changer les settings Django DEBUG ou TEMPLATE_DEBUG à False n’apporte aucun gain de performance.

5. Les mockssont un bon moyen d’améliorer la vitesse d’exécution. Néanmoins, il faut faire attention car ils sont souvent long et couteux à mettre en place.

6.Il est possible de grouper les tests en catégorie de rapidité, ce qui permet au développeur de jouer les tests rapides durant le développement puis de lancer toute la suite de tests avant de committer.

Pour résumer, un bon nombre de moyens existent pour améliorer la rapidité des tests. Certains sont plus couteux à mettre en place que d’autres. Réfléchissez bien au tempset au budgetque vous avez pour décider de ce que vous allez mettre en place.

TechTalk animé par Olivier Tabone | Co-fondateur Directeur Technique chez Ripple Motion