commit
						e33736c791
					
				|  | @ -55,10 +55,8 @@ jobs: | ||||||
|     - env: TOXENV=py37-pluggymaster-xdist |     - env: TOXENV=py37-pluggymaster-xdist | ||||||
|     - env: TOXENV=py37-freeze |     - env: TOXENV=py37-freeze | ||||||
| 
 | 
 | ||||||
|     # Jobs only run via Travis cron jobs (currently daily). |  | ||||||
|     - env: TOXENV=py38-xdist |     - env: TOXENV=py38-xdist | ||||||
|       python: '3.8-dev' |       python: '3.8-dev' | ||||||
|       if: type = cron |  | ||||||
| 
 | 
 | ||||||
|     - stage: baseline |     - stage: baseline | ||||||
|       env: TOXENV=py36-xdist |       env: TOXENV=py36-xdist | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								AUTHORS
								
								
								
								
							
							
						
						
									
										1
									
								
								AUTHORS
								
								
								
								
							|  | @ -15,6 +15,7 @@ Alexander Johnson | ||||||
| Alexei Kozlenok | Alexei Kozlenok | ||||||
| Allan Feldman | Allan Feldman | ||||||
| Aly Sivji | Aly Sivji | ||||||
|  | Amir Elkess | ||||||
| Anatoly Bubenkoff | Anatoly Bubenkoff | ||||||
| Anders Hovmöller | Anders Hovmöller | ||||||
| Andras Mitzki | Andras Mitzki | ||||||
|  |  | ||||||
|  | @ -18,6 +18,28 @@ with advance notice in the **Deprecations** section of releases. | ||||||
| 
 | 
 | ||||||
| .. towncrier release notes start | .. towncrier release notes start | ||||||
| 
 | 
 | ||||||
|  | pytest 5.0.1 (2019-07-04) | ||||||
|  | ========================= | ||||||
|  | 
 | ||||||
|  | Bug Fixes | ||||||
|  | --------- | ||||||
|  | 
 | ||||||
|  | - `#5479 <https://github.com/pytest-dev/pytest/issues/5479>`_: Improve quoting in ``raises`` match failure message. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | - `#5523 <https://github.com/pytest-dev/pytest/issues/5523>`_: Fixed using multiple short options together in the command-line (for example ``-vs``) in Python 3.8+. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | - `#5547 <https://github.com/pytest-dev/pytest/issues/5547>`_: ``--step-wise`` now handles ``xfail(strict=True)`` markers properly. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Improved Documentation | ||||||
|  | ---------------------- | ||||||
|  | 
 | ||||||
|  | - `#5517 <https://github.com/pytest-dev/pytest/issues/5517>`_: Improve "Declaring new hooks" section in chapter "Writing Plugins" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| pytest 5.0.0 (2019-06-28) | pytest 5.0.0 (2019-06-28) | ||||||
| ========================= | ========================= | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -169,7 +169,7 @@ Short version | ||||||
| #. Follow **PEP-8** for naming and `black <https://github.com/python/black>`_ for formatting. | #. Follow **PEP-8** for naming and `black <https://github.com/python/black>`_ for formatting. | ||||||
| #. Tests are run using ``tox``:: | #. Tests are run using ``tox``:: | ||||||
| 
 | 
 | ||||||
|     tox -e linting,py27,py37 |     tox -e linting,py37 | ||||||
| 
 | 
 | ||||||
|    The test environments above are usually enough to cover most cases locally. |    The test environments above are usually enough to cover most cases locally. | ||||||
| 
 | 
 | ||||||
|  | @ -217,7 +217,9 @@ Here is a simple overview, with pytest-specific bits: | ||||||
|    If you need some help with Git, follow this quick start |    If you need some help with Git, follow this quick start | ||||||
|    guide: https://git.wiki.kernel.org/index.php/QuickStart |    guide: https://git.wiki.kernel.org/index.php/QuickStart | ||||||
| 
 | 
 | ||||||
| #. Install `pre-commit <https://pre-commit.com>`_ and its hook on the pytest repo:: | #. Install `pre-commit <https://pre-commit.com>`_ and its hook on the pytest repo: | ||||||
|  | 
 | ||||||
|  |    **Note: pre-commit must be installed as admin, as it will not function otherwise**:: | ||||||
| 
 | 
 | ||||||
|      $ pip install --user pre-commit |      $ pip install --user pre-commit | ||||||
|      $ pre-commit install |      $ pre-commit install | ||||||
|  | @ -237,20 +239,20 @@ Here is a simple overview, with pytest-specific bits: | ||||||
| 
 | 
 | ||||||
| #. Run all the tests | #. Run all the tests | ||||||
| 
 | 
 | ||||||
|    You need to have Python 2.7 and 3.7 available in your system.  Now |    You need to have Python 3.7 available in your system.  Now | ||||||
|    running tests is as simple as issuing this command:: |    running tests is as simple as issuing this command:: | ||||||
| 
 | 
 | ||||||
|     $ tox -e linting,py27,py37 |     $ tox -e linting,py37 | ||||||
| 
 | 
 | ||||||
|    This command will run tests via the "tox" tool against Python 2.7 and 3.7 |    This command will run tests via the "tox" tool against Python 3.7 | ||||||
|    and also perform "lint" coding-style checks. |    and also perform "lint" coding-style checks. | ||||||
| 
 | 
 | ||||||
| #. You can now edit your local working copy and run the tests again as necessary. Please follow PEP-8 for naming. | #. You can now edit your local working copy and run the tests again as necessary. Please follow PEP-8 for naming. | ||||||
| 
 | 
 | ||||||
|    You can pass different options to ``tox``. For example, to run tests on Python 2.7 and pass options to pytest |    You can pass different options to ``tox``. For example, to run tests on Python 3.7 and pass options to pytest | ||||||
|    (e.g. enter pdb on failure) to pytest you can do:: |    (e.g. enter pdb on failure) to pytest you can do:: | ||||||
| 
 | 
 | ||||||
|     $ tox -e py27 -- --pdb |     $ tox -e py37 -- --pdb | ||||||
| 
 | 
 | ||||||
|    Or to only run tests in a particular test module on Python 3.7:: |    Or to only run tests in a particular test module on Python 3.7:: | ||||||
| 
 | 
 | ||||||
|  | @ -266,7 +268,8 @@ Here is a simple overview, with pytest-specific bits: | ||||||
| 
 | 
 | ||||||
| #. Create a new changelog entry in ``changelog``. The file should be named ``<issueid>.<type>.rst``, | #. Create a new changelog entry in ``changelog``. The file should be named ``<issueid>.<type>.rst``, | ||||||
|    where *issueid* is the number of the issue related to the change and *type* is one of |    where *issueid* is the number of the issue related to the change and *type* is one of | ||||||
|    ``bugfix``, ``removal``, ``feature``, ``vendor``, ``doc`` or ``trivial``. |    ``bugfix``, ``removal``, ``feature``, ``vendor``, ``doc`` or ``trivial``. You may not create a | ||||||
|  |    changelog entry if the change doesn't affect the documented behaviour of Pytest. | ||||||
| 
 | 
 | ||||||
| #. Add yourself to ``AUTHORS`` file if not there yet, in alphabetical order. | #. Add yourself to ``AUTHORS`` file if not there yet, in alphabetical order. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,44 @@ | ||||||
|  | ============== | ||||||
|  | OpenCollective | ||||||
|  | ============== | ||||||
|  | 
 | ||||||
|  | pytest has a collective setup at `OpenCollective`_. This document describes how the core team manages | ||||||
|  | OpenCollective-related activities. | ||||||
|  | 
 | ||||||
|  | What is it | ||||||
|  | ========== | ||||||
|  | 
 | ||||||
|  | Open Collective is an online funding platform for open and transparent communities. | ||||||
|  | It provide tools to raise money and share your finances in full transparency. | ||||||
|  | 
 | ||||||
|  | It is the platform of choice for individuals and companies that want to make one-time or | ||||||
|  | monthly donations directly to the project. | ||||||
|  | 
 | ||||||
|  | Funds | ||||||
|  | ===== | ||||||
|  | 
 | ||||||
|  | The OpenCollective funds donated to pytest will be used to fund overall maintenance, | ||||||
|  | local sprints, merchandising (stickers to distribute in conferences for example), and future | ||||||
|  | gatherings of pytest developers (Sprints). | ||||||
|  | 
 | ||||||
|  | `Core contributors`_ which are contributing on a continuous basis are free to submit invoices | ||||||
|  | to bill maintenance hours using the platform. How much each contributor should request is still an | ||||||
|  | open question, but we should use common sense and trust in the contributors, most of which know | ||||||
|  | themselves in-person. A good rule of thumb is to bill the same amount as monthly payments | ||||||
|  | contributors which participate in the `Tidelift`_ subscription. If in doubt, just ask. | ||||||
|  | 
 | ||||||
|  | Admins | ||||||
|  | ====== | ||||||
|  | 
 | ||||||
|  | A few people have admin access to the OpenCollective dashboard to make changes. Those people | ||||||
|  | are part of the `@pytest-dev/opencollective-admins`_ team. | ||||||
|  | 
 | ||||||
|  | `Core contributors`_ interested in helping out with OpenCollective maintenance are welcome! We don't | ||||||
|  | expect much work here other than the occasional approval of expenses from other core contributors. | ||||||
|  | Just drop a line to one of the `@pytest-dev/opencollective-admins`_ or use the mailing list. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | .. _`OpenCollective`: https://opencollective.com/pytest | ||||||
|  | .. _`Tidelift`: https://tidelift.com | ||||||
|  | .. _`core contributors`: https://github.com/orgs/pytest-dev/teams/core/members | ||||||
|  | .. _`@pytest-dev/opencollective-admins`: https://github.com/orgs/pytest-dev/teams/opencollective-admins/members | ||||||
|  | @ -12,6 +12,9 @@ Tidelift aims to make Open Source sustainable by offering subscriptions to compa | ||||||
| on Open Source packages. This subscription allows it to pay maintainers of those Open Source | on Open Source packages. This subscription allows it to pay maintainers of those Open Source | ||||||
| packages to aid sustainability of the work. | packages to aid sustainability of the work. | ||||||
| 
 | 
 | ||||||
|  | It is the perfect platform for companies that want to support Open Source packages and at the same | ||||||
|  | time obtain assurances regarding maintenance, quality and security. | ||||||
|  | 
 | ||||||
| Funds | Funds | ||||||
| ===== | ===== | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -11,6 +11,7 @@ | ||||||
|   <li><a href="{{ pathto('contributing') }}">Contributing</a></li> |   <li><a href="{{ pathto('contributing') }}">Contributing</a></li> | ||||||
|   <li><a href="{{ pathto('backwards-compatibility') }}">Backwards Compatibility</a></li> |   <li><a href="{{ pathto('backwards-compatibility') }}">Backwards Compatibility</a></li> | ||||||
|   <li><a href="{{ pathto('py27-py34-deprecation') }}">Python 2.7 and 3.4 Support</a></li> |   <li><a href="{{ pathto('py27-py34-deprecation') }}">Python 2.7 and 3.4 Support</a></li> | ||||||
|  |   <li><a href="{{ pathto('sponsor') }}">Sponsor</a></li> | ||||||
|   <li><a href="{{ pathto('license') }}">License</a></li> |   <li><a href="{{ pathto('license') }}">License</a></li> | ||||||
|   <li><a href="{{ pathto('contact') }}">Contact Channels</a></li> |   <li><a href="{{ pathto('contact') }}">Contact Channels</a></li> | ||||||
| </ul> | </ul> | ||||||
|  |  | ||||||
|  | @ -6,6 +6,7 @@ Release announcements | ||||||
|    :maxdepth: 2 |    :maxdepth: 2 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |    release-5.0.1 | ||||||
|    release-5.0.0 |    release-5.0.0 | ||||||
|    release-4.6.4 |    release-4.6.4 | ||||||
|    release-4.6.3 |    release-4.6.3 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,25 @@ | ||||||
|  | pytest-5.0.1 | ||||||
|  | ======================================= | ||||||
|  | 
 | ||||||
|  | pytest 5.0.1 has just been released to PyPI. | ||||||
|  | 
 | ||||||
|  | This is a bug-fix release, being a drop-in replacement. To upgrade:: | ||||||
|  | 
 | ||||||
|  |   pip install --upgrade pytest | ||||||
|  | 
 | ||||||
|  | The full changelog is available at https://docs.pytest.org/en/latest/changelog.html. | ||||||
|  | 
 | ||||||
|  | Thanks to all who contributed to this release, among them: | ||||||
|  | 
 | ||||||
|  | * AmirElkess | ||||||
|  | * Andreu Vallbona Plazas | ||||||
|  | * Anthony Sottile | ||||||
|  | * Bruno Oliveira | ||||||
|  | * Florian Bruhin | ||||||
|  | * Michael Moore | ||||||
|  | * Niklas Meinzer | ||||||
|  | * Thomas Grainger | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Happy testing, | ||||||
|  | The pytest Development Team | ||||||
|  | @ -31,7 +31,7 @@ you will see the return value of the function call: | ||||||
| 
 | 
 | ||||||
|     $ pytest test_assert1.py |     $ pytest test_assert1.py | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 1 item |     collected 1 item | ||||||
|  | @ -186,7 +186,7 @@ if you run this module: | ||||||
| 
 | 
 | ||||||
|     $ pytest test_assert2.py |     $ pytest test_assert2.py | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 1 item |     collected 1 item | ||||||
|  |  | ||||||
|  | @ -80,7 +80,7 @@ If you then run it with ``--lf``: | ||||||
| 
 | 
 | ||||||
|     $ pytest --lf |     $ pytest --lf | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 50 items / 48 deselected / 2 selected |     collected 50 items / 48 deselected / 2 selected | ||||||
|  | @ -124,7 +124,7 @@ of ``FF`` and dots): | ||||||
| 
 | 
 | ||||||
|     $ pytest --ff |     $ pytest --ff | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 50 items |     collected 50 items | ||||||
|  | @ -256,7 +256,7 @@ You can always peek at the content of the cache using the | ||||||
| 
 | 
 | ||||||
|     $ pytest --cache-show |     $ pytest --cache-show | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|  | @ -284,7 +284,7 @@ filtering: | ||||||
| 
 | 
 | ||||||
|     $ pytest --cache-show example/* |     $ pytest --cache-show example/* | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|  |  | ||||||
|  | @ -69,7 +69,7 @@ of the failing function and hide the other one: | ||||||
| 
 | 
 | ||||||
|     $ pytest |     $ pytest | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 2 items |     collected 2 items | ||||||
|  |  | ||||||
|  | @ -50,7 +50,7 @@ Full pytest documentation | ||||||
|    projects |    projects | ||||||
|    faq |    faq | ||||||
|    contact |    contact | ||||||
|    tidelift |    sponsor | ||||||
| 
 | 
 | ||||||
| .. only:: html | .. only:: html | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -29,7 +29,7 @@ then you can just invoke ``pytest`` directly: | ||||||
| 
 | 
 | ||||||
|     $ pytest |     $ pytest | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 1 item |     collected 1 item | ||||||
|  | @ -58,7 +58,7 @@ and functions, including from test modules: | ||||||
| 
 | 
 | ||||||
|     $ pytest --doctest-modules |     $ pytest --doctest-modules | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 2 items |     collected 2 items | ||||||
|  |  | ||||||
|  | @ -45,7 +45,7 @@ You can then restrict a test run to only run tests marked with ``webtest``: | ||||||
| 
 | 
 | ||||||
|     $ pytest -v -m webtest |     $ pytest -v -m webtest | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collecting ... collected 4 items / 3 deselected / 1 selected |     collecting ... collected 4 items / 3 deselected / 1 selected | ||||||
|  | @ -60,7 +60,7 @@ Or the inverse, running all tests except the webtest ones: | ||||||
| 
 | 
 | ||||||
|     $ pytest -v -m "not webtest" |     $ pytest -v -m "not webtest" | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collecting ... collected 4 items / 1 deselected / 3 selected |     collecting ... collected 4 items / 1 deselected / 3 selected | ||||||
|  | @ -82,7 +82,7 @@ tests based on their module, class, method, or function name: | ||||||
| 
 | 
 | ||||||
|     $ pytest -v test_server.py::TestClass::test_method |     $ pytest -v test_server.py::TestClass::test_method | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collecting ... collected 1 item |     collecting ... collected 1 item | ||||||
|  | @ -97,7 +97,7 @@ You can also select on the class: | ||||||
| 
 | 
 | ||||||
|     $ pytest -v test_server.py::TestClass |     $ pytest -v test_server.py::TestClass | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collecting ... collected 1 item |     collecting ... collected 1 item | ||||||
|  | @ -112,7 +112,7 @@ Or select multiple nodes: | ||||||
| 
 | 
 | ||||||
|     $ pytest -v test_server.py::TestClass test_server.py::test_send_http |     $ pytest -v test_server.py::TestClass test_server.py::test_send_http | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collecting ... collected 2 items |     collecting ... collected 2 items | ||||||
|  | @ -152,7 +152,7 @@ select tests based on their names: | ||||||
| 
 | 
 | ||||||
|     $ pytest -v -k http  # running with the above defined example module |     $ pytest -v -k http  # running with the above defined example module | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collecting ... collected 4 items / 3 deselected / 1 selected |     collecting ... collected 4 items / 3 deselected / 1 selected | ||||||
|  | @ -167,7 +167,7 @@ And you can also run all tests except the ones that match the keyword: | ||||||
| 
 | 
 | ||||||
|     $ pytest -k "not send_http" -v |     $ pytest -k "not send_http" -v | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collecting ... collected 4 items / 1 deselected / 3 selected |     collecting ... collected 4 items / 1 deselected / 3 selected | ||||||
|  | @ -184,7 +184,7 @@ Or to select "http" and "quick" tests: | ||||||
| 
 | 
 | ||||||
|     $ pytest -k "http or quick" -v |     $ pytest -k "http or quick" -v | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collecting ... collected 4 items / 2 deselected / 2 selected |     collecting ... collected 4 items / 2 deselected / 2 selected | ||||||
|  | @ -406,7 +406,7 @@ the test needs: | ||||||
| 
 | 
 | ||||||
|     $ pytest -E stage2 |     $ pytest -E stage2 | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 1 item |     collected 1 item | ||||||
|  | @ -421,7 +421,7 @@ and here is one that specifies exactly the environment needed: | ||||||
| 
 | 
 | ||||||
|     $ pytest -E stage1 |     $ pytest -E stage1 | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 1 item |     collected 1 item | ||||||
|  | @ -614,7 +614,7 @@ then you will see two tests skipped and two executed tests as expected: | ||||||
| 
 | 
 | ||||||
|     $ pytest -rs # this option reports skip reasons |     $ pytest -rs # this option reports skip reasons | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 4 items |     collected 4 items | ||||||
|  | @ -631,7 +631,7 @@ Note that if you specify a platform via the marker-command line option like this | ||||||
| 
 | 
 | ||||||
|     $ pytest -m linux |     $ pytest -m linux | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 4 items / 3 deselected / 1 selected |     collected 4 items / 3 deselected / 1 selected | ||||||
|  | @ -695,7 +695,7 @@ We can now use the ``-m option`` to select one set: | ||||||
| 
 | 
 | ||||||
|     $ pytest -m interface --tb=short |     $ pytest -m interface --tb=short | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 4 items / 2 deselected / 2 selected |     collected 4 items / 2 deselected / 2 selected | ||||||
|  | @ -719,7 +719,7 @@ or to select both "event" and "interface" tests: | ||||||
| 
 | 
 | ||||||
|     $ pytest -m "interface or event" --tb=short |     $ pytest -m "interface or event" --tb=short | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 4 items / 1 deselected / 3 selected |     collected 4 items / 1 deselected / 3 selected | ||||||
|  |  | ||||||
|  | @ -12,14 +12,14 @@ A basic example for specifying tests in Yaml files | ||||||
| .. _`pytest-yamlwsgi`: http://bitbucket.org/aafshar/pytest-yamlwsgi/src/tip/pytest_yamlwsgi.py | .. _`pytest-yamlwsgi`: http://bitbucket.org/aafshar/pytest-yamlwsgi/src/tip/pytest_yamlwsgi.py | ||||||
| .. _`PyYAML`: https://pypi.org/project/PyYAML/ | .. _`PyYAML`: https://pypi.org/project/PyYAML/ | ||||||
| 
 | 
 | ||||||
| Here is an example ``conftest.py`` (extracted from Ali Afshnars special purpose `pytest-yamlwsgi`_ plugin).   This ``conftest.py`` will  collect ``test*.yml`` files and will execute the yaml-formatted content as custom tests: | Here is an example ``conftest.py`` (extracted from Ali Afshnars special purpose `pytest-yamlwsgi`_ plugin).   This ``conftest.py`` will  collect ``test*.yaml`` files and will execute the yaml-formatted content as custom tests: | ||||||
| 
 | 
 | ||||||
| .. include:: nonpython/conftest.py | .. include:: nonpython/conftest.py | ||||||
|     :literal: |     :literal: | ||||||
| 
 | 
 | ||||||
| You can create a simple example file: | You can create a simple example file: | ||||||
| 
 | 
 | ||||||
| .. include:: nonpython/test_simple.yml | .. include:: nonpython/test_simple.yaml | ||||||
|     :literal: |     :literal: | ||||||
| 
 | 
 | ||||||
| and if you installed `PyYAML`_ or a compatible YAML-parser you can | and if you installed `PyYAML`_ or a compatible YAML-parser you can | ||||||
|  | @ -27,14 +27,14 @@ now execute the test specification: | ||||||
| 
 | 
 | ||||||
| .. code-block:: pytest | .. code-block:: pytest | ||||||
| 
 | 
 | ||||||
|     nonpython $ pytest test_simple.yml |     nonpython $ pytest test_simple.yaml | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR/nonpython |     rootdir: $REGENDOC_TMPDIR/nonpython | ||||||
|     collected 2 items |     collected 2 items | ||||||
| 
 | 
 | ||||||
|     test_simple.yml F.                                                   [100%] |     test_simple.yaml F.                                                  [100%] | ||||||
| 
 | 
 | ||||||
|     ================================= FAILURES ================================= |     ================================= FAILURES ================================= | ||||||
|     ______________________________ usecase: hello ______________________________ |     ______________________________ usecase: hello ______________________________ | ||||||
|  | @ -64,13 +64,13 @@ consulted when reporting in ``verbose`` mode: | ||||||
| 
 | 
 | ||||||
|     nonpython $ pytest -v |     nonpython $ pytest -v | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR/nonpython |     rootdir: $REGENDOC_TMPDIR/nonpython | ||||||
|     collecting ... collected 2 items |     collecting ... collected 2 items | ||||||
| 
 | 
 | ||||||
|     test_simple.yml::hello FAILED                                        [ 50%] |     test_simple.yaml::hello FAILED                                       [ 50%] | ||||||
|     test_simple.yml::ok PASSED                                           [100%] |     test_simple.yaml::ok PASSED                                          [100%] | ||||||
| 
 | 
 | ||||||
|     ================================= FAILURES ================================= |     ================================= FAILURES ================================= | ||||||
|     ______________________________ usecase: hello ______________________________ |     ______________________________ usecase: hello ______________________________ | ||||||
|  | @ -88,12 +88,12 @@ interesting to just look at the collection tree: | ||||||
| 
 | 
 | ||||||
|     nonpython $ pytest --collect-only |     nonpython $ pytest --collect-only | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR/nonpython |     rootdir: $REGENDOC_TMPDIR/nonpython | ||||||
|     collected 2 items |     collected 2 items | ||||||
|     <Package $REGENDOC_TMPDIR/nonpython> |     <Package $REGENDOC_TMPDIR/nonpython> | ||||||
|       <YamlFile test_simple.yml> |       <YamlFile test_simple.yaml> | ||||||
|         <YamlItem hello> |         <YamlItem hello> | ||||||
|         <YamlItem ok> |         <YamlItem ok> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -3,7 +3,7 @@ import pytest | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def pytest_collect_file(parent, path): | def pytest_collect_file(parent, path): | ||||||
|     if path.ext == ".yml" and path.basename.startswith("test"): |     if path.ext == ".yaml" and path.basename.startswith("test"): | ||||||
|         return YamlFile(path, parent) |         return YamlFile(path, parent) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| # test_simple.yml | # test_simple.yaml | ||||||
| ok: | ok: | ||||||
|     sub1: sub1 |     sub1: sub1 | ||||||
| 
 | 
 | ||||||
|  | @ -144,7 +144,7 @@ objects, they are still using the default pytest representation: | ||||||
| 
 | 
 | ||||||
|     $ pytest test_time.py --collect-only |     $ pytest test_time.py --collect-only | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 8 items |     collected 8 items | ||||||
|  | @ -203,7 +203,7 @@ this is a fully self-contained example which you can run with: | ||||||
| 
 | 
 | ||||||
|     $ pytest test_scenarios.py |     $ pytest test_scenarios.py | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 4 items |     collected 4 items | ||||||
|  | @ -218,7 +218,7 @@ If you just collect tests you'll also nicely see 'advanced' and 'basic' as varia | ||||||
| 
 | 
 | ||||||
|     $ pytest --collect-only test_scenarios.py |     $ pytest --collect-only test_scenarios.py | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 4 items |     collected 4 items | ||||||
|  | @ -285,7 +285,7 @@ Let's first see how it looks like at collection time: | ||||||
| 
 | 
 | ||||||
|     $ pytest test_backends.py --collect-only |     $ pytest test_backends.py --collect-only | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 2 items |     collected 2 items | ||||||
|  | @ -351,7 +351,7 @@ The result of this test will be successful: | ||||||
| 
 | 
 | ||||||
|     $ pytest test_indirect_list.py --collect-only |     $ pytest test_indirect_list.py --collect-only | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 1 item |     collected 1 item | ||||||
|  | @ -434,10 +434,11 @@ Running it results in some skips if we don't have all the python interpreters in | ||||||
| .. code-block:: pytest | .. code-block:: pytest | ||||||
| 
 | 
 | ||||||
|    . $ pytest -rs -q multipython.py |    . $ pytest -rs -q multipython.py | ||||||
|    ssssssssssss......sss......                                          [100%] |    ssssssssssss...ssssssssssss                                          [100%] | ||||||
|    ========================= short test summary info ========================== |    ========================= short test summary info ========================== | ||||||
|    SKIPPED [15] $REGENDOC_TMPDIR/CWD/multipython.py:30: 'python3.5' not found |    SKIPPED [12] $REGENDOC_TMPDIR/CWD/multipython.py:30: 'python3.5' not found | ||||||
|    12 passed, 15 skipped in 0.12 seconds |    SKIPPED [12] $REGENDOC_TMPDIR/CWD/multipython.py:30: 'python3.7' not found | ||||||
|  |    3 passed, 24 skipped in 0.12 seconds | ||||||
| 
 | 
 | ||||||
| Indirect parametrization of optional implementations/imports | Indirect parametrization of optional implementations/imports | ||||||
| -------------------------------------------------------------------- | -------------------------------------------------------------------- | ||||||
|  | @ -486,7 +487,7 @@ If you run this with reporting for skips enabled: | ||||||
| 
 | 
 | ||||||
|     $ pytest -rs test_module.py |     $ pytest -rs test_module.py | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 2 items |     collected 2 items | ||||||
|  | @ -548,7 +549,7 @@ Then run ``pytest`` with verbose mode and with only the ``basic`` marker: | ||||||
| 
 | 
 | ||||||
|     $ pytest -v -m basic |     $ pytest -v -m basic | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collecting ... collected 17 items / 14 deselected / 3 selected |     collecting ... collected 17 items / 14 deselected / 3 selected | ||||||
|  |  | ||||||
|  | @ -146,7 +146,7 @@ The test collection would look like this: | ||||||
| 
 | 
 | ||||||
|     $ pytest --collect-only |     $ pytest --collect-only | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini |     rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini | ||||||
|     collected 2 items |     collected 2 items | ||||||
|  | @ -208,7 +208,7 @@ You can always peek at the collection tree without running tests like this: | ||||||
| 
 | 
 | ||||||
|     . $ pytest --collect-only pythoncollection.py |     . $ pytest --collect-only pythoncollection.py | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini |     rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini | ||||||
|     collected 3 items |     collected 3 items | ||||||
|  | @ -283,7 +283,7 @@ file will be left out: | ||||||
| 
 | 
 | ||||||
|     $ pytest --collect-only |     $ pytest --collect-only | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini |     rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini | ||||||
|     collected 0 items |     collected 0 items | ||||||
|  |  | ||||||
|  | @ -9,7 +9,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: | ||||||
| 
 | 
 | ||||||
|     assertion $ pytest failure_demo.py |     assertion $ pytest failure_demo.py | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR/assertion |     rootdir: $REGENDOC_TMPDIR/assertion | ||||||
|     collected 44 items |     collected 44 items | ||||||
|  |  | ||||||
|  | @ -127,7 +127,7 @@ directory with the above conftest.py: | ||||||
| 
 | 
 | ||||||
|     $ pytest |     $ pytest | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 0 items |     collected 0 items | ||||||
|  | @ -192,7 +192,7 @@ and when running it will see a skipped "slow" test: | ||||||
| 
 | 
 | ||||||
|     $ pytest -rs    # "-rs" means report details on the little 's' |     $ pytest -rs    # "-rs" means report details on the little 's' | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 2 items |     collected 2 items | ||||||
|  | @ -209,7 +209,7 @@ Or run it including the ``slow`` marked test: | ||||||
| 
 | 
 | ||||||
|     $ pytest --runslow |     $ pytest --runslow | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 2 items |     collected 2 items | ||||||
|  | @ -352,7 +352,7 @@ which will add the string to the test header accordingly: | ||||||
| 
 | 
 | ||||||
|     $ pytest |     $ pytest | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     project deps: mylib-1.1 |     project deps: mylib-1.1 | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|  | @ -381,7 +381,7 @@ which will add info only when run with "--v": | ||||||
| 
 | 
 | ||||||
|     $ pytest -v |     $ pytest -v | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     info1: did you know that ... |     info1: did you know that ... | ||||||
|     did you? |     did you? | ||||||
|  | @ -396,7 +396,7 @@ and nothing when run plainly: | ||||||
| 
 | 
 | ||||||
|     $ pytest |     $ pytest | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 0 items |     collected 0 items | ||||||
|  | @ -436,7 +436,7 @@ Now we can profile which test functions execute the slowest: | ||||||
| 
 | 
 | ||||||
|     $ pytest --durations=3 |     $ pytest --durations=3 | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 3 items |     collected 3 items | ||||||
|  | @ -511,7 +511,7 @@ If we run this: | ||||||
| 
 | 
 | ||||||
|     $ pytest -rx |     $ pytest -rx | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 4 items |     collected 4 items | ||||||
|  | @ -595,7 +595,7 @@ We can run this: | ||||||
| 
 | 
 | ||||||
|     $ pytest |     $ pytest | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 7 items |     collected 7 items | ||||||
|  | @ -709,7 +709,7 @@ and run them: | ||||||
| 
 | 
 | ||||||
|     $ pytest test_module.py |     $ pytest test_module.py | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 2 items |     collected 2 items | ||||||
|  | @ -813,7 +813,7 @@ and run it: | ||||||
| 
 | 
 | ||||||
|     $ pytest -s test_module.py |     $ pytest -s test_module.py | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 3 items |     collected 3 items | ||||||
|  |  | ||||||
|  | @ -72,7 +72,7 @@ marked ``smtp_connection`` fixture function.  Running the test looks like this: | ||||||
| 
 | 
 | ||||||
|     $ pytest test_smtpsimple.py |     $ pytest test_smtpsimple.py | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 1 item |     collected 1 item | ||||||
|  | @ -215,7 +215,7 @@ inspect what is going on and can now run the tests: | ||||||
| 
 | 
 | ||||||
|     $ pytest test_module.py |     $ pytest test_module.py | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 2 items |     collected 2 items | ||||||
|  | @ -708,7 +708,7 @@ Running the above tests results in the following test IDs being used: | ||||||
| 
 | 
 | ||||||
|    $ pytest --collect-only |    $ pytest --collect-only | ||||||
|    =========================== test session starts ============================ |    =========================== test session starts ============================ | ||||||
|    platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |    platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|    cachedir: $PYTHON_PREFIX/.pytest_cache |    cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|    rootdir: $REGENDOC_TMPDIR |    rootdir: $REGENDOC_TMPDIR | ||||||
|    collected 10 items |    collected 10 items | ||||||
|  | @ -753,7 +753,7 @@ Running this test will *skip* the invocation of ``data_set`` with value ``2``: | ||||||
| 
 | 
 | ||||||
|     $ pytest test_fixture_marks.py -v |     $ pytest test_fixture_marks.py -v | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collecting ... collected 3 items |     collecting ... collected 3 items | ||||||
|  | @ -798,7 +798,7 @@ Here we declare an ``app`` fixture which receives the previously defined | ||||||
| 
 | 
 | ||||||
|     $ pytest -v test_appsetup.py |     $ pytest -v test_appsetup.py | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collecting ... collected 2 items |     collecting ... collected 2 items | ||||||
|  | @ -869,7 +869,7 @@ Let's run the tests in verbose mode and with looking at the print-output: | ||||||
| 
 | 
 | ||||||
|     $ pytest -v -s test_module.py |     $ pytest -v -s test_module.py | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collecting ... collected 8 items |     collecting ... collected 8 items | ||||||
|  |  | ||||||
|  | @ -28,7 +28,7 @@ Install ``pytest`` | ||||||
| .. code-block:: bash | .. code-block:: bash | ||||||
| 
 | 
 | ||||||
|     $ pytest --version |     $ pytest --version | ||||||
|     This is pytest version 4.x.y, imported from $PYTHON_PREFIX/lib/python3.6/site-packages/pytest.py |     This is pytest version 5.x.y, imported from $PYTHON_PREFIX/lib/python3.6/site-packages/pytest.py | ||||||
| 
 | 
 | ||||||
| .. _`simpletest`: | .. _`simpletest`: | ||||||
| 
 | 
 | ||||||
|  | @ -50,7 +50,7 @@ That’s it. You can now execute the test function: | ||||||
| 
 | 
 | ||||||
|     $ pytest |     $ pytest | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 1 item |     collected 1 item | ||||||
|  |  | ||||||
|  | @ -219,101 +219,4 @@ against your source code checkout, helping to detect packaging | ||||||
| glitches. | glitches. | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| Integrating with setuptools / ``python setup.py test`` / ``pytest-runner`` |  | ||||||
| -------------------------------------------------------------------------- |  | ||||||
| 
 |  | ||||||
| You can integrate test runs into your setuptools based project |  | ||||||
| with the `pytest-runner <https://pypi.org/project/pytest-runner/>`_ plugin. |  | ||||||
| 
 |  | ||||||
| Add this to ``setup.py`` file: |  | ||||||
| 
 |  | ||||||
| .. code-block:: python |  | ||||||
| 
 |  | ||||||
|     from setuptools import setup |  | ||||||
| 
 |  | ||||||
|     setup( |  | ||||||
|         # ..., |  | ||||||
|         setup_requires=["pytest-runner", ...], |  | ||||||
|         tests_require=["pytest", ...], |  | ||||||
|         # ..., |  | ||||||
|     ) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| And create an alias into ``setup.cfg`` file: |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| .. code-block:: ini |  | ||||||
| 
 |  | ||||||
|     [aliases] |  | ||||||
|     test=pytest |  | ||||||
| 
 |  | ||||||
| If you now type:: |  | ||||||
| 
 |  | ||||||
|     python setup.py test |  | ||||||
| 
 |  | ||||||
| this will execute your tests using ``pytest-runner``. As this is a |  | ||||||
| standalone version of ``pytest`` no prior installation whatsoever is |  | ||||||
| required for calling the test command. You can also pass additional |  | ||||||
| arguments to pytest such as your test directory or other |  | ||||||
| options using ``--addopts``. |  | ||||||
| 
 |  | ||||||
| You can also specify other pytest-ini options in your ``setup.cfg`` file |  | ||||||
| by putting them into a ``[tool:pytest]`` section: |  | ||||||
| 
 |  | ||||||
| .. code-block:: ini |  | ||||||
| 
 |  | ||||||
|     [tool:pytest] |  | ||||||
|     addopts = --verbose |  | ||||||
|     python_files = testing/*/*.py |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| Manual Integration |  | ||||||
| ^^^^^^^^^^^^^^^^^^ |  | ||||||
| 
 |  | ||||||
| If for some reason you don't want/can't use ``pytest-runner``, you can write |  | ||||||
| your own setuptools Test command for invoking pytest. |  | ||||||
| 
 |  | ||||||
| .. code-block:: python |  | ||||||
| 
 |  | ||||||
|     import sys |  | ||||||
| 
 |  | ||||||
|     from setuptools.command.test import test as TestCommand |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     class PyTest(TestCommand): |  | ||||||
|         user_options = [("pytest-args=", "a", "Arguments to pass to pytest")] |  | ||||||
| 
 |  | ||||||
|         def initialize_options(self): |  | ||||||
|             TestCommand.initialize_options(self) |  | ||||||
|             self.pytest_args = "" |  | ||||||
| 
 |  | ||||||
|         def run_tests(self): |  | ||||||
|             import shlex |  | ||||||
| 
 |  | ||||||
|             # import here, cause outside the eggs aren't loaded |  | ||||||
|             import pytest |  | ||||||
| 
 |  | ||||||
|             errno = pytest.main(shlex.split(self.pytest_args)) |  | ||||||
|             sys.exit(errno) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     setup( |  | ||||||
|         # ..., |  | ||||||
|         tests_require=["pytest"], |  | ||||||
|         cmdclass={"pytest": PyTest}, |  | ||||||
|     ) |  | ||||||
| 
 |  | ||||||
| Now if you run:: |  | ||||||
| 
 |  | ||||||
|     python setup.py test |  | ||||||
| 
 |  | ||||||
| this will download ``pytest`` if needed and then run your tests |  | ||||||
| as you would expect it to. You can pass a single string of arguments |  | ||||||
| using the ``--pytest-args`` or ``-a`` command-line option. For example:: |  | ||||||
| 
 |  | ||||||
|     python setup.py test -a "--durations=5" |  | ||||||
| 
 |  | ||||||
| is equivalent to running ``pytest --durations=5``. |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| .. include:: links.inc | .. include:: links.inc | ||||||
|  |  | ||||||
|  | @ -28,7 +28,7 @@ To execute it: | ||||||
| 
 | 
 | ||||||
|     $ pytest |     $ pytest | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 1 item |     collected 1 item | ||||||
|  |  | ||||||
|  | @ -56,7 +56,7 @@ them in turn: | ||||||
| 
 | 
 | ||||||
|     $ pytest |     $ pytest | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 3 items |     collected 3 items | ||||||
|  | @ -121,7 +121,7 @@ Let's run this: | ||||||
| 
 | 
 | ||||||
|     $ pytest |     $ pytest | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 3 items |     collected 3 items | ||||||
|  |  | ||||||
|  | @ -346,7 +346,7 @@ Running it with the report-on-xfail option gives this output: | ||||||
| 
 | 
 | ||||||
|     example $ pytest -rx xfail_demo.py |     example $ pytest -rx xfail_demo.py | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR/example |     rootdir: $REGENDOC_TMPDIR/example | ||||||
|     collected 7 items |     collected 7 items | ||||||
|  |  | ||||||
|  | @ -0,0 +1,39 @@ | ||||||
|  | Sponsor | ||||||
|  | ======= | ||||||
|  | 
 | ||||||
|  | pytest is maintained by a team of volunteers from all around the world in their free time. While | ||||||
|  | we work on pytest because we love the project and use it daily at our daily jobs, monetary | ||||||
|  | compensation when possible is welcome to justify time away from friends, family and personal time. | ||||||
|  | 
 | ||||||
|  | Money is also used to fund local sprints, merchandising (stickers to distribute in conferences for example) | ||||||
|  | and every few years a large sprint involving all members. | ||||||
|  | 
 | ||||||
|  | If you or your company benefit from pytest and would like to contribute to the project financially, | ||||||
|  | we are members of two online donation platforms to better suit your needs. | ||||||
|  | 
 | ||||||
|  | Tidelift | ||||||
|  | -------- | ||||||
|  | 
 | ||||||
|  | `Tidelift`_ aims to make Open Source sustainable by offering subscriptions to companies which rely | ||||||
|  | on Open Source packages. This subscription allows it to pay maintainers of those Open Source | ||||||
|  | packages to aid sustainability of the work. | ||||||
|  | 
 | ||||||
|  | You can help pytest and the ecosystem by obtaining a `Tidelift subscription`_. | ||||||
|  | 
 | ||||||
|  | OpenCollective | ||||||
|  | -------------- | ||||||
|  | 
 | ||||||
|  | `Open Collective`_ is an online funding platform for open and transparent communities. | ||||||
|  | It provide tools to raise money and share your finances in full transparency. | ||||||
|  | 
 | ||||||
|  | It is the platform of choice for individuals and companies that want to make one-time or | ||||||
|  | monthly donations directly to the project. | ||||||
|  | 
 | ||||||
|  | See more datails in the `pytest collective`_. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | .. _Tidelift: https://tidelift.com | ||||||
|  | .. _Tidelift subscription: https://tidelift.com/subscription/pkg/pypi-pytest | ||||||
|  | .. _Open Collective: https://opencollective.com | ||||||
|  | .. _pytest collective: https://opencollective.com/pytest | ||||||
|  | @ -2,12 +2,11 @@ | ||||||
| Talks and Tutorials | Talks and Tutorials | ||||||
| ========================== | ========================== | ||||||
| 
 | 
 | ||||||
| .. |  | ||||||
| .. sidebar:: Next Open Trainings | .. sidebar:: Next Open Trainings | ||||||
| 
 | 
 | ||||||
|       `Professional Testing with Python |    - `Training at Europython 2019 <https://ep2019.europython.eu/talks/94WEnsY-introduction-to-pytest/>`_, 8th July 2019, Basel, Switzerland. | ||||||
|       <http://www.python-academy.com/courses/specialtopics/python_course_testing.html>`_, | 
 | ||||||
|       26-28 April 2017, Leipzig, Germany. |    - `Training at Workshoptage 2019 <https://workshoptage.ch/workshops/2019/test-driven-development-fuer-python-mit-pytest/>`_ (German), 10th September 2019, Rapperswil, Switzerland. | ||||||
| 
 | 
 | ||||||
| .. _`funcargs`: funcargs.html | .. _`funcargs`: funcargs.html | ||||||
| 
 | 
 | ||||||
|  | @ -23,6 +22,8 @@ Books | ||||||
| Talks and blog postings | Talks and blog postings | ||||||
| --------------------------------------------- | --------------------------------------------- | ||||||
| 
 | 
 | ||||||
|  | - `pytest: recommendations, basic packages for testing in Python and Django, Andreu Vallbona, PyBCN June 2019 <https://www.slideshare.net/AndreuVallbonaPlazas/pybcn-pytest-recomendaciones-paquetes-bsicos-para-testing-en-python-y-django>`_. | ||||||
|  | 
 | ||||||
| - pytest: recommendations, basic packages for testing in Python and Django, Andreu Vallbona, PyconES 2017 (`slides in english <http://talks.apsl.io/testing-pycones-2017/>`_, `video in spanish <https://www.youtube.com/watch?v=K20GeR-lXDk>`_) | - pytest: recommendations, basic packages for testing in Python and Django, Andreu Vallbona, PyconES 2017 (`slides in english <http://talks.apsl.io/testing-pycones-2017/>`_, `video in spanish <https://www.youtube.com/watch?v=K20GeR-lXDk>`_) | ||||||
| 
 | 
 | ||||||
| - `pytest advanced, Andrew Svetlov (Russian, PyCon Russia, 2016) | - `pytest advanced, Andrew Svetlov (Russian, PyCon Russia, 2016) | ||||||
|  |  | ||||||
|  | @ -1,4 +0,0 @@ | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| .. include:: ../../TIDELIFT.rst |  | ||||||
|  | @ -41,7 +41,7 @@ Running this would result in a passed test except for the last | ||||||
| 
 | 
 | ||||||
|     $ pytest test_tmp_path.py |     $ pytest test_tmp_path.py | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 1 item |     collected 1 item | ||||||
|  | @ -108,7 +108,7 @@ Running this would result in a passed test except for the last | ||||||
| 
 | 
 | ||||||
|     $ pytest test_tmpdir.py |     $ pytest test_tmpdir.py | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 1 item |     collected 1 item | ||||||
|  |  | ||||||
|  | @ -128,7 +128,7 @@ the ``self.db`` values in the traceback: | ||||||
| 
 | 
 | ||||||
|     $ pytest test_unittest_db.py |     $ pytest test_unittest_db.py | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 2 items |     collected 2 items | ||||||
|  |  | ||||||
|  | @ -204,7 +204,7 @@ Example: | ||||||
| 
 | 
 | ||||||
|     $ pytest -ra |     $ pytest -ra | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 6 items |     collected 6 items | ||||||
|  | @ -258,7 +258,7 @@ More than one character can be used, so for example to only see failed and skipp | ||||||
| 
 | 
 | ||||||
|     $ pytest -rfs |     $ pytest -rfs | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 6 items |     collected 6 items | ||||||
|  | @ -294,7 +294,7 @@ captured output: | ||||||
| 
 | 
 | ||||||
|     $ pytest -rpP |     $ pytest -rpP | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 6 items |     collected 6 items | ||||||
|  |  | ||||||
|  | @ -28,7 +28,7 @@ Running pytest now produces this output: | ||||||
| 
 | 
 | ||||||
|     $ pytest test_show_warnings.py |     $ pytest test_show_warnings.py | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR |     rootdir: $REGENDOC_TMPDIR | ||||||
|     collected 1 item |     collected 1 item | ||||||
|  |  | ||||||
|  | @ -429,7 +429,7 @@ additionally it is possible to copy examples for an example folder before runnin | ||||||
| 
 | 
 | ||||||
|     $ pytest |     $ pytest | ||||||
|     =========================== test session starts ============================ |     =========================== test session starts ============================ | ||||||
|     platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y |     platform linux -- Python 3.x.y, pytest-5.x.y, py-1.x.y, pluggy-0.x.y | ||||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache |     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||||
|     rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini |     rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini | ||||||
|     collected 2 items |     collected 2 items | ||||||
|  | @ -621,12 +621,61 @@ the new plugin: | ||||||
| 
 | 
 | ||||||
| Hooks are usually declared as do-nothing functions that contain only | Hooks are usually declared as do-nothing functions that contain only | ||||||
| documentation describing when the hook will be called and what return values | documentation describing when the hook will be called and what return values | ||||||
| are expected. | are expected. The names of the functions must start with `pytest_` otherwise pytest won't recognize them. | ||||||
| 
 | 
 | ||||||
| For an example, see `newhooks.py`_ from `xdist <https://github.com/pytest-dev/pytest-xdist>`_. | Here's an example. Let's assume this code is in the ``hooks.py`` module. | ||||||
|  | 
 | ||||||
|  | .. code-block:: python | ||||||
|  | 
 | ||||||
|  |     def pytest_my_hook(config): | ||||||
|  |         """ | ||||||
|  |         Receives the pytest config and does things with it | ||||||
|  |         """ | ||||||
|  | 
 | ||||||
|  | To register the hooks with pytest they need to be structured in their own module or class. This | ||||||
|  | class or module can then be passed to the ``pluginmanager`` using the ``pytest_addhooks`` function | ||||||
|  | (which itself is a hook exposed by pytest). | ||||||
|  | 
 | ||||||
|  | .. code-block:: python | ||||||
|  | 
 | ||||||
|  |     def pytest_addhooks(pluginmanager): | ||||||
|  |         """ This example assumes the hooks are grouped in the 'hooks' module. """ | ||||||
|  |         from my_app.tests import hooks | ||||||
|  | 
 | ||||||
|  |         pluginmanager.add_hookspecs(hooks) | ||||||
|  | 
 | ||||||
|  | For a real world example, see `newhooks.py`_ from `xdist <https://github.com/pytest-dev/pytest-xdist>`_. | ||||||
| 
 | 
 | ||||||
| .. _`newhooks.py`: https://github.com/pytest-dev/pytest-xdist/blob/974bd566c599dc6a9ea291838c6f226197208b46/xdist/newhooks.py | .. _`newhooks.py`: https://github.com/pytest-dev/pytest-xdist/blob/974bd566c599dc6a9ea291838c6f226197208b46/xdist/newhooks.py | ||||||
| 
 | 
 | ||||||
|  | Hooks may be called both from fixtures or from other hooks. In both cases, hooks are called | ||||||
|  | through the ``hook`` object, available in the ``config`` object. Most hooks receive a | ||||||
|  | ``config`` object directly, while fixtures may use the ``pytestconfig`` fixture which provides the same object. | ||||||
|  | 
 | ||||||
|  | .. code-block:: python | ||||||
|  | 
 | ||||||
|  |     @pytest.fixture() | ||||||
|  |     def my_fixture(pytestconfig): | ||||||
|  |         # call the hook called "pytest_my_hook" | ||||||
|  |         # 'result' will be a list of return values from all registered functions. | ||||||
|  |         result = pytestconfig.hook.pytest_my_hook(config=pytestconfig) | ||||||
|  | 
 | ||||||
|  | .. note:: | ||||||
|  |     Hooks receive parameters using only keyword arguments. | ||||||
|  | 
 | ||||||
|  | Now your hook is ready to be used. To register a function at the hook, other plugins or users must | ||||||
|  | now simply define the function ``pytest_my_hook`` with the correct signature in their ``conftest.py``. | ||||||
|  | 
 | ||||||
|  | Example: | ||||||
|  | 
 | ||||||
|  | .. code-block:: python | ||||||
|  | 
 | ||||||
|  |     def pytest_my_hook(config): | ||||||
|  |         """ | ||||||
|  |         Print all active hooks to the screen. | ||||||
|  |         """ | ||||||
|  |         print(config.hook) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| Optionally using hooks from 3rd party plugins | Optionally using hooks from 3rd party plugins | ||||||
| --------------------------------------------- | --------------------------------------------- | ||||||
|  |  | ||||||
|  | @ -544,7 +544,7 @@ class ExceptionInfo: | ||||||
|         """ |         """ | ||||||
|         __tracebackhide__ = True |         __tracebackhide__ = True | ||||||
|         if not re.search(regexp, str(self.value)): |         if not re.search(regexp, str(self.value)): | ||||||
|             assert 0, "Pattern '{!s}' not found in '{!s}'".format(regexp, self.value) |             assert 0, "Pattern {!r} not found in {!r}".format(regexp, str(self.value)) | ||||||
|         return True |         return True | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -72,7 +72,7 @@ class StepwisePlugin: | ||||||
| 
 | 
 | ||||||
|     def pytest_runtest_logreport(self, report): |     def pytest_runtest_logreport(self, report): | ||||||
|         # Skip this hook if plugin is not active or the test is xfailed. |         # Skip this hook if plugin is not active or the test is xfailed. | ||||||
|         if not self.active or "xfail" in report.keywords: |         if not self.active: | ||||||
|             return |             return | ||||||
| 
 | 
 | ||||||
|         if report.failed: |         if report.failed: | ||||||
|  |  | ||||||
|  | @ -220,13 +220,20 @@ class TestRaises: | ||||||
|             int("asdf") |             int("asdf") | ||||||
| 
 | 
 | ||||||
|         msg = "with base 16" |         msg = "with base 16" | ||||||
|         expr = r"Pattern '{}' not found in 'invalid literal for int\(\) with base 10: 'asdf''".format( |         expr = r"Pattern '{}' not found in \"invalid literal for int\(\) with base 10: 'asdf'\"".format( | ||||||
|             msg |             msg | ||||||
|         ) |         ) | ||||||
|         with pytest.raises(AssertionError, match=expr): |         with pytest.raises(AssertionError, match=expr): | ||||||
|             with pytest.raises(ValueError, match=msg): |             with pytest.raises(ValueError, match=msg): | ||||||
|                 int("asdf", base=10) |                 int("asdf", base=10) | ||||||
| 
 | 
 | ||||||
|  |     def test_match_failure_string_quoting(self): | ||||||
|  |         with pytest.raises(AssertionError) as excinfo: | ||||||
|  |             with pytest.raises(AssertionError, match="'foo"): | ||||||
|  |                 raise AssertionError("'bar") | ||||||
|  |         msg, = excinfo.value.args | ||||||
|  |         assert msg == 'Pattern "\'foo" not found in "\'bar"' | ||||||
|  | 
 | ||||||
|     def test_raises_match_wrong_type(self): |     def test_raises_match_wrong_type(self): | ||||||
|         """Raising an exception with the wrong type and match= given. |         """Raising an exception with the wrong type and match= given. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -165,3 +165,56 @@ def test_stop_on_collection_errors(broken_testdir, broken_first): | ||||||
|         files.reverse() |         files.reverse() | ||||||
|     result = broken_testdir.runpytest("-v", "--strict-markers", "--stepwise", *files) |     result = broken_testdir.runpytest("-v", "--strict-markers", "--stepwise", *files) | ||||||
|     result.stdout.fnmatch_lines("*errors during collection*") |     result.stdout.fnmatch_lines("*errors during collection*") | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def test_xfail_handling(testdir): | ||||||
|  |     """Ensure normal xfail is ignored, and strict xfail interrupts the session in sw mode | ||||||
|  | 
 | ||||||
|  |     (#5547) | ||||||
|  |     """ | ||||||
|  |     contents = """ | ||||||
|  |         import pytest | ||||||
|  |         def test_a(): pass | ||||||
|  | 
 | ||||||
|  |         @pytest.mark.xfail(strict={strict}) | ||||||
|  |         def test_b(): assert {assert_value} | ||||||
|  | 
 | ||||||
|  |         def test_c(): pass | ||||||
|  |         def test_d(): pass | ||||||
|  |     """ | ||||||
|  |     testdir.makepyfile(contents.format(assert_value="0", strict="False")) | ||||||
|  |     result = testdir.runpytest("--sw", "-v") | ||||||
|  |     result.stdout.fnmatch_lines( | ||||||
|  |         [ | ||||||
|  |             "*::test_a PASSED *", | ||||||
|  |             "*::test_b XFAIL *", | ||||||
|  |             "*::test_c PASSED *", | ||||||
|  |             "*::test_d PASSED *", | ||||||
|  |             "* 3 passed, 1 xfailed in *", | ||||||
|  |         ] | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|  |     testdir.makepyfile(contents.format(assert_value="1", strict="True")) | ||||||
|  |     result = testdir.runpytest("--sw", "-v") | ||||||
|  |     result.stdout.fnmatch_lines( | ||||||
|  |         [ | ||||||
|  |             "*::test_a PASSED *", | ||||||
|  |             "*::test_b FAILED *", | ||||||
|  |             "* Interrupted*", | ||||||
|  |             "* 1 failed, 1 passed in *", | ||||||
|  |         ] | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|  |     # because we are writing to the same file, mtime might not be affected enough to | ||||||
|  |     # invalidate the cache, making this next run flaky | ||||||
|  |     testdir.tmpdir.join("__pycache__").remove() | ||||||
|  |     testdir.makepyfile(contents.format(assert_value="0", strict="True")) | ||||||
|  |     result = testdir.runpytest("--sw", "-v") | ||||||
|  |     result.stdout.fnmatch_lines( | ||||||
|  |         [ | ||||||
|  |             "*::test_b XFAIL *", | ||||||
|  |             "*::test_c PASSED *", | ||||||
|  |             "*::test_d PASSED *", | ||||||
|  |             "* 2 passed, 1 deselected, 1 xfailed in *", | ||||||
|  |         ] | ||||||
|  |     ) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue