SlideShare una empresa de Scribd logo
1 de 66
Descargar para leer sin conexión
PI2T Développement informatique
Séance 1
Gestion de projet, versioning,
debugging, testing et profiling
Sébastien Combéfis, Quentin Lurkin 1 février 2016
Ce(tte) œuvre est mise à disposition selon les termes de la Licence Creative Commons
Attribution – Pas d’Utilisation Commerciale – Pas de Modification 4.0 International.
Informations générales (1)
PI2T Développement informatique
Approfondissement du Python
10 cours de 1h30 (15 heures)
PI2L Projets de développement informatique
Développement d’une intelligence artificielle pour un jeu
8 labos de 3h30 (28 heures)
PN2L Application de méthodes numériques
Utilisation de libariries de calculs numériques
4 labos de 3h30 (14 heures)
3
Informations générales (2)
Documents utilisés sont sur Eole (slides et énoncés des labos)
Évaluation
Examen écrit (PI2T) : 30%
Labo (PI2L) : 45% (projets)
Labo (PN2L) : 25% (évaluation continue et test final)
Enseignants
Sébastien Combéfis (s.combefis@ecam.be)
Francis Gueuning (f.gueuning@ecam.be)
André Lorge (a.lorge@ecam.be)
Quentin Lurkin (q.lurkin@ecam.be)
4
Livres de référence
ISBN
978-0-321-68056-3
ISBN
978-1-593-27599-0
5
Objectifs
Gestion du code source et déploiement
Versioning de code et exemple avec GitHub
Déploiement de code et exemple avec Heroku
Test et analyse du code source
Debugging et comprendre les erreurs
Profiling et test de performance
Unit testing et exemple avec Travis
6
Versioning de code
Source Code Management
Pour tout projet informatique, il faut une stratégie de backup
On ajoute souvent une gestion des versions
Un développeur peut proposer plusieurs révisions par jour
Source Code Manager (SCM)
Version Control System (VCS)
Revision Control System (RCS)
8
Buts d’un gestionnaire de versions
Gestion d’un projet de programmation
Garder l’historique de toutes les modifications
Travail en équipe
Support de branches de développement
9
Git
Système inventé par Linus Torvalds pour le kernel Linux
Git a vu le jour en avril 2005
Premier commit le 8 avril
Logiciel de gestion de versions décentralisé
Connexion internet uniquement pour les pull et push
10
Prononciation
[ gít ] [ jít ]
11
Prononciation
[ gít ] [ jít ]
 
11
Git avec un serveur central
Accès en écriture pour tous les développeurs
Serveur central
Développeur A Développeur B
push
pull pull
push
12
Git décentralisé
Accès en écriture seulement pour les mainteneurs
Les contributeurs font des pull requests
Serveur
Contributeur
Serveur principal
Mainteneur
push
pull
push
pull request
13
États des fichiers (1)
Un fichier doit être explicitement ajouté au dépôt Git
Untracked
Modified
Staged Committed
git add git commit
Espace de travail Zone de transit Dépôt Git
14
États des fichiers (2)
Untracked/Modified
Nouveaux fichiers ou fichiers modifiés
Pas pris en compte pour le prochain commit
Staged
Fichiers ajoutés, modifiés, supprimés ou déplacés
Pris en compte pour le prochain commit
Unmodified/Committed
Aucune modification pour le prochain commit
15
Commandes de base
Ajouter un fichier dans la zone de transit
git add fichier
Obtenir l’état des fichiers
git status
Valider les modifications en créant un commit
git commit -m Titre du commit
Obtenir l’historique des commits
git log
16
Le concept de branche
Une branche pointe vers un commit
À chaque nouveau commit, le pointeur de branche avance
Un commit pointe vers le commit parent
82ea19
master
17
Le concept de branche
Une branche pointe vers un commit
À chaque nouveau commit, le pointeur de branche avance
Un commit pointe vers le commit parent
82ea19 cd27e1
master
17
Le concept de branche
Une branche pointe vers un commit
À chaque nouveau commit, le pointeur de branche avance
Un commit pointe vers le commit parent
82ea19 cd27e1 98173c
master
17
Création d’une nouvelle branche
Une nouvelle branche est créée avec « git branch name »
1 $ git branch test
82ea19 cd27e1 98173c
master
test
18
Branche courante
La commande « git branch » liste les branches existantes
1 $ git branch
2 * master
3 test
La branche courante est identifiée par HEAD
82ea19 cd27e1 98173c
master
test
HEAD
19
Changer de branche
La commande « git checkout name » change de branche
1 $ git checkout test
2 Switched to branch ’test ’
La branche courante est identifiée par HEAD
82ea19 cd27e1 98173c
master
testHEAD
20
Commit sur une branche
Un commit va toujours se faire sur la branche courante
1 ...
2 $ git commit ...
3 $ git checkout master
4 ...
5 $ git commit ...
82ea19 cd27e1 98173c
master
testHEAD
21
Commit sur une branche
Un commit va toujours se faire sur la branche courante
1 ...
2 $ git commit ...
3 $ git checkout master
4 ...
5 $ git commit ...
82ea19 cd27e1 98173c
ab716e
master
testHEAD
21
Commit sur une branche
Un commit va toujours se faire sur la branche courante
1 ...
2 $ git commit ...
3 $ git checkout master
4 ...
5 $ git commit ...
82ea19 cd27e1 98173c
ab716e 716ea4
master
testHEAD
21
Commit sur une branche
Un commit va toujours se faire sur la branche courante
1 ...
2 $ git commit ...
3 $ git checkout master
4 ...
5 $ git commit ...
82ea19 cd27e1 98173c
ab716e 716ea4
master
test
HEAD
21
Commit sur une branche
Un commit va toujours se faire sur la branche courante
1 ...
2 $ git commit ...
3 $ git checkout master
4 ...
5 $ git commit ...
82ea19 cd27e1 98173c
62eac3
ab716e 716ea4
test
masterHEAD
21
Opérations de base sur une branche
On peut supprimer une branche avec l’option -d
1 $ git branch -d test
2 Deleted branch test (was 617 a041).
On peut renommer une branche avec l’option -m
1 $ git branch
2 * master
3 test
4 $ git branch -m test alternative
5 $ git branch
6 alternative
7 * master
22
Plateforme GitHub
Plateforme d’hébergement de dépôts Git
Serveur public permettant le partage de code
Création gratuite d’un compte pour dépôts publics
https://github.com/
23
Déploiement de code
Déploiement
Installation, configuration et déploiement automatisé
Sur base d’un dépôt Git
Configuration de l’environnement d’exécution
Définition du script de lancement
25
Plateforme Heroku
Plateforme d’hébergement d’applications
Déploiement d’applications web et serveur en ligne
Création gratuite de dynos pour petites applications
https://www.heroku.com
26
Debugging
Debugging
Identification et correction de bugs
Erreur de syntaxe
Erreur d’exécution
Importance de faire des backups réguliers
Backup des versions fonctionnelles avec versioning
Pouvoir revenir à une version fonctionnelle
Identifier le code qui a introduit le bug
28
Erreur de syntaxe
Erreur de syntaxe décrite par trois éléments
Nom du fichier
Numéro de la ligne
La ligne contenant l’erreur avec un caret ^
1 def compute(n)
2 result = n
3 for i in range(n):
4 result += i
5 return result
$ python3 program.py
File program.py, line 1
def compute(n)
^
SyntaxError: invalid syntax
29
Erreur d’exécution (1)
Arrêt immédiat de l’exécution en cas d’erreur
Affichage de la trace d’exécution montrant les erreurs non gérées
1 def mean(data):
2 total = 0
3 for elem in data:
4 total += elem
5 return total / len(data)
6
7 print(mean ([1, 2, 3]))
8 print(mean ([]))
$ python3 program.py
2.0
Traceback (most recent call last):
File program.py, line 8, in module 
print(mean ([]))
File program.py, line 5, in mean
return total / len(data)
ZeroDivisionError : division by zero
30
Erreur d’exécution (2)
La trace d’exécution montre où l’erreur est apparue
Et pas où elle s’est produite
L’erreur peut trouver son origine dans la librairie standard
Ou dans toute autre librairie utilisée
Bon réflexe d’examiner les dernières lignes de la trace
Ce sont les lignes relatives au code de l’utilisateur
31
Chasser et tuer un bug
Méthode scientifique de debugging
1 Reproduire le bug (Reproduce)
2 Localiser le bug (Locate)
3 Corriger le bug (Fix)
4 Tester le correctif (Test)
Utilisation des tests unitaires pour faciliter le processus
Pour s’assurer que le correctif n’a pas introduit de nouveau bug
32
Debugguer
Utilisation de la fonction print pour debugguer
Pas pratique car pollue le code du programme
Utilisation du module pdb
Exécution pas à pas du programme
Inspection de la mémoire
33
Module pdb
1 import pdb
2 pdb.set_trace ()
3
4 a = 0
5 print (25 / a)
python3 program.py
 /Users/combefis/Desktop/program.py (4) module ()
- a = 0
(Pdb) s
 /Users/combefis/Desktop/program.py (5) module ()
- print (25 / a)
(Pdb)
ZeroDivisionError : division by zero
 /Users/combefis/Desktop/program.py (5) module ()
- print (25 / a)
(Pdb) p a
0
(Pdb) c
Traceback (most recent call last):
File program.py, line 5, in module 
print (25 / a)
ZeroDivisionError : division by zero
34
Profiling
Profiling
Vérification de la consommation de ressources
Programme trop lent avec un goulot d’étranglement
Consommation excessive de mémoire avec fuites
Plusieurs causes possibles
Choix d’un algorithme inapproprié
Choix d’une structure de données inadaptées
“Premature optimization is the root of all evil.” — C.A.R. Hoare
36
Quelques tuyaux Python (1)
1 Préférez les tuples aux listes
Lorsqu’il vous faut une séquence à utiliser en lecture seule
2 Utilisez des générateurs plutôt que de grosses séquences
Permet une lazy evaluation des éléments de la séquence
3 Utilisez les structures de données prédéfinies de Python
Dictionnaires (dict), listes (list), tuples (tuples)
37
Quelques tuyaux Python (2)
4 Créez les longues chaine de caractères avec join
Accumuler les chaines dans une liste plutôt que de concaténer
5 Stockez une référence vers un objet souvent utilisé
Pour une fonction depuis un module, une méthode sur un objet...
38
Mesure de performances
Mesure de temps avec le module timeit
Mesurer le temps d’exécution de petites portions de code
Établissement du profil d’un programme avec profile
Profiler les performances d’un programme
39
Module timeit
Création d’un objet timeit.Timer
Avec le code à mesurer et le code à exécuter avant
Lancer l’exécution et la mesure avec la méthode timeit
Avec le nombre de répétitions à faire en paramètre
1 import timeit
2
3 def compute(n):
4 result = n
5 for i in range(n):
6 result += i
7 return result
8
9 repeats = 1000
10 t = timeit.Timer(compute (2000), from __main__ import compute)
11 sec = t.timeit(repeats) / repeats
12 print(’{} secondes ’.format(sec))
40
timeit en ligne de commande
Mesure du temps d’exécution en ligne de commande
Pour éviter de devoir instrumenter son code
Mesure le temps d’exécution de l’exécution d’un code
Code à exécuter spécifié en paramètre
$ python3 -m timeit -n 1000 -s from program import compute
compute (2000)
1000 loops , best of 3: 170 usec per loop
41
Module profile
Appel de la fonction run du module profile
Il faut mettre la boucle directement dans l’appel
Affichage du profil complet des appels
1 import profile
2
3 def compute(n):
4 result = n
5 for i in range(n):
6 result += i
7 return result
8
9 profile.run(for i in range (1000): compute (2000))
42
profile en ligne de commande
Établissement du profil de performance d’un programme
Exécute un programme et mesure le temps passé dans les appels
$ python3 -m profile program.py
1261 function calls (1258 primitive calls) in 0.155 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
[...]
1 0.000 0.000 0.000 0.000 profile.py :104( Profile)
1 0.000 0.000 0.000 0.000 profile.py :350( fake_code)
1 0.000 0.000 0.000 0.000 profile.py :360( fake_frame)
1 0.000 0.000 0.000 0.000 profile.py :43( _Utils)
1 0.000 0.000 0.000 0.000 profile.py:9( module )
1 0.000 0.000 0.155 0.155 profile :0( code object 
module  at 0x10a791c00 , file testE.py, line 1)
0 0.000 0.000 profile :0( profiler)
1 0.002 0.002 0.155 0.155 program.py:1( module )
1000 0.151 0.000 0.151 0.000 program.py :3( compute)
43
Test unitaire
Testing
Nécessité de tester qu’un programme fait bien ce qu’il faut
Définir ce que le programme doit faire
Écrire un jeu de tests pour vérifier le programme
Impossible de garantir l’exactitude d’un programme
On ne peut pas tester tous les scénarios possibles
Amélioration de la qualité de code
Un jeu de tests bien choisi diminue le nombre de bugs potentiels
45
Types de test
Test utilisateur (usability testing)
Évaluer un programme par des tests utilisateurs (ergonomie...)
Test fonctionnel (functional testing)
Assurance qualité (QA) et test black-box sur les spécifications
Test d’intégration (integration testing)
Vérification des performances et de la fiabilité du programme
46
Test unitaire
Test individuel d’une unité dans le code
Une fonction, une classe ou une méthode
Définition du test sur base d’une spécification du code
Étant donné les préconditions, vérifier les postconditions
Utilisé notamment en Test-Driven Development (TDD)
Technique de développement de logiciel piloté par les tests
47
Cycle TDD
Cycle en trois phases principales
Red–Green–Refactor
Red
Green Refactor
1. Écrire un test qui échoue
2. Faire fonctionner le code 3. Éliminer la redondance
48
Module doctest
Permet de tester le programme à partir de sa documentation
Test et solution attendue placé dans un docstring
Tests écrits comme un appel dans l’interpréteur interactif
1 def compute(n):
2 
3  compute (0)
4 0
5  compute (3)
6 6
7 
8 result = n
9 for i in range(n):
10 result += i
11 return result
49
doctest en ligne de commande
Exécution des tests avec résultats détaillés
Bilan global des tests exécutés à la fin de la sortie de l’exécution
$ python3 -m doctest -v program.py
Trying:
compute (0)
Expecting:
0
ok
Trying:
compute (3)
Expecting:
6
ok
1 items had no tests:
program
1 items passed all tests:
2 tests in program.compute
2 tests in 2 items.
2 passed and 0 failed.
Test passed.
50
Exécution des doctest avec unittest (1)
Exécuter les doctest directement en construisant un unittest
Plusieurs étapes à suivre
1 Création d’une suite de tests (TestSuite)
2 Ajout d’un test à la suite, de type doctest (DocTestSuite)
3 Création d’un exécuteur textuel (TextTestRunner)
4 Exécution des tests (run)
51
Exécution des doctest avec unittest (2)
Utilisation des modules doctest et unittest
Programme à placer dans un fichier séparé
1 import doctest
2 import unittest
3 import program
4
5 suite = unittest.TestSuite ()
6 suite.addTest(doctest. DocTestSuite (program))
7 runner = unittest. TextTestRunner ()
8 print(runner.run(suite))
$ python3 test_testE.py
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
unittest.runner. TextTestResult run =1 errors =0 failures =0
52
Module unittest
Séparation claire entre les tests et le code à tester
Utile lorsque code et tests pas rédigés par les mêmes personnes
Quatre concepts clés
1 Test fixture pour initialiser et nettoyer un test
2 Test suite est un ensemble de test cases
3 Test case est l’unité de base des tests
4 Test runner permet d’exécuter des suites de tests
53
Classe de test (1)
Une suite de tests se définit à partir d’une classe de test
Classe « spéciale » construite sur base de unittest.TestCase
Utilisation de méthodes prédéfinies pour exprimer les tests
Expression de la valeur attendue d’exécution de code
Méthode Description Test
assertTrue(x) Affirme que x est vrai bool(x) is True
assertEqual(a, b) Affirme que a et b sont égaux a == b
assertIs(a, b) Affirme que a et b sont identiques a is b
assertIsNone(x) Affirme que x est None x is None
assertIn(a, b) Affirme que a se trouve dans b a in b
assertIsInstance(a, b) Affirme que a est une instance de b isinstance(a, b)
Et aussi assertFalse, assertNotEqual, assertIsNot, assertIsNotNone, assertNotIn
et assertNotIsInstance...
54
Classe de test (2)
1 import unittest
2 import program
3
4 class Test(unittest.TestCase):
5 def test_compute (self):
6 self.assertEqual (program.compute (0), 0)
7 self.assertEqual (program.compute (-2), -1)
8
9 suite = unittest.TestLoader (). loadTestsFromTestCase (Test)
10 runner = unittest. TextTestRunner ()
11 print(runner.run(suite))
$ python3 test_program .py
F
======================================================================
FAIL: test_compute (__main__.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File  test_program .py, line 7, in test_compute
self. assertEqual (testE.compute (-2), -1)
AssertionError : -2 != -1
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (failures =1)
unittest.runner. TextTestResult run =1 errors =0 failures =1
55
Initialisation et nettoyage
Initialisation avant et nettoyage après exécution de chaque test
Via les méthodes setUp et tearDown
1 class Test(unittest.TestCase):
2 def setUp(self):
3 # Code exécuté avant chaque test
4
5 def tearDown(self):
6 # Code exécuté après chaque test
56
Plateforme Travis
Plateforme d’exécution automatique de tests
Code automatiquement rapatrié depuis GitHub par exemple
Création gratuite d’un compte pour tester des dépôts publics
https://travis-ci.org/
57
Configuration de Travis
Création d’un fichier .travis.yml pour la configuration
Language de programmation
Version spécifique
Script à exécuter
1 language: python
2 python:
3 - 3.5
4 script: python3 test.py
58
Crédits
Photos des livres depuis Amazon
https://www.flickr.com/photos/jwhitesmith/7363049912
https://openclipart.org/detail/36565/tango-network-server-by-warszawianka
https://openclipart.org/detail/34531/tango-computer-by-warszawianka
https://www.flickr.com/photos/faisal_akram/8107449789
https://www.flickr.com/photos/rachel_s/9243714784
https://www.flickr.com/photos/110777427@N06/15632985383
https://www.flickr.com/photos/nasamarshall/21064480196
59

Más contenido relacionado

La actualidad más candente

Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationECAM Brussels Engineering School
 
Développement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulièresDéveloppement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulièresECAM Brussels Engineering School
 
Développement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreDéveloppement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreECAM Brussels Engineering School
 
Incorporer du C dans R, créer son package
Incorporer du C dans R, créer son packageIncorporer du C dans R, créer son package
Incorporer du C dans R, créer son packageCdiscount
 
Python For Data Science - French Course
Python For Data Science - French CoursePython For Data Science - French Course
Python For Data Science - French CourseHaytam EL YOUSSFI
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancépierrepo
 
Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++cppfrug
 

La actualidad más candente (20)

Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulation
 
Johnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScriptJohnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScript
 
Tests unitaires : Utilisation de la librairie CUnit
Tests unitaires : Utilisation de la librairie CUnitTests unitaires : Utilisation de la librairie CUnit
Tests unitaires : Utilisation de la librairie CUnit
 
Développement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulièresDéveloppement informatique : Chaines de caractères et expressions regulières
Développement informatique : Chaines de caractères et expressions regulières
 
Qualité de code et bonnes pratiques
Qualité de code et bonnes pratiquesQualité de code et bonnes pratiques
Qualité de code et bonnes pratiques
 
Python avancé : Qualité de code et convention de codage
Python avancé : Qualité de code et convention de codagePython avancé : Qualité de code et convention de codage
Python avancé : Qualité de code et convention de codage
 
Héritage et redéfinition de méthode
Héritage et redéfinition de méthodeHéritage et redéfinition de méthode
Héritage et redéfinition de méthode
 
Formation python
Formation pythonFormation python
Formation python
 
Composition, agrégation et immuabilité
Composition, agrégation et immuabilitéComposition, agrégation et immuabilité
Composition, agrégation et immuabilité
 
Python avancé : Tuple et objet
Python avancé : Tuple et objetPython avancé : Tuple et objet
Python avancé : Tuple et objet
 
Développement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbreDéveloppement informatique : Algorithmique I : Récursion et arbre
Développement informatique : Algorithmique I : Récursion et arbre
 
Type abstrait de données
Type abstrait de donnéesType abstrait de données
Type abstrait de données
 
Incorporer du C dans R, créer son package
Incorporer du C dans R, créer son packageIncorporer du C dans R, créer son package
Incorporer du C dans R, créer son package
 
Polymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraitePolymorphisme, interface et classe abstraite
Polymorphisme, interface et classe abstraite
 
Python For Data Science - French Course
Python For Data Science - French CoursePython For Data Science - French Course
Python For Data Science - French Course
 
Développement informatique : Programmation réseau
Développement informatique : Programmation réseauDéveloppement informatique : Programmation réseau
Développement informatique : Programmation réseau
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancé
 
Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
 
Python avancé : Classe et objet
Python avancé : Classe et objetPython avancé : Classe et objet
Python avancé : Classe et objet
 

Destacado

Découvrir et utiliser Git : le logiciel de gestion de versions décentralisé
Découvrir et utiliser Git : le logiciel de gestion de versions décentraliséDécouvrir et utiliser Git : le logiciel de gestion de versions décentralisé
Découvrir et utiliser Git : le logiciel de gestion de versions décentraliséECAM Brussels Engineering School
 
Programmation de systèmes embarqués : Bus et périphériques de communication
Programmation de systèmes embarqués : Bus et périphériques de communicationProgrammation de systèmes embarqués : Bus et périphériques de communication
Programmation de systèmes embarqués : Bus et périphériques de communicationECAM Brussels Engineering School
 
Programmation de systèmes embarqués : Systèmes temps réel et PRUSS
Programmation de systèmes embarqués : Systèmes temps réel et PRUSSProgrammation de systèmes embarqués : Systèmes temps réel et PRUSS
Programmation de systèmes embarqués : Systèmes temps réel et PRUSSECAM Brussels Engineering School
 
la contribution de la résilience organisationnelle et l'agilité organisationn...
la contribution de la résilience organisationnelle et l'agilité organisationn...la contribution de la résilience organisationnelle et l'agilité organisationn...
la contribution de la résilience organisationnelle et l'agilité organisationn...najwa sabouk
 
Introduction à LaTeX : le système de composition professionnel
Introduction à LaTeX : le système de composition professionnelIntroduction à LaTeX : le système de composition professionnel
Introduction à LaTeX : le système de composition professionnelECAM Brussels Engineering School
 
Programmation de systèmes embarqués : Internet of Things : système connecté e...
Programmation de systèmes embarqués : Internet of Things : système connecté e...Programmation de systèmes embarqués : Internet of Things : système connecté e...
Programmation de systèmes embarqués : Internet of Things : système connecté e...ECAM Brussels Engineering School
 
Programmation de systèmes embarqués : BeagleBone Black et Linux embarqué
Programmation de systèmes embarqués : BeagleBone Black et Linux embarquéProgrammation de systèmes embarqués : BeagleBone Black et Linux embarqué
Programmation de systèmes embarqués : BeagleBone Black et Linux embarquéECAM Brussels Engineering School
 
De la Terre aux Étoiles : Mesure des distances Terre-Étoile
De la Terre aux Étoiles : Mesure des distances Terre-ÉtoileDe la Terre aux Étoiles : Mesure des distances Terre-Étoile
De la Terre aux Étoiles : Mesure des distances Terre-ÉtoileECAM Brussels Engineering School
 

Destacado (13)

Découvrir et utiliser Git : le logiciel de gestion de versions décentralisé
Découvrir et utiliser Git : le logiciel de gestion de versions décentraliséDécouvrir et utiliser Git : le logiciel de gestion de versions décentralisé
Découvrir et utiliser Git : le logiciel de gestion de versions décentralisé
 
Programmation de systèmes embarqués : Bus et périphériques de communication
Programmation de systèmes embarqués : Bus et périphériques de communicationProgrammation de systèmes embarqués : Bus et périphériques de communication
Programmation de systèmes embarqués : Bus et périphériques de communication
 
Comment Internet fonctionne-t-il ?
Comment Internet fonctionne-t-il ?Comment Internet fonctionne-t-il ?
Comment Internet fonctionne-t-il ?
 
Programmation de systèmes embarqués : Systèmes temps réel et PRUSS
Programmation de systèmes embarqués : Systèmes temps réel et PRUSSProgrammation de systèmes embarqués : Systèmes temps réel et PRUSS
Programmation de systèmes embarqués : Systèmes temps réel et PRUSS
 
la contribution de la résilience organisationnelle et l'agilité organisationn...
la contribution de la résilience organisationnelle et l'agilité organisationn...la contribution de la résilience organisationnelle et l'agilité organisationn...
la contribution de la résilience organisationnelle et l'agilité organisationn...
 
Introduction à LaTeX : le système de composition professionnel
Introduction à LaTeX : le système de composition professionnelIntroduction à LaTeX : le système de composition professionnel
Introduction à LaTeX : le système de composition professionnel
 
Programmation de systèmes embarqués : Internet of Things : système connecté e...
Programmation de systèmes embarqués : Internet of Things : système connecté e...Programmation de systèmes embarqués : Internet of Things : système connecté e...
Programmation de systèmes embarqués : Internet of Things : système connecté e...
 
Introduction à la formation Digitalent
Introduction à la formation DigitalentIntroduction à la formation Digitalent
Introduction à la formation Digitalent
 
HTML, CSS et Javascript
HTML, CSS et JavascriptHTML, CSS et Javascript
HTML, CSS et Javascript
 
Arbre et algorithme de recherche
Arbre et algorithme de rechercheArbre et algorithme de recherche
Arbre et algorithme de recherche
 
Programmation de systèmes embarqués : BeagleBone Black et Linux embarqué
Programmation de systèmes embarqués : BeagleBone Black et Linux embarquéProgrammation de systèmes embarqués : BeagleBone Black et Linux embarqué
Programmation de systèmes embarqués : BeagleBone Black et Linux embarqué
 
Modélisation avec UML
Modélisation avec UMLModélisation avec UML
Modélisation avec UML
 
De la Terre aux Étoiles : Mesure des distances Terre-Étoile
De la Terre aux Étoiles : Mesure des distances Terre-ÉtoileDe la Terre aux Étoiles : Mesure des distances Terre-Étoile
De la Terre aux Étoiles : Mesure des distances Terre-Étoile
 

Similar a Développement informatique : Gestion de projet, versioning, debugging, testing et profiling

Cours sur github part3 git
Cours sur github part3 gitCours sur github part3 git
Cours sur github part3 gitPape Diop
 
C2 - Langage C - ISIMA 1 - Deuxieme partie
C2 - Langage C - ISIMA 1 - Deuxieme partieC2 - Langage C - ISIMA 1 - Deuxieme partie
C2 - Langage C - ISIMA 1 - Deuxieme partieLoic Yon
 
JCertif 2012 : Git par la pratique
JCertif 2012 : Git par la pratiqueJCertif 2012 : Git par la pratique
JCertif 2012 : Git par la pratiqueRossi Oddet
 
Paris Web 2015 - Atelier désendettement Javascript legacy
Paris Web 2015 - Atelier désendettement Javascript legacyParis Web 2015 - Atelier désendettement Javascript legacy
Paris Web 2015 - Atelier désendettement Javascript legacyFrançois Petitit
 
Chaine de production pipeline
Chaine de production   pipelineChaine de production   pipeline
Chaine de production pipelineNicolas wallerand
 
Symphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureSymphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureJonathan Bonzy
 
Symphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureSymphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureMarc Nazarian
 
Git utilisation quotidienne
Git   utilisation quotidienneGit   utilisation quotidienne
Git utilisation quotidienneSylvain Witmeyer
 
Objets connectés WLAN et ESP32 ou WPAN et bananapi et nrf24-l01+
Objets connectés WLAN et ESP32  ou WPAN et bananapi et nrf24-l01+Objets connectés WLAN et ESP32  ou WPAN et bananapi et nrf24-l01+
Objets connectés WLAN et ESP32 ou WPAN et bananapi et nrf24-l01+Jl Salvat
 
Organiser son CI/CD - présentation
Organiser son CI/CD - présentation Organiser son CI/CD - présentation
Organiser son CI/CD - présentation Julien Garderon
 
Présentation de git
Présentation de gitPrésentation de git
Présentation de gitJulien Blin
 
Paris Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascriptParis Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascriptMichael Akbaraly
 
Python application packaging @ MeilleursAgents
Python application packaging @ MeilleursAgentsPython application packaging @ MeilleursAgents
Python application packaging @ MeilleursAgentsNicolas Mussat
 
Techniques de programmation avancée LabVIEW : gestion des données de la local...
Techniques de programmation avancée LabVIEW : gestion des données de la local...Techniques de programmation avancée LabVIEW : gestion des données de la local...
Techniques de programmation avancée LabVIEW : gestion des données de la local...Luc Desruelle
 
Sizing PoC LSF & PowerAI for Engineers schools workloads
Sizing PoC LSF & PowerAI for Engineers schools workloadsSizing PoC LSF & PowerAI for Engineers schools workloads
Sizing PoC LSF & PowerAI for Engineers schools workloadsPhilippeBrogi
 
Les Nouveautés de zabbix 2.2 par Alain Ganuchaud
Les Nouveautés de zabbix 2.2 par Alain GanuchaudLes Nouveautés de zabbix 2.2 par Alain Ganuchaud
Les Nouveautés de zabbix 2.2 par Alain GanuchaudAlain Ganuchaud
 
Support Formation Samsung - Python - Session 1 - 2022.pptx
Support Formation Samsung - Python - Session 1 - 2022.pptxSupport Formation Samsung - Python - Session 1 - 2022.pptx
Support Formation Samsung - Python - Session 1 - 2022.pptxbpmana
 

Similar a Développement informatique : Gestion de projet, versioning, debugging, testing et profiling (20)

Cours sur github part3 git
Cours sur github part3 gitCours sur github part3 git
Cours sur github part3 git
 
Git
GitGit
Git
 
3_SCM_Git.pdf
3_SCM_Git.pdf3_SCM_Git.pdf
3_SCM_Git.pdf
 
Versioning avec Git
Versioning avec GitVersioning avec Git
Versioning avec Git
 
C2 - Langage C - ISIMA 1 - Deuxieme partie
C2 - Langage C - ISIMA 1 - Deuxieme partieC2 - Langage C - ISIMA 1 - Deuxieme partie
C2 - Langage C - ISIMA 1 - Deuxieme partie
 
JCertif 2012 : Git par la pratique
JCertif 2012 : Git par la pratiqueJCertif 2012 : Git par la pratique
JCertif 2012 : Git par la pratique
 
Paris Web 2015 - Atelier désendettement Javascript legacy
Paris Web 2015 - Atelier désendettement Javascript legacyParis Web 2015 - Atelier désendettement Javascript legacy
Paris Web 2015 - Atelier désendettement Javascript legacy
 
Chaine de production pipeline
Chaine de production   pipelineChaine de production   pipeline
Chaine de production pipeline
 
Symphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureSymphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeure
 
Symphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeureSymphonie pour PHP industrialisé en agilité majeure
Symphonie pour PHP industrialisé en agilité majeure
 
Git utilisation quotidienne
Git   utilisation quotidienneGit   utilisation quotidienne
Git utilisation quotidienne
 
Objets connectés WLAN et ESP32 ou WPAN et bananapi et nrf24-l01+
Objets connectés WLAN et ESP32  ou WPAN et bananapi et nrf24-l01+Objets connectés WLAN et ESP32  ou WPAN et bananapi et nrf24-l01+
Objets connectés WLAN et ESP32 ou WPAN et bananapi et nrf24-l01+
 
Organiser son CI/CD - présentation
Organiser son CI/CD - présentation Organiser son CI/CD - présentation
Organiser son CI/CD - présentation
 
Présentation de git
Présentation de gitPrésentation de git
Présentation de git
 
Paris Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascriptParis Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascript
 
Python application packaging @ MeilleursAgents
Python application packaging @ MeilleursAgentsPython application packaging @ MeilleursAgents
Python application packaging @ MeilleursAgents
 
Techniques de programmation avancée LabVIEW : gestion des données de la local...
Techniques de programmation avancée LabVIEW : gestion des données de la local...Techniques de programmation avancée LabVIEW : gestion des données de la local...
Techniques de programmation avancée LabVIEW : gestion des données de la local...
 
Sizing PoC LSF & PowerAI for Engineers schools workloads
Sizing PoC LSF & PowerAI for Engineers schools workloadsSizing PoC LSF & PowerAI for Engineers schools workloads
Sizing PoC LSF & PowerAI for Engineers schools workloads
 
Les Nouveautés de zabbix 2.2 par Alain Ganuchaud
Les Nouveautés de zabbix 2.2 par Alain GanuchaudLes Nouveautés de zabbix 2.2 par Alain Ganuchaud
Les Nouveautés de zabbix 2.2 par Alain Ganuchaud
 
Support Formation Samsung - Python - Session 1 - 2022.pptx
Support Formation Samsung - Python - Session 1 - 2022.pptxSupport Formation Samsung - Python - Session 1 - 2022.pptx
Support Formation Samsung - Python - Session 1 - 2022.pptx
 

Développement informatique : Gestion de projet, versioning, debugging, testing et profiling

  • 1. PI2T Développement informatique Séance 1 Gestion de projet, versioning, debugging, testing et profiling Sébastien Combéfis, Quentin Lurkin 1 février 2016
  • 2. Ce(tte) œuvre est mise à disposition selon les termes de la Licence Creative Commons Attribution – Pas d’Utilisation Commerciale – Pas de Modification 4.0 International.
  • 3. Informations générales (1) PI2T Développement informatique Approfondissement du Python 10 cours de 1h30 (15 heures) PI2L Projets de développement informatique Développement d’une intelligence artificielle pour un jeu 8 labos de 3h30 (28 heures) PN2L Application de méthodes numériques Utilisation de libariries de calculs numériques 4 labos de 3h30 (14 heures) 3
  • 4. Informations générales (2) Documents utilisés sont sur Eole (slides et énoncés des labos) Évaluation Examen écrit (PI2T) : 30% Labo (PI2L) : 45% (projets) Labo (PN2L) : 25% (évaluation continue et test final) Enseignants Sébastien Combéfis (s.combefis@ecam.be) Francis Gueuning (f.gueuning@ecam.be) André Lorge (a.lorge@ecam.be) Quentin Lurkin (q.lurkin@ecam.be) 4
  • 6. Objectifs Gestion du code source et déploiement Versioning de code et exemple avec GitHub Déploiement de code et exemple avec Heroku Test et analyse du code source Debugging et comprendre les erreurs Profiling et test de performance Unit testing et exemple avec Travis 6
  • 8. Source Code Management Pour tout projet informatique, il faut une stratégie de backup On ajoute souvent une gestion des versions Un développeur peut proposer plusieurs révisions par jour Source Code Manager (SCM) Version Control System (VCS) Revision Control System (RCS) 8
  • 9. Buts d’un gestionnaire de versions Gestion d’un projet de programmation Garder l’historique de toutes les modifications Travail en équipe Support de branches de développement 9
  • 10. Git Système inventé par Linus Torvalds pour le kernel Linux Git a vu le jour en avril 2005 Premier commit le 8 avril Logiciel de gestion de versions décentralisé Connexion internet uniquement pour les pull et push 10
  • 11. Prononciation [ gít ] [ jít ] 11
  • 12. Prononciation [ gít ] [ jít ] 11
  • 13. Git avec un serveur central Accès en écriture pour tous les développeurs Serveur central Développeur A Développeur B push pull pull push 12
  • 14. Git décentralisé Accès en écriture seulement pour les mainteneurs Les contributeurs font des pull requests Serveur Contributeur Serveur principal Mainteneur push pull push pull request 13
  • 15. États des fichiers (1) Un fichier doit être explicitement ajouté au dépôt Git Untracked Modified Staged Committed git add git commit Espace de travail Zone de transit Dépôt Git 14
  • 16. États des fichiers (2) Untracked/Modified Nouveaux fichiers ou fichiers modifiés Pas pris en compte pour le prochain commit Staged Fichiers ajoutés, modifiés, supprimés ou déplacés Pris en compte pour le prochain commit Unmodified/Committed Aucune modification pour le prochain commit 15
  • 17. Commandes de base Ajouter un fichier dans la zone de transit git add fichier Obtenir l’état des fichiers git status Valider les modifications en créant un commit git commit -m Titre du commit Obtenir l’historique des commits git log 16
  • 18. Le concept de branche Une branche pointe vers un commit À chaque nouveau commit, le pointeur de branche avance Un commit pointe vers le commit parent 82ea19 master 17
  • 19. Le concept de branche Une branche pointe vers un commit À chaque nouveau commit, le pointeur de branche avance Un commit pointe vers le commit parent 82ea19 cd27e1 master 17
  • 20. Le concept de branche Une branche pointe vers un commit À chaque nouveau commit, le pointeur de branche avance Un commit pointe vers le commit parent 82ea19 cd27e1 98173c master 17
  • 21. Création d’une nouvelle branche Une nouvelle branche est créée avec « git branch name » 1 $ git branch test 82ea19 cd27e1 98173c master test 18
  • 22. Branche courante La commande « git branch » liste les branches existantes 1 $ git branch 2 * master 3 test La branche courante est identifiée par HEAD 82ea19 cd27e1 98173c master test HEAD 19
  • 23. Changer de branche La commande « git checkout name » change de branche 1 $ git checkout test 2 Switched to branch ’test ’ La branche courante est identifiée par HEAD 82ea19 cd27e1 98173c master testHEAD 20
  • 24. Commit sur une branche Un commit va toujours se faire sur la branche courante 1 ... 2 $ git commit ... 3 $ git checkout master 4 ... 5 $ git commit ... 82ea19 cd27e1 98173c master testHEAD 21
  • 25. Commit sur une branche Un commit va toujours se faire sur la branche courante 1 ... 2 $ git commit ... 3 $ git checkout master 4 ... 5 $ git commit ... 82ea19 cd27e1 98173c ab716e master testHEAD 21
  • 26. Commit sur une branche Un commit va toujours se faire sur la branche courante 1 ... 2 $ git commit ... 3 $ git checkout master 4 ... 5 $ git commit ... 82ea19 cd27e1 98173c ab716e 716ea4 master testHEAD 21
  • 27. Commit sur une branche Un commit va toujours se faire sur la branche courante 1 ... 2 $ git commit ... 3 $ git checkout master 4 ... 5 $ git commit ... 82ea19 cd27e1 98173c ab716e 716ea4 master test HEAD 21
  • 28. Commit sur une branche Un commit va toujours se faire sur la branche courante 1 ... 2 $ git commit ... 3 $ git checkout master 4 ... 5 $ git commit ... 82ea19 cd27e1 98173c 62eac3 ab716e 716ea4 test masterHEAD 21
  • 29. Opérations de base sur une branche On peut supprimer une branche avec l’option -d 1 $ git branch -d test 2 Deleted branch test (was 617 a041). On peut renommer une branche avec l’option -m 1 $ git branch 2 * master 3 test 4 $ git branch -m test alternative 5 $ git branch 6 alternative 7 * master 22
  • 30. Plateforme GitHub Plateforme d’hébergement de dépôts Git Serveur public permettant le partage de code Création gratuite d’un compte pour dépôts publics https://github.com/ 23
  • 32. Déploiement Installation, configuration et déploiement automatisé Sur base d’un dépôt Git Configuration de l’environnement d’exécution Définition du script de lancement 25
  • 33. Plateforme Heroku Plateforme d’hébergement d’applications Déploiement d’applications web et serveur en ligne Création gratuite de dynos pour petites applications https://www.heroku.com 26
  • 35. Debugging Identification et correction de bugs Erreur de syntaxe Erreur d’exécution Importance de faire des backups réguliers Backup des versions fonctionnelles avec versioning Pouvoir revenir à une version fonctionnelle Identifier le code qui a introduit le bug 28
  • 36. Erreur de syntaxe Erreur de syntaxe décrite par trois éléments Nom du fichier Numéro de la ligne La ligne contenant l’erreur avec un caret ^ 1 def compute(n) 2 result = n 3 for i in range(n): 4 result += i 5 return result $ python3 program.py File program.py, line 1 def compute(n) ^ SyntaxError: invalid syntax 29
  • 37. Erreur d’exécution (1) Arrêt immédiat de l’exécution en cas d’erreur Affichage de la trace d’exécution montrant les erreurs non gérées 1 def mean(data): 2 total = 0 3 for elem in data: 4 total += elem 5 return total / len(data) 6 7 print(mean ([1, 2, 3])) 8 print(mean ([])) $ python3 program.py 2.0 Traceback (most recent call last): File program.py, line 8, in module print(mean ([])) File program.py, line 5, in mean return total / len(data) ZeroDivisionError : division by zero 30
  • 38. Erreur d’exécution (2) La trace d’exécution montre où l’erreur est apparue Et pas où elle s’est produite L’erreur peut trouver son origine dans la librairie standard Ou dans toute autre librairie utilisée Bon réflexe d’examiner les dernières lignes de la trace Ce sont les lignes relatives au code de l’utilisateur 31
  • 39. Chasser et tuer un bug Méthode scientifique de debugging 1 Reproduire le bug (Reproduce) 2 Localiser le bug (Locate) 3 Corriger le bug (Fix) 4 Tester le correctif (Test) Utilisation des tests unitaires pour faciliter le processus Pour s’assurer que le correctif n’a pas introduit de nouveau bug 32
  • 40. Debugguer Utilisation de la fonction print pour debugguer Pas pratique car pollue le code du programme Utilisation du module pdb Exécution pas à pas du programme Inspection de la mémoire 33
  • 41. Module pdb 1 import pdb 2 pdb.set_trace () 3 4 a = 0 5 print (25 / a) python3 program.py /Users/combefis/Desktop/program.py (4) module () - a = 0 (Pdb) s /Users/combefis/Desktop/program.py (5) module () - print (25 / a) (Pdb) ZeroDivisionError : division by zero /Users/combefis/Desktop/program.py (5) module () - print (25 / a) (Pdb) p a 0 (Pdb) c Traceback (most recent call last): File program.py, line 5, in module print (25 / a) ZeroDivisionError : division by zero 34
  • 43. Profiling Vérification de la consommation de ressources Programme trop lent avec un goulot d’étranglement Consommation excessive de mémoire avec fuites Plusieurs causes possibles Choix d’un algorithme inapproprié Choix d’une structure de données inadaptées “Premature optimization is the root of all evil.” — C.A.R. Hoare 36
  • 44. Quelques tuyaux Python (1) 1 Préférez les tuples aux listes Lorsqu’il vous faut une séquence à utiliser en lecture seule 2 Utilisez des générateurs plutôt que de grosses séquences Permet une lazy evaluation des éléments de la séquence 3 Utilisez les structures de données prédéfinies de Python Dictionnaires (dict), listes (list), tuples (tuples) 37
  • 45. Quelques tuyaux Python (2) 4 Créez les longues chaine de caractères avec join Accumuler les chaines dans une liste plutôt que de concaténer 5 Stockez une référence vers un objet souvent utilisé Pour une fonction depuis un module, une méthode sur un objet... 38
  • 46. Mesure de performances Mesure de temps avec le module timeit Mesurer le temps d’exécution de petites portions de code Établissement du profil d’un programme avec profile Profiler les performances d’un programme 39
  • 47. Module timeit Création d’un objet timeit.Timer Avec le code à mesurer et le code à exécuter avant Lancer l’exécution et la mesure avec la méthode timeit Avec le nombre de répétitions à faire en paramètre 1 import timeit 2 3 def compute(n): 4 result = n 5 for i in range(n): 6 result += i 7 return result 8 9 repeats = 1000 10 t = timeit.Timer(compute (2000), from __main__ import compute) 11 sec = t.timeit(repeats) / repeats 12 print(’{} secondes ’.format(sec)) 40
  • 48. timeit en ligne de commande Mesure du temps d’exécution en ligne de commande Pour éviter de devoir instrumenter son code Mesure le temps d’exécution de l’exécution d’un code Code à exécuter spécifié en paramètre $ python3 -m timeit -n 1000 -s from program import compute compute (2000) 1000 loops , best of 3: 170 usec per loop 41
  • 49. Module profile Appel de la fonction run du module profile Il faut mettre la boucle directement dans l’appel Affichage du profil complet des appels 1 import profile 2 3 def compute(n): 4 result = n 5 for i in range(n): 6 result += i 7 return result 8 9 profile.run(for i in range (1000): compute (2000)) 42
  • 50. profile en ligne de commande Établissement du profil de performance d’un programme Exécute un programme et mesure le temps passé dans les appels $ python3 -m profile program.py 1261 function calls (1258 primitive calls) in 0.155 seconds Ordered by: standard name ncalls tottime percall cumtime percall filename:lineno(function) [...] 1 0.000 0.000 0.000 0.000 profile.py :104( Profile) 1 0.000 0.000 0.000 0.000 profile.py :350( fake_code) 1 0.000 0.000 0.000 0.000 profile.py :360( fake_frame) 1 0.000 0.000 0.000 0.000 profile.py :43( _Utils) 1 0.000 0.000 0.000 0.000 profile.py:9( module ) 1 0.000 0.000 0.155 0.155 profile :0( code object module at 0x10a791c00 , file testE.py, line 1) 0 0.000 0.000 profile :0( profiler) 1 0.002 0.002 0.155 0.155 program.py:1( module ) 1000 0.151 0.000 0.151 0.000 program.py :3( compute) 43
  • 52. Testing Nécessité de tester qu’un programme fait bien ce qu’il faut Définir ce que le programme doit faire Écrire un jeu de tests pour vérifier le programme Impossible de garantir l’exactitude d’un programme On ne peut pas tester tous les scénarios possibles Amélioration de la qualité de code Un jeu de tests bien choisi diminue le nombre de bugs potentiels 45
  • 53. Types de test Test utilisateur (usability testing) Évaluer un programme par des tests utilisateurs (ergonomie...) Test fonctionnel (functional testing) Assurance qualité (QA) et test black-box sur les spécifications Test d’intégration (integration testing) Vérification des performances et de la fiabilité du programme 46
  • 54. Test unitaire Test individuel d’une unité dans le code Une fonction, une classe ou une méthode Définition du test sur base d’une spécification du code Étant donné les préconditions, vérifier les postconditions Utilisé notamment en Test-Driven Development (TDD) Technique de développement de logiciel piloté par les tests 47
  • 55. Cycle TDD Cycle en trois phases principales Red–Green–Refactor Red Green Refactor 1. Écrire un test qui échoue 2. Faire fonctionner le code 3. Éliminer la redondance 48
  • 56. Module doctest Permet de tester le programme à partir de sa documentation Test et solution attendue placé dans un docstring Tests écrits comme un appel dans l’interpréteur interactif 1 def compute(n): 2 3 compute (0) 4 0 5 compute (3) 6 6 7 8 result = n 9 for i in range(n): 10 result += i 11 return result 49
  • 57. doctest en ligne de commande Exécution des tests avec résultats détaillés Bilan global des tests exécutés à la fin de la sortie de l’exécution $ python3 -m doctest -v program.py Trying: compute (0) Expecting: 0 ok Trying: compute (3) Expecting: 6 ok 1 items had no tests: program 1 items passed all tests: 2 tests in program.compute 2 tests in 2 items. 2 passed and 0 failed. Test passed. 50
  • 58. Exécution des doctest avec unittest (1) Exécuter les doctest directement en construisant un unittest Plusieurs étapes à suivre 1 Création d’une suite de tests (TestSuite) 2 Ajout d’un test à la suite, de type doctest (DocTestSuite) 3 Création d’un exécuteur textuel (TextTestRunner) 4 Exécution des tests (run) 51
  • 59. Exécution des doctest avec unittest (2) Utilisation des modules doctest et unittest Programme à placer dans un fichier séparé 1 import doctest 2 import unittest 3 import program 4 5 suite = unittest.TestSuite () 6 suite.addTest(doctest. DocTestSuite (program)) 7 runner = unittest. TextTestRunner () 8 print(runner.run(suite)) $ python3 test_testE.py . ---------------------------------------------------------------------- Ran 1 test in 0.001s OK unittest.runner. TextTestResult run =1 errors =0 failures =0 52
  • 60. Module unittest Séparation claire entre les tests et le code à tester Utile lorsque code et tests pas rédigés par les mêmes personnes Quatre concepts clés 1 Test fixture pour initialiser et nettoyer un test 2 Test suite est un ensemble de test cases 3 Test case est l’unité de base des tests 4 Test runner permet d’exécuter des suites de tests 53
  • 61. Classe de test (1) Une suite de tests se définit à partir d’une classe de test Classe « spéciale » construite sur base de unittest.TestCase Utilisation de méthodes prédéfinies pour exprimer les tests Expression de la valeur attendue d’exécution de code Méthode Description Test assertTrue(x) Affirme que x est vrai bool(x) is True assertEqual(a, b) Affirme que a et b sont égaux a == b assertIs(a, b) Affirme que a et b sont identiques a is b assertIsNone(x) Affirme que x est None x is None assertIn(a, b) Affirme que a se trouve dans b a in b assertIsInstance(a, b) Affirme que a est une instance de b isinstance(a, b) Et aussi assertFalse, assertNotEqual, assertIsNot, assertIsNotNone, assertNotIn et assertNotIsInstance... 54
  • 62. Classe de test (2) 1 import unittest 2 import program 3 4 class Test(unittest.TestCase): 5 def test_compute (self): 6 self.assertEqual (program.compute (0), 0) 7 self.assertEqual (program.compute (-2), -1) 8 9 suite = unittest.TestLoader (). loadTestsFromTestCase (Test) 10 runner = unittest. TextTestRunner () 11 print(runner.run(suite)) $ python3 test_program .py F ====================================================================== FAIL: test_compute (__main__.Test) ---------------------------------------------------------------------- Traceback (most recent call last): File test_program .py, line 7, in test_compute self. assertEqual (testE.compute (-2), -1) AssertionError : -2 != -1 ---------------------------------------------------------------------- Ran 1 test in 0.000s FAILED (failures =1) unittest.runner. TextTestResult run =1 errors =0 failures =1 55
  • 63. Initialisation et nettoyage Initialisation avant et nettoyage après exécution de chaque test Via les méthodes setUp et tearDown 1 class Test(unittest.TestCase): 2 def setUp(self): 3 # Code exécuté avant chaque test 4 5 def tearDown(self): 6 # Code exécuté après chaque test 56
  • 64. Plateforme Travis Plateforme d’exécution automatique de tests Code automatiquement rapatrié depuis GitHub par exemple Création gratuite d’un compte pour tester des dépôts publics https://travis-ci.org/ 57
  • 65. Configuration de Travis Création d’un fichier .travis.yml pour la configuration Language de programmation Version spécifique Script à exécuter 1 language: python 2 python: 3 - 3.5 4 script: python3 test.py 58
  • 66. Crédits Photos des livres depuis Amazon https://www.flickr.com/photos/jwhitesmith/7363049912 https://openclipart.org/detail/36565/tango-network-server-by-warszawianka https://openclipart.org/detail/34531/tango-computer-by-warszawianka https://www.flickr.com/photos/faisal_akram/8107449789 https://www.flickr.com/photos/rachel_s/9243714784 https://www.flickr.com/photos/110777427@N06/15632985383 https://www.flickr.com/photos/nasamarshall/21064480196 59