pytest-watch -- Continuous pytest runner
[![Current version on PyPI](http://img.shields.io/pypi/v/pytest-watch.svg)][pypi]
[![Downloads/month on PyPI](http://img.shields.io/pypi/dm/pytest-watch.svg)][pypi]
**pytest-watch** a zero-config CLI tool that runs [pytest], and re-runs it
when a file in your project changes. It beeps on failures and can run arbitrary
commands on each passing and failing test run.
Whether or not you use the test-driven development method, running tests
continuously is far more productive than waiting until you're finished
programming to test your code. Additionally, manually running `py.test` each
time you want to see if any tests were broken has more wait-time and cognitive
overhead than merely listening for a notification. This could be a crucial
difference when debugging a complex problem or on a tight deadline.
$ pip install pytest-watch
$ cd myproject
* Watching /path/to/myproject
*Note: It can also be run using its full name `py.test.watch`.*
Now develop normally and check the terminal every now and then to see if any
tests are broken. Alternatively, pytest-watch can **notify you** when tests
pass or fail:
`$ ptw --onpass "say passed" --onfail "say failed"`
$ ptw --onpass "growlnotify -m \"All tests passed!\"" \
--onfail "growlnotify -m \"Tests failed\""
> ptw --onfail flash
using [Console Flash]
You can also run a command before the tests run, e.g. seeding your test database:
$ ptw --beforerun init_db.py
Or after they finish, e.g. deleting a sqlite file. Note that this script receives
the exit code of `py.test` as an argument.
$ ptw --afterrun cleanup_db.py
You can also use a custom runner script for full `py.test` control:
$ ptw --runner "python custom_pytest_runner.py"
Here's an minimal runner script that runs `py.test` and prints its exit code:
print('py.test exited with code:', pytest.main(sys.argv[1:]))
Need to exclude directories from being observed or collected for tests?
$ ptw --ignore ./deep-directory --ignore ./integration_tests
For more information and for the full list of options, run:
$ ptw --help
CLI options can be added to a `[pytest-watch]` section in your
[pytest.ini file][pytest.ini] to persist them in your project. For example:
addopts = --maxfail=2
ignore = ./integration-tests
nobeep = True
- [xdist] offers the `--looponfail` (`-f`) option (and distributed testing
options). This instead re-runs only those tests which have failed until you
make them pass. This can be a speed advantage when trying to get all tests
passing, but leaves out the discovery of new failures until then. It also
drops the colors outputted by py.test, whereas pytest-watch doesn't.
- [Nosey] is the original codebase this was forked from. Nosey runs [nose]
instead of pytest.
1. Check the open issues or open a new issue to start a discussion around
your feature idea or the bug you found
2. Fork the repository, make your changes, and add yourself to [Authors.md]
3. Send a pull request
If your PR has been waiting a while, feel free to [ping me on Twitter][twitter].
Use this software often? Please consider [supporting pytest-watch][support].
<a href="https://gratipay.com/pytest-watch/" title="Thank you!" target="_blank">
<img src="https://img.shields.io/gratipay/pytest-watch.svg" align="center" alt="Thank you!">
[console flash]: http://github.com/joeyespo/console-flash
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.