Slide 1

Slide 1 text

Faire des tests en Python FELD Boris - Pyconfr 2012

Slide 2

Slide 2 text

Requirements $> pip install nose sst

Slide 3

Slide 3 text

Something that is untested is broken.

Slide 4

Slide 4 text

About me Étudiant en école d’ingénieur Évangeliste python et fan de l’open- source @lothiraldan (sur twitter, bitbucket, github, google plus, un peut partout en fait...)

Slide 5

Slide 5 text

Plan Rappels Mise en pratique Retour et conseils

Slide 6

Slide 6 text

Rappels

Slide 7

Slide 7 text

C’est quoi un test ? La vérification d’un objectif. Simplement: On effectue une action, on vérifie que le résultat est le résultat attendu.

Slide 8

Slide 8 text

Des tests oui... Mais automatisés Le problème avec les tests «à la main»: Il faut trouver une main disponible Dans ce cas il faut automatiser les tests

Slide 9

Slide 9 text

Pourquoi faire des tests ?

Slide 10

Slide 10 text

Pourquoi faire des tests ? Assurer la qualité du produit finit. Vérifier qu’il n’y a pas de régression. Détecter les bugs.

Slide 11

Slide 11 text

Oui mais surtout... C’est un moyen de gérer la peur pendant le développement - Kent Benck Au moindre doute, le développeur peut lancer les tests.

Slide 12

Slide 12 text

Les tests Terminologie: La partie de l’application que l’on teste est souvent appelé «SUT» (System Under Test). Que tester ? Tout... Sauf les librairies/services externes.

Slide 13

Slide 13 text

Caractéristiques attendues Reproductibles Laisser un environnement clean Un test unitaire doit être isolé de son environnement

Slide 14

Slide 14 text

Niveaux et types de tests Niveau de test : périmètre, qu'est-ce que tu teste Types de test : comment tu veut tester

Slide 15

Slide 15 text

Niveaux de tests Tests unitaires Tests d’intégration Tests système Tests d’acceptation

Slide 16

Slide 16 text

Test unitaire Unité SUT

Slide 17

Slide 17 text

Test d’intégration SUT Unité existante Unité existante Unité

Slide 18

Slide 18 text

Test système SUT Unité Unité Unité Unité Unité Unité

Slide 19

Slide 19 text

Types de tests Tests fonctionnels Tests de non-régression Tests de performance Tests de sécurité

Slide 20

Slide 20 text

Étapes d’un test Préparer l’environnement Initialiser les variables Faire l’appel Vérifier l’environnement et la réponse Nettoyer l’environnement

Slide 21

Slide 21 text

TDD

Slide 22

Slide 22 text

Test Driven Development Popularisé par Kent Benck auprès de la communauté SmallTalk. La base du TDD repose sur un cycle : Red - Green - Refactoring. Quelques règles aussi.

Slide 23

Slide 23 text

Organisation des tests Les tests sont organisés en TestCase. Ils constituent un ensemble logique de tests (le même SUT, ...). Les TestCase sont organisés en TestSuite. Ils constituent là aussi un ensemble logique de TestCase (tous les tests, tous les tests unitaires, ...).

Slide 24

Slide 24 text

Unittest Module python faisant partie de la librairie standard. Inspiré par JUnit.

Slide 25

Slide 25 text

Exemple avec unittest import random import unittest class TestSequenceFunctions(unittest.TestCase): def setUp(self): self.seq = range(10) def test_shuffle(self): # make sure the shuffled sequence does not lose any elements random.shuffle(self.seq) self.seq.sort() self.assertEqual(self.seq, range(10)) # should raise an exception for an immutable sequence self.assertRaises(TypeError, random.shuffle, (1, 2, 3)) def test_choice(self): element = random.choice(self.seq) self.assertTrue(element in self.seq) def test_sample(self): with self.assertRaises(ValueError): random.sample(self.seq, 20) for element in random.sample(self.seq, 5): self.assertTrue(element in self.seq) if __name__ == '__main__': unittest.main()

Slide 26

Slide 26 text

Les méthodes d’assertion On a le choix : AssertEqual/AssertNotEqual AssertTrue/AssertFalse AssertIn/AssertNotIn AssertRaises

Slide 27

Slide 27 text

Mise en pratique

Slide 28

Slide 28 text

Étape 1, présentation de l’application Librairie de gestion de budgets partagés Qui n’a jamais eut besoin de gérer un budget à plusieurs lors d’une sortie ou d’un week-end ? Qui a payé ? Combien ? Pour qui ? Qui doit combien et à qui ?

Slide 29

Slide 29 text

Étape 2, premiers tests Créons un test qui signifie ce qu’on veut en suivant les principes du Test Driven Development (test d’abord).

Slide 30

Slide 30 text

Tester les interactions Unité SUT Unité existante

Slide 31

Slide 31 text

La manière «classique» Unité SUT Unité existante Etat 1

Slide 32

Slide 32 text

On remplace ! Unité SUT Unité existante

Slide 33

Slide 33 text

On remplace ! Unité SUT Unité existante

Slide 34

Slide 34 text

On remplace ! Unité SUT Unité existante Fausse unité

Slide 35

Slide 35 text

Pourquoi remplacer une unité ? Remplacer un comportement non déterministe (l'heure ou la température ambiante). Si l’unité a des états difficiles à reproduire (une erreur de réseau par exemple). Si l'initialisation de l’unité est longue (ex : création d'une base de données). Si l’unité n'existe pas ou si son comportement peut encore changer. S'il est nécessaire d'inclure des attributs et des méthodes uniquement à des fins de test. Pour isoler les tests. Pour éviter qu’un bug introduit dans une unité fasse échouer toute la suite de tests.

Slide 36

Slide 36 text

On remplace ! Cela consiste à utiliser des mocks, des objets avec des réponses prédéfinies. Ainsi il est plus simple de «simuler» des erreurs, des cas difficiles à configurer, ...

Slide 37

Slide 37 text

Test Coverage Quelle partie de mon code est testée ?

Slide 38

Slide 38 text

Rapport en HTML

Slide 39

Slide 39 text

Selenium Test d’interface en lançant un vrai navigateur. Puis interaction avec le navigateur via une socket. Lent mais rendu réel.

Slide 40

Slide 40 text

SST from sst.actions import * go_to('http://www.pycon.fr/2012/') element = assert_text_contains('logo', 'PyConFR 2012')

Slide 41

Slide 41 text

Conseils 1 bug = 1 test Partager efficacement les résultats des tests Mettre en place un outil d’intégration continue (jenkins, travis-ci).

Slide 42

Slide 42 text

Tests anti-pattern Les boucles dans les tests, surtout si il y a un assert dedans Les tests avec beaucoup d’asserts Les tests avec des chemins no relatifs (ça marche sur ma machine).

Slide 43

Slide 43 text

Testing legacy code

Slide 44

Slide 44 text

Quand le stagiaire me dit que les tests, “c’est pour ceux qui savent pas coder” LJDC