Ripple motion - techtalk - olivier tabone - développement mobile - nantes

TechTalk#9 – Writing fast tests with Django

TECH TALK #9

 

Writing fast tests with Django

 

Lorsqu’un projet Django commence à 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 tests doivent 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).

 

techtalk 9 - olivier Tabone

 

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 mocks sont 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 temps et au budget que vous avez pour décider de ce que vous allez mettre en place.

 

Tech Talk animé par :

 

Ripple Motion : Olivier Tabone - CTO et directeur technique

 

OLIVIER TABONE

Co fondateur/Directeur

 

N’hésitez pas à télécharger le TechTalk #9 – Writing fast tests with Django