2010-01-13 23:00:33 +08:00
loop on failing tests, distribute test runs to CPUs and hosts.
==============================================================
.. contents ::
:local:
2014-01-18 19:31:33 +08:00
The `pytest-xdist`_ plugin extends `` pytest `` with some unique
2010-01-13 23:00:33 +08:00
test execution modes:
2014-01-18 19:31:33 +08:00
* Looponfail: run your tests repeatedly in a subprocess. After each run
`` pytest `` waits until a file in your project changes and then re-runs the
previously failing tests. This is repeated until all tests pass after which
again a full run is performed.
2010-01-13 23:00:33 +08:00
* Load-balancing: if you have multiple CPUs or hosts you can use
2010-07-27 03:15:15 +08:00
those for a combined test run. This allows to speed up
development or to use special resources of remote machines.
2010-01-13 23:00:33 +08:00
* Multi-Platform coverage: you can specify different Python interpreters
2010-07-27 03:15:15 +08:00
or different platforms and run tests in parallel on all of them.
2010-01-13 23:00:33 +08:00
2014-01-18 19:31:33 +08:00
Before running tests remotely, `` pytest `` efficiently synchronizes your
2010-07-27 03:15:15 +08:00
program source code to the remote place. All test results
are reported back and displayed to your local test session.
2010-01-13 23:00:33 +08:00
You may specify different Python versions and interpreters.
2010-01-18 23:18:59 +08:00
.. _`pytest-xdist`: http://pypi.python.org/pypi/pytest-xdist
2010-01-13 23:00:33 +08:00
Usage examples
---------------------
Speed up test runs by sending tests to multiple CPUs
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
To send tests to multiple CPUs, type::
2016-06-21 22:16:57 +08:00
pytest -n NUM
2010-01-13 23:00:33 +08:00
2010-07-27 03:15:15 +08:00
Especially for longer running tests or tests requiring
a lot of IO this can lead to considerable speed ups.
2010-01-13 23:00:33 +08:00
2010-07-27 03:15:15 +08:00
Running tests in a Python subprocess
2010-01-13 23:00:33 +08:00
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
To instantiate a python2.4 sub process and send tests to it, you may type::
2016-06-21 22:16:57 +08:00
pytest -d --tx popen//python=python2.4
2010-01-13 23:00:33 +08:00
This will start a subprocess which is run with the "python2.4"
2010-07-27 03:15:15 +08:00
Python interpreter, found in your system binary lookup path.
2010-01-13 23:00:33 +08:00
If you prefix the --tx option value like this::
--tx 3*popen//python=python2.4
then three subprocesses would be created and tests
2010-07-27 03:15:15 +08:00
will be load-balanced across these three processes.
2010-01-13 23:00:33 +08:00
Sending tests to remote SSH accounts
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2010-07-27 03:15:15 +08:00
Suppose you have a package `` mypkg `` which contains some
2010-01-13 23:00:33 +08:00
tests that you can successfully run locally. And you
2010-07-27 03:15:15 +08:00
have a ssh-reachable machine `` myhost `` . Then
2010-01-13 23:00:33 +08:00
you can ad-hoc distribute your tests by typing::
2016-06-21 22:16:57 +08:00
pytest -d --tx ssh=myhostpopen --rsyncdir mypkg mypkg
2010-01-13 23:00:33 +08:00
2010-07-27 03:15:15 +08:00
This will synchronize your `` mypkg `` package directory
2017-01-01 01:54:47 +08:00
to a remote ssh account and then locally collect tests
2010-07-27 03:15:15 +08:00
and send them to remote places for execution.
2010-01-13 23:00:33 +08:00
2010-07-27 03:15:15 +08:00
You can specify multiple `` --rsyncdir `` directories
to be sent to the remote side.
2010-01-13 23:00:33 +08:00
2014-01-18 19:31:33 +08:00
**NOTE:** For `` pytest `` to collect and send tests correctly
2010-01-13 23:00:33 +08:00
you not only need to make sure all code and tests
directories are rsynced, but that any test (sub) directory
also has an `` __init__.py `` file because internally
2014-01-18 19:31:33 +08:00
`` pytest `` references tests using their fully qualified python
2010-07-27 03:15:15 +08:00
module path. **You will otherwise get strange errors**
2010-01-13 23:00:33 +08:00
during setup of the remote side.
Sending tests to remote Socket Servers
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2010-07-27 03:15:15 +08:00
Download the single-module `socketserver.py`_ Python program
2010-01-13 23:00:33 +08:00
and run it like this::
python socketserver.py
It will tell you that it starts listening on the default
2010-07-27 03:15:15 +08:00
port. You can now on your home machine specify this
2010-01-13 23:00:33 +08:00
new socket host with something like this::
2016-06-21 22:16:57 +08:00
pytest -d --tx socket=192.168.1.102:8888 --rsyncdir mypkg mypkg
2010-01-13 23:00:33 +08:00
.. _`atonce`:
2010-07-27 03:15:15 +08:00
Running tests on many platforms at once
2010-01-13 23:00:33 +08:00
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
The basic command to run tests on multiple platforms is::
2016-06-21 22:16:57 +08:00
pytest --dist=each --tx=spec1 --tx=spec2
2010-01-13 23:00:33 +08:00
If you specify a windows host, an OSX host and a Linux
2010-07-27 03:15:15 +08:00
environment this command will send each tests to all
2010-01-13 23:00:33 +08:00
platforms - and report back failures from all platforms
2010-07-27 03:15:15 +08:00
at once. The specifications strings use the `xspec syntax`_ .
2010-01-13 23:00:33 +08:00
.. _`xspec syntax`: http://codespeak.net/execnet/trunk/basics.html#xspec
.. _`socketserver.py`: http://codespeak.net/svn/py/dist/py/execnet/script/socketserver.py
.. _`execnet`: http://codespeak.net/execnet
Specifying test exec environments in a conftest.py
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2010-07-27 03:15:15 +08:00
Instead of specifying command line options, you can
2010-01-13 23:00:33 +08:00
put options values in a `` conftest.py `` file like this::
2015-12-17 02:14:36 +08:00
option_tx = ['ssh=myhost//python=python2.7', 'popen//python=python2.7']
2010-05-19 00:45:12 +08:00
option_dist = True
2010-01-13 23:00:33 +08:00
2011-02-17 21:46:40 +08:00
Any commandline `` --tx `` specifications will add to the list of
2010-07-27 03:15:15 +08:00
available execution environments.
2010-01-13 23:00:33 +08:00
Specifying "rsync" dirs in a conftest.py
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
In your `` mypkg/conftest.py `` you may specify directories to synchronise
or to exclude::
rsyncdirs = ['.', '../plugins']
rsyncignore = ['_cache']
These directory specifications are relative to the directory
where the `` conftest.py `` is found.
command line options
--------------------
`` -f, --looponfail ``
run tests in subprocess, wait for modified files and re-run failing test set until all pass.
`` -n numprocesses ``
shortcut for '--dist=load --tx=NUM*popen'
`` --boxed ``
box each test run in a separate process (unix)
`` --dist=distmode ``
set mode for distributing tests to exec environments.
2014-01-18 19:31:33 +08:00
2010-01-13 23:00:33 +08:00
each: send each test to each available environment.
2014-01-18 19:31:33 +08:00
2015-02-14 07:07:19 +08:00
load: send each test to one available environment so it is run only once.
2014-01-18 19:31:33 +08:00
2010-01-13 23:00:33 +08:00
(default) no: run tests inprocess, don't distribute.
`` --tx=xspec ``
2015-12-17 02:14:36 +08:00
add a test execution environment. some examples: --tx popen//python=python2.7 --tx socket=192.168.1.102:8888 --tx ssh=user@codespeak.net//chdir=testcache
2010-01-13 23:00:33 +08:00
`` -d ``
load-balance tests. shortcut for '--dist=load'
`` --rsyncdir=dir1 ``
add directory for rsyncing to remote tx nodes.
.. include :: links.txt