Switching from nose to py.test at Mozilla
Matthieu Agopian
slides - http://mathieu.agopian.info/presentations/2015_06_djangocon_europe/
glossary
- test - bit of code to assert other code working
- test runner - gather tests, run them, report
- test suite, build - full collection
- fixture - data fixture (django) OR dependency injection (pytest)
What is pytest
- Holger Krekel
- no boiler place tests (eg assert 1 + 1 == 2) and still get meaningful report
- plugins
- 10 slowest tests –duration=10
- modify tracebacks
- drop to pdb on fail –pdb
- output capture on by default - only display for fails
- mark tests @pytest.mark.functional - run separately
- awesome failure reports - eg comparing dictionaries
dependency injection
- instead of setUp/tearDown ...
- eg. rf, settings provided by pytest-django (request factory, django settings)
parameterisation
- have same test run multiple times with different inputs and expected outputs
config
- pytest.ini - markers to use, default args, test files
- conftest.py - locally for current folder and children - eg use another settings file
plugins
- pytest-django
- –create-db, –reuse-db, to save time
- @pytest.mark.django_db - explicit, see tests that will be slow. Can be set in conftest.py
- pytest-cov
- pytest-cache (–lf - only run last failed test)
- pytest-xdist
why change?
- is better maintained
- compatible with current tests
- will be better for future tests
why not?
- no dependency injection for nose classes
- can still use the autouse fixtures
- no data fixture bundling
can convert some asserts quickly