Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Je teste mon code avec py.test

Je teste mon code avec py.test

Présentation à la conférence PyCon FR à Lyon le 25 octobre 2014.

B06b5d4777e2734feb91298062539ec8?s=128

Ronan Amicel

October 25, 2014
Tweet

Transcript

  1. Je teste mon code avec py.test Ronan Amicel @amicel PyCon

    FR — 25 octobre 2014 — Lyon
  2. Ronan Amicel Fondateur @ Pocket Sensei Hacker en résidence @

    The Family
  3. Préambule

  4. None
  5. C’est quoi py.test ?

  6. $ py.test • Un outil en ligne de commande pour

    lancer vos tests : • découverte • exécution • affichage des résultats
  7. import pytest • Un framework pour écrire vos tests •

    avec très peu de bla bla • avec un mécanisme de fixtures très flexible
  8. Le plan • Écrire ses tests avec py.test • Moins

    de bla bla • Utiliser les fixtures • Lancer ses tests avec py.test • Comment passer facilement à py.test
  9. Écrire ses tests
 avec py.test

  10. Moins de bla bla

  11. Rappel : unittest import unittest def fact(n): return 1 if

    n <= 1 else n * fact(n - 1) class TestFact(unittest.TestCase): def test_three(self): self.assertEqual(fact(3), 6) if __name__ == '__main__': unittest.main()
  12. Avec py.test def fact(n): return 1 if n <= 1

    else n * fact(n - 1) def test_fact(self): assert fact(3) == 6
  13. Démo assertions

  14. Les fixtures

  15. Setup from selenium import webdriver import pytest @pytest.fixture def browser():

    return webdriver.Firefox() def test_pycon(browser): browser.get('http://pycon.fr/') assert 'Bienvenue' in browser.title
  16. Durée de vie @pytest.fixture(scope='function') ... @pytest.fixture(scope='module') ... @pytest.fixture(scope='session') ...

  17. Teardown (1/2) @pytest.fixture def browser(request): b = webdriver.Firefox() def teardown():

    b.quit() request.addfinalizer(teardown) return b
  18. Teardown (2) @pytest.yield_fixture def browser(): b = webdriver.Firefox() yield b

    b.quit()
  19. Fixtures paramétrées @pytest.fixture(scope='session', params=['firefox', 'chrome']) def browser(request): if request.param ==

    'firefox': return webdriver.Firefox() elif request.param == 'chrome': return webdriver.Chrome() else: raise ValueError('Unknown browser')
  20. Trouver et lancer
 ses tests avec py.test

  21. Rappel : Python ≥ 2.7 $ python -m unittest discover

  22. py.test $ py.test

  23. Découverte • Parcours récursif des répertoires • Fichiers test_*.py ou

    *_test.py • Classes qui commencent par Test • Fonctions et méthodes qui commencent par test_ • Reconnait les tests unittest et nose existants
  24. Exécuter seulement
 certains tests $ py.test tata/ $ py.test toto.py

    $ py.test --pyargs mon.module
  25. Collecter les tests uniquement $ py.test --collect-only

  26. Un test bien précis $ py.test fichier.py::fonction $ py.test fichier.py::Classe::methode

  27. Seulement les tests dont le nom contient un mot-clé $

    py.test -k toto $ py.test -k 'toto or tata'
  28. Exécution

  29. S’arrêter en cas d'erreur $ py.test -x $ py.test --maxfail=3

  30. Lancer le debugger
 en cas d’erreur $ py.test --pdb $

    py.test -x --pdb
  31. Contrôle de l'affichage

  32. Afficher le nom des tests $ py.test -v

  33. Ne pas capturer
 la sortie standard $ py.test -s $

    py.test --capture=no
  34. Niveau de détail des tracebacks $ py.test --tb=auto # défaut

    $ py.test --tb=long $ py.test --tb=short $ py.test --tb=line $ py.test --tb=native $ py.test --tb=no
  35. Afficher les valeurs des variables locales $ py.test --showlocals $

    py.test -l
  36. Afficher un résumé à la fin $ py.test -rf #

    failures
  37. Afficher les tests les plus lents $ py.test --durations=10

  38. Plugins

  39. Lancer ses tests en parallèle $ pip install pytest-xdist $

    py.test -n4
  40. Couverture de tests $ pip install pytest-cov $ py.test --cov

    myproj
  41. Django $ pip install pytest-django $ py.test --ds=proj.settings

  42. BDD $ pip install pytest-bdd $ py.test --ds=proj.settings

  43. Passer facilement
 à py.test

  44. Recette facile en 2 étapes 1. Utilisez py.test pour lancer

    vos tests existants (unittest, doctest, nose, Django) 2. Commencez à (ré)écrire vos tests dans le style py.test
  45. En savoir plus http://pytest.org/

  46. Questions ?

  47. Merci !