commit
						e33736c791
					
				|  | @ -55,10 +55,8 @@ jobs: | |||
|     - env: TOXENV=py37-pluggymaster-xdist | ||||
|     - env: TOXENV=py37-freeze | ||||
| 
 | ||||
|     # Jobs only run via Travis cron jobs (currently daily). | ||||
|     - env: TOXENV=py38-xdist | ||||
|       python: '3.8-dev' | ||||
|       if: type = cron | ||||
| 
 | ||||
|     - stage: baseline | ||||
|       env: TOXENV=py36-xdist | ||||
|  |  | |||
							
								
								
									
										1
									
								
								AUTHORS
								
								
								
								
							
							
						
						
									
										1
									
								
								AUTHORS
								
								
								
								
							|  | @ -15,6 +15,7 @@ Alexander Johnson | |||
| Alexei Kozlenok | ||||
| Allan Feldman | ||||
| Aly Sivji | ||||
| Amir Elkess | ||||
| Anatoly Bubenkoff | ||||
| Anders Hovmöller | ||||
| Andras Mitzki | ||||
|  |  | |||
|  | @ -18,6 +18,28 @@ with advance notice in the **Deprecations** section of releases. | |||
| 
 | ||||
| .. 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) | ||||
| ========================= | ||||
| 
 | ||||
|  |  | |||
|  | @ -169,7 +169,7 @@ Short version | |||
| #. Follow **PEP-8** for naming and `black <https://github.com/python/black>`_ for formatting. | ||||
| #. 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. | ||||
| 
 | ||||
|  | @ -217,7 +217,9 @@ Here is a simple overview, with pytest-specific bits: | |||
|    If you need some help with Git, follow this quick start | ||||
|    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 | ||||
|      $ pre-commit install | ||||
|  | @ -237,20 +239,20 @@ Here is a simple overview, with pytest-specific bits: | |||
| 
 | ||||
| #. 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:: | ||||
| 
 | ||||
|     $ 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. | ||||
| 
 | ||||
| #. 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:: | ||||
| 
 | ||||
|     $ tox -e py27 -- --pdb | ||||
|     $ tox -e py37 -- --pdb | ||||
| 
 | ||||
|    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``, | ||||
|    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. | ||||
| 
 | ||||
|  |  | |||
|  | @ -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 | ||||
| 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 | ||||
| ===== | ||||
| 
 | ||||
|  |  | |||
|  | @ -11,6 +11,7 @@ | |||
|   <li><a href="{{ pathto('contributing') }}">Contributing</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('sponsor') }}">Sponsor</a></li> | ||||
|   <li><a href="{{ pathto('license') }}">License</a></li> | ||||
|   <li><a href="{{ pathto('contact') }}">Contact Channels</a></li> | ||||
| </ul> | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ Release announcements | |||
|    :maxdepth: 2 | ||||
| 
 | ||||
| 
 | ||||
|    release-5.0.1 | ||||
|    release-5.0.0 | ||||
|    release-4.6.4 | ||||
|    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 | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 1 item | ||||
|  | @ -186,7 +186,7 @@ if you run this module: | |||
| 
 | ||||
|     $ pytest test_assert2.py | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 1 item | ||||
|  |  | |||
|  | @ -80,7 +80,7 @@ If you then run it with ``--lf``: | |||
| 
 | ||||
|     $ pytest --lf | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 50 items / 48 deselected / 2 selected | ||||
|  | @ -124,7 +124,7 @@ of ``FF`` and dots): | |||
| 
 | ||||
|     $ pytest --ff | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 50 items | ||||
|  | @ -256,7 +256,7 @@ You can always peek at the content of the cache using the | |||
| 
 | ||||
|     $ pytest --cache-show | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||
|  | @ -284,7 +284,7 @@ filtering: | |||
| 
 | ||||
|     $ pytest --cache-show example/* | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     cachedir: $PYTHON_PREFIX/.pytest_cache | ||||
|  |  | |||
|  | @ -69,7 +69,7 @@ of the failing function and hide the other one: | |||
| 
 | ||||
|     $ pytest | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 2 items | ||||
|  |  | |||
|  | @ -50,7 +50,7 @@ Full pytest documentation | |||
|    projects | ||||
|    faq | ||||
|    contact | ||||
|    tidelift | ||||
|    sponsor | ||||
| 
 | ||||
| .. only:: html | ||||
| 
 | ||||
|  |  | |||
|  | @ -29,7 +29,7 @@ then you can just invoke ``pytest`` directly: | |||
| 
 | ||||
|     $ pytest | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 1 item | ||||
|  | @ -58,7 +58,7 @@ and functions, including from test modules: | |||
| 
 | ||||
|     $ pytest --doctest-modules | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     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 | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     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" | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     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 | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collecting ... collected 1 item | ||||
|  | @ -97,7 +97,7 @@ You can also select on the class: | |||
| 
 | ||||
|     $ pytest -v test_server.py::TestClass | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collecting ... collected 1 item | ||||
|  | @ -112,7 +112,7 @@ Or select multiple nodes: | |||
| 
 | ||||
|     $ pytest -v test_server.py::TestClass test_server.py::test_send_http | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     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 | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     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 | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     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 | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collecting ... collected 4 items / 2 deselected / 2 selected | ||||
|  | @ -406,7 +406,7 @@ the test needs: | |||
| 
 | ||||
|     $ pytest -E stage2 | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 1 item | ||||
|  | @ -421,7 +421,7 @@ and here is one that specifies exactly the environment needed: | |||
| 
 | ||||
|     $ pytest -E stage1 | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     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 | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     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 | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     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 | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     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 | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     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 | ||||
| .. _`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 | ||||
|     :literal: | ||||
| 
 | ||||
| You can create a simple example file: | ||||
| 
 | ||||
| .. include:: nonpython/test_simple.yml | ||||
| .. include:: nonpython/test_simple.yaml | ||||
|     :literal: | ||||
| 
 | ||||
| and if you installed `PyYAML`_ or a compatible YAML-parser you can | ||||
|  | @ -27,14 +27,14 @@ now execute the test specification: | |||
| 
 | ||||
| .. code-block:: pytest | ||||
| 
 | ||||
|     nonpython $ pytest test_simple.yml | ||||
|     nonpython $ pytest test_simple.yaml | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR/nonpython | ||||
|     collected 2 items | ||||
| 
 | ||||
|     test_simple.yml F.                                                   [100%] | ||||
|     test_simple.yaml F.                                                  [100%] | ||||
| 
 | ||||
|     ================================= FAILURES ================================= | ||||
|     ______________________________ usecase: hello ______________________________ | ||||
|  | @ -64,13 +64,13 @@ consulted when reporting in ``verbose`` mode: | |||
| 
 | ||||
|     nonpython $ pytest -v | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR/nonpython | ||||
|     collecting ... collected 2 items | ||||
| 
 | ||||
|     test_simple.yml::hello FAILED                                        [ 50%] | ||||
|     test_simple.yml::ok PASSED                                           [100%] | ||||
|     test_simple.yaml::hello FAILED                                       [ 50%] | ||||
|     test_simple.yaml::ok PASSED                                          [100%] | ||||
| 
 | ||||
|     ================================= FAILURES ================================= | ||||
|     ______________________________ usecase: hello ______________________________ | ||||
|  | @ -88,12 +88,12 @@ interesting to just look at the collection tree: | |||
| 
 | ||||
|     nonpython $ pytest --collect-only | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR/nonpython | ||||
|     collected 2 items | ||||
|     <Package $REGENDOC_TMPDIR/nonpython> | ||||
|       <YamlFile test_simple.yml> | ||||
|       <YamlFile test_simple.yaml> | ||||
|         <YamlItem hello> | ||||
|         <YamlItem ok> | ||||
| 
 | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ import pytest | |||
| 
 | ||||
| 
 | ||||
| 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) | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| # test_simple.yml | ||||
| # test_simple.yaml | ||||
| ok: | ||||
|     sub1: sub1 | ||||
| 
 | ||||
|  | @ -144,7 +144,7 @@ objects, they are still using the default pytest representation: | |||
| 
 | ||||
|     $ pytest test_time.py --collect-only | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 8 items | ||||
|  | @ -203,7 +203,7 @@ this is a fully self-contained example which you can run with: | |||
| 
 | ||||
|     $ pytest test_scenarios.py | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     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 | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 4 items | ||||
|  | @ -285,7 +285,7 @@ Let's first see how it looks like at collection time: | |||
| 
 | ||||
|     $ pytest test_backends.py --collect-only | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 2 items | ||||
|  | @ -351,7 +351,7 @@ The result of this test will be successful: | |||
| 
 | ||||
|     $ pytest test_indirect_list.py --collect-only | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     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 | ||||
| 
 | ||||
|    . $ pytest -rs -q multipython.py | ||||
|    ssssssssssss......sss......                                          [100%] | ||||
|    ssssssssssss...ssssssssssss                                          [100%] | ||||
|    ========================= short test summary info ========================== | ||||
|    SKIPPED [15] $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.5' not found | ||||
|    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 | ||||
| -------------------------------------------------------------------- | ||||
|  | @ -486,7 +487,7 @@ If you run this with reporting for skips enabled: | |||
| 
 | ||||
|     $ pytest -rs test_module.py | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 2 items | ||||
|  | @ -548,7 +549,7 @@ Then run ``pytest`` with verbose mode and with only the ``basic`` marker: | |||
| 
 | ||||
|     $ pytest -v -m basic | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collecting ... collected 17 items / 14 deselected / 3 selected | ||||
|  |  | |||
|  | @ -146,7 +146,7 @@ The test collection would look like this: | |||
| 
 | ||||
|     $ pytest --collect-only | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini | ||||
|     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 | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini | ||||
|     collected 3 items | ||||
|  | @ -283,7 +283,7 @@ file will be left out: | |||
| 
 | ||||
|     $ pytest --collect-only | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini | ||||
|     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 | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR/assertion | ||||
|     collected 44 items | ||||
|  |  | |||
|  | @ -127,7 +127,7 @@ directory with the above conftest.py: | |||
| 
 | ||||
|     $ pytest | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     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' | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 2 items | ||||
|  | @ -209,7 +209,7 @@ Or run it including the ``slow`` marked test: | |||
| 
 | ||||
|     $ pytest --runslow | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 2 items | ||||
|  | @ -352,7 +352,7 @@ which will add the string to the test header accordingly: | |||
| 
 | ||||
|     $ pytest | ||||
|     =========================== 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 | ||||
|     project deps: mylib-1.1 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|  | @ -381,7 +381,7 @@ which will add info only when run with "--v": | |||
| 
 | ||||
|     $ pytest -v | ||||
|     =========================== 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 | ||||
|     info1: did you know that ... | ||||
|     did you? | ||||
|  | @ -396,7 +396,7 @@ and nothing when run plainly: | |||
| 
 | ||||
|     $ pytest | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 0 items | ||||
|  | @ -436,7 +436,7 @@ Now we can profile which test functions execute the slowest: | |||
| 
 | ||||
|     $ pytest --durations=3 | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 3 items | ||||
|  | @ -511,7 +511,7 @@ If we run this: | |||
| 
 | ||||
|     $ pytest -rx | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 4 items | ||||
|  | @ -595,7 +595,7 @@ We can run this: | |||
| 
 | ||||
|     $ pytest | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 7 items | ||||
|  | @ -709,7 +709,7 @@ and run them: | |||
| 
 | ||||
|     $ pytest test_module.py | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 2 items | ||||
|  | @ -813,7 +813,7 @@ and run it: | |||
| 
 | ||||
|     $ pytest -s test_module.py | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 3 items | ||||
|  |  | |||
|  | @ -72,7 +72,7 @@ marked ``smtp_connection`` fixture function.  Running the test looks like this: | |||
| 
 | ||||
|     $ pytest test_smtpsimple.py | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 1 item | ||||
|  | @ -215,7 +215,7 @@ inspect what is going on and can now run the tests: | |||
| 
 | ||||
|     $ pytest test_module.py | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 2 items | ||||
|  | @ -708,7 +708,7 @@ Running the above tests results in the following test IDs being used: | |||
| 
 | ||||
|    $ pytest --collect-only | ||||
|    =========================== 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 | ||||
|    rootdir: $REGENDOC_TMPDIR | ||||
|    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 | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collecting ... collected 3 items | ||||
|  | @ -798,7 +798,7 @@ Here we declare an ``app`` fixture which receives the previously defined | |||
| 
 | ||||
|     $ pytest -v test_appsetup.py | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     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 | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collecting ... collected 8 items | ||||
|  |  | |||
|  | @ -28,7 +28,7 @@ Install ``pytest`` | |||
| .. code-block:: bash | ||||
| 
 | ||||
|     $ 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`: | ||||
| 
 | ||||
|  | @ -50,7 +50,7 @@ That’s it. You can now execute the test function: | |||
| 
 | ||||
|     $ pytest | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 1 item | ||||
|  |  | |||
|  | @ -219,101 +219,4 @@ against your source code checkout, helping to detect packaging | |||
| 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 | ||||
|  |  | |||
|  | @ -28,7 +28,7 @@ To execute it: | |||
| 
 | ||||
|     $ pytest | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 1 item | ||||
|  |  | |||
|  | @ -56,7 +56,7 @@ them in turn: | |||
| 
 | ||||
|     $ pytest | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 3 items | ||||
|  | @ -121,7 +121,7 @@ Let's run this: | |||
| 
 | ||||
|     $ pytest | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 3 items | ||||
|  |  | |||
|  | @ -346,7 +346,7 @@ Running it with the report-on-xfail option gives this output: | |||
| 
 | ||||
|     example $ pytest -rx xfail_demo.py | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR/example | ||||
|     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 | ||||
| ========================== | ||||
| 
 | ||||
| .. | ||||
|    .. sidebar:: Next Open Trainings | ||||
| .. sidebar:: Next Open Trainings | ||||
| 
 | ||||
|       `Professional Testing with Python | ||||
|       <http://www.python-academy.com/courses/specialtopics/python_course_testing.html>`_, | ||||
|       26-28 April 2017, Leipzig, Germany. | ||||
|    - `Training at Europython 2019 <https://ep2019.europython.eu/talks/94WEnsY-introduction-to-pytest/>`_, 8th July 2019, Basel, Switzerland. | ||||
| 
 | ||||
|    - `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 | ||||
| 
 | ||||
|  | @ -23,6 +22,8 @@ Books | |||
| 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 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 | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 1 item | ||||
|  | @ -108,7 +108,7 @@ Running this would result in a passed test except for the last | |||
| 
 | ||||
|     $ pytest test_tmpdir.py | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 1 item | ||||
|  |  | |||
|  | @ -128,7 +128,7 @@ the ``self.db`` values in the traceback: | |||
| 
 | ||||
|     $ pytest test_unittest_db.py | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 2 items | ||||
|  |  | |||
|  | @ -204,7 +204,7 @@ Example: | |||
| 
 | ||||
|     $ pytest -ra | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     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 | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 6 items | ||||
|  | @ -294,7 +294,7 @@ captured output: | |||
| 
 | ||||
|     $ pytest -rpP | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 6 items | ||||
|  |  | |||
|  | @ -28,7 +28,7 @@ Running pytest now produces this output: | |||
| 
 | ||||
|     $ pytest test_show_warnings.py | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR | ||||
|     collected 1 item | ||||
|  |  | |||
|  | @ -429,7 +429,7 @@ additionally it is possible to copy examples for an example folder before runnin | |||
| 
 | ||||
|     $ pytest | ||||
|     =========================== 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 | ||||
|     rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini | ||||
|     collected 2 items | ||||
|  | @ -621,12 +621,61 @@ the new plugin: | |||
| 
 | ||||
| Hooks are usually declared as do-nothing functions that contain only | ||||
| 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 | ||||
| 
 | ||||
| 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 | ||||
| --------------------------------------------- | ||||
|  |  | |||
|  | @ -544,7 +544,7 @@ class ExceptionInfo: | |||
|         """ | ||||
|         __tracebackhide__ = True | ||||
|         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 | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -72,7 +72,7 @@ class StepwisePlugin: | |||
| 
 | ||||
|     def pytest_runtest_logreport(self, report): | ||||
|         # 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 | ||||
| 
 | ||||
|         if report.failed: | ||||
|  |  | |||
|  | @ -220,13 +220,20 @@ class TestRaises: | |||
|             int("asdf") | ||||
| 
 | ||||
|         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 | ||||
|         ) | ||||
|         with pytest.raises(AssertionError, match=expr): | ||||
|             with pytest.raises(ValueError, match=msg): | ||||
|                 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): | ||||
|         """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() | ||||
|     result = broken_testdir.runpytest("-v", "--strict-markers", "--stepwise", *files) | ||||
|     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