formations/python/formation/testsunitaires.txt

154 lines
3.2 KiB
Plaintext

Tests unitaires et pile d'appels
=================================
Les tests automatiques sont un complément à la déclaration des types.
Que tester, quoi tester ?
- que les composants interagissent bien entre eux
- que les unités (fonctions, objets...) réagissent bien à une entrée spécifique
- que le code se comporte de la manière attendue dans des environnements différents
(systèmes d'exploitation, etc...)
Les types de tests :
- tests unitaires
- tests fonctionnels
- tests d'acceptation
- tests d'intégration
Quel outil utiliser ?
- la :doc:`stdlib` propose le module :mod:`unittest`
.. module:: py.test
:synopsis: outil de test unitaires de la pylib
- :mod:`py.test` est **le plus simple** (plus simple que unittest)
http://pytest.org/latest/
::
def test_simple():
"test si ma_fontion renvoie bien 3"
assert ma_fontion(2) == 3
- `py.test` utilise `assert` et `raises`
- `unittest` necessite de faire sytématiquement une classe, puis `assertEqual()`
- :mod:`doctest` est plus simple mais charge trop les docstrings
.. todo:: écrire un test unitaire avec `py.test` pour la fonction suivante
- installer le paquet `python-pytest`
- écrire un fichier avec une fonction dedans
::
def double(x):
return x*2
- écrire un fichier commençant par `test_` qui teste les fonctions du fichier
Options utiles dans `py.test`
------------------------------
::
py.test --tb=no
py.test --tb=short
py.test -x (dernière erreur)
py.test -s (c'est comme nocapture en fait)
py.test -x --nocapture --pdb
py.test -xl --pdb
py.test -k test_simple
Utiliser la pile d'appel pour débugger
---------------------------------------
Utiliser la pile d'appels, elle se lit de bas en haut. Il est possible de
provoquer cette pile d'appels.
::
import traceback
traceback.print_exc()
Traiter une exception avec
::
try:
...
except:
import traceback
traceback.print_exc()
else:
bla bla
finally:
bla bla
Créer le plus possible ses propres exceptions spécifiques au programme.
Utiliser le module :mod:`pdb`
.. module:: pdb
:synopsis: debugger de la lib standard
::
import pdb
pdb.set_trace()
depuis py.test :
::
import pytest
def test_function():
...
pytest.set_trace() # invoke PDB debugger and tracing
Remarquons que :mod:`pdb` utilise le module :mod:`cmd`, voir :ref:`cmdlabel` qu'on a déjà vu précedemment
::
(Pdb) h
Documented commands (type help <topic>):
========================================
EOF bt cont enable jump pp run unt
a c continue exit l q s until
alias cl d h list quit step up
args clear debug help n r tbreak w
b commands disable ignore next restart u whatis
break condition down j p return unalias where
Miscellaneous help topics:
==========================
exec pdb
Undocumented commands:
======================
retval rv
(Pdb)
Last but not least :
utiliser pylint ou pychecker
::
apt-get install pylint