Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Je teste mon code avec py.test
Ronan Amicel
October 25, 2014
Programming
1
260
Je teste mon code avec py.test
Présentation à la conférence PyCon FR à Lyon le 25 octobre 2014.
Ronan Amicel
October 25, 2014
Tweet
Share
More Decks by Ronan Amicel
See All by Ronan Amicel
Développeur : ce qu’on ne m’a pas appris à l’école
ronnix
1
280
Refactoring: la méthode Mikado
ronnix
0
200
Techniques de test avancées en Python
ronnix
0
260
Product Development in a Startup
ronnix
2
230
Performance des frameworks web : Python vs The World (v1.1)
ronnix
1
7.7k
Performance des frameworks web : Python vs The World
ronnix
0
220
Introduction au Customer Development
ronnix
1
110
Rendez votre code Python plus beau !
ronnix
1
530
Trompez-vous, et vite !
ronnix
2
140
Other Decks in Programming
See All in Programming
Data Engineering Study #16/メタデータは地味だが役に立つ
atamaplus
2
290
フロントエンドにおけるテスト戦略 / Testing Strategies on the Front End
hrkzmaaa
1
740
森羅万象に「いいね」するためのデータ構造
pndcat
1
240
Migration d’un hébergement classique à une infra cloud PaaS, retour d'expérience
bastnic
0
190
PLATEAUをデータベースに取り込んでみた
regonn
0
600
SwiftUI 跨平台 App 開發初體驗 - 開發 iOS, macOS, watchOS 的 MOPCON App
apppeterpan
1
550
Toward a happy symbiosis with RuboCop
ydah
0
110
How to say goodbye to technical debt
makicamel
7
1k
MyFirstDBDefinition
maimux2x
0
150
システム開発を支えるメタプログラミングの技術 / kaigionrails-2022
hogucc
7
3.3k
あなたとRails
yahonda
2
370
モノレポにおける path-filtering利用時でも GitHub ステータスのRequiredを 機能させたい!
tokizuoh
1
150
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
21
4.2k
Happy Clients
brianwarren
89
5.7k
Building an army of robots
kneath
301
40k
GraphQLとの向き合い方2022年版
quramy
18
9.1k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
182
15k
Unsuck your backbone
ammeep
658
55k
Writing Fast Ruby
sferik
613
57k
Done Done
chrislema
175
14k
The Cult of Friendly URLs
andyhume
68
4.9k
Reflections from 52 weeks, 52 projects
jeffersonlam
337
18k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
13
5.1k
A Modern Web Designer's Workflow
chriscoyier
690
180k
Transcript
Je teste mon code avec py.test Ronan Amicel @amicel PyCon
FR — 25 octobre 2014 — Lyon
Ronan Amicel Fondateur @ Pocket Sensei Hacker en résidence @
The Family
Préambule
None
C’est quoi py.test ?
$ py.test • Un outil en ligne de commande pour
lancer vos tests : • découverte • exécution • affichage des résultats
import pytest • Un framework pour écrire vos tests •
avec très peu de bla bla • avec un mécanisme de fixtures très flexible
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
Écrire ses tests avec py.test
Moins de bla bla
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()
Avec py.test def fact(n): return 1 if n <= 1
else n * fact(n - 1) def test_fact(self): assert fact(3) == 6
Démo assertions
Les fixtures
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
Durée de vie @pytest.fixture(scope='function') ... @pytest.fixture(scope='module') ... @pytest.fixture(scope='session') ...
Teardown (1/2) @pytest.fixture def browser(request): b = webdriver.Firefox() def teardown():
b.quit() request.addfinalizer(teardown) return b
Teardown (2) @pytest.yield_fixture def browser(): b = webdriver.Firefox() yield b
b.quit()
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')
Trouver et lancer ses tests avec py.test
Rappel : Python ≥ 2.7 $ python -m unittest discover
py.test $ py.test
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
Exécuter seulement certains tests $ py.test tata/ $ py.test toto.py
$ py.test --pyargs mon.module
Collecter les tests uniquement $ py.test --collect-only
Un test bien précis $ py.test fichier.py::fonction $ py.test fichier.py::Classe::methode
Seulement les tests dont le nom contient un mot-clé $
py.test -k toto $ py.test -k 'toto or tata'
Exécution
S’arrêter en cas d'erreur $ py.test -x $ py.test --maxfail=3
Lancer le debugger en cas d’erreur $ py.test --pdb $
py.test -x --pdb
Contrôle de l'affichage
Afficher le nom des tests $ py.test -v
Ne pas capturer la sortie standard $ py.test -s $
py.test --capture=no
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
Afficher les valeurs des variables locales $ py.test --showlocals $
py.test -l
Afficher un résumé à la fin $ py.test -rf #
failures
Afficher les tests les plus lents $ py.test --durations=10
Plugins
Lancer ses tests en parallèle $ pip install pytest-xdist $
py.test -n4
Couverture de tests $ pip install pytest-cov $ py.test --cov
myproj
Django $ pip install pytest-django $ py.test --ds=proj.settings
BDD $ pip install pytest-bdd $ py.test --ds=proj.settings
Passer facilement à py.test
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
En savoir plus http://pytest.org/
Questions ?
Merci !