commit
dc9a9ec4c2
132
CHANGELOG.rst
132
CHANGELOG.rst
|
@ -8,6 +8,138 @@
|
||||||
|
|
||||||
.. towncrier release notes start
|
.. towncrier release notes start
|
||||||
|
|
||||||
|
Pytest 3.4.0 (2018-01-30)
|
||||||
|
=========================
|
||||||
|
|
||||||
|
Deprecations and Removals
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
- All pytest classes now subclass ``object`` for better Python 2/3 compatibility.
|
||||||
|
This should not affect user code except in very rare edge cases. (`#2147
|
||||||
|
<https://github.com/pytest-dev/pytest/issues/2147>`_)
|
||||||
|
|
||||||
|
|
||||||
|
Features
|
||||||
|
--------
|
||||||
|
|
||||||
|
- Introduce ``empty_parameter_set_mark`` ini option to select which mark to
|
||||||
|
apply when ``@pytest.mark.parametrize`` is given an empty set of parameters.
|
||||||
|
Valid options are ``skip`` (default) and ``xfail``. Note that it is planned
|
||||||
|
to change the default to ``xfail`` in future releases as this is considered
|
||||||
|
less error prone. (`#2527
|
||||||
|
<https://github.com/pytest-dev/pytest/issues/2527>`_)
|
||||||
|
|
||||||
|
- **Incompatible change**: after community feedback the `logging
|
||||||
|
<https://docs.pytest.org/en/latest/logging.html>`_ functionality has
|
||||||
|
undergone some changes. Please consult the `logging documentation
|
||||||
|
<https://docs.pytest.org/en/latest/logging.html#incompatible-changes-in-pytest-3-4>`_
|
||||||
|
for details. (`#3013 <https://github.com/pytest-dev/pytest/issues/3013>`_)
|
||||||
|
|
||||||
|
- Console output falls back to "classic" mode when capturing is disabled (``-s``),
|
||||||
|
otherwise the output gets garbled to the point of being useless. (`#3038
|
||||||
|
<https://github.com/pytest-dev/pytest/issues/3038>`_)
|
||||||
|
|
||||||
|
- New `pytest_runtest_logfinish
|
||||||
|
<https://docs.pytest.org/en/latest/writing_plugins.html#_pytest.hookspec.pytest_runtest_logfinish>`_
|
||||||
|
hook which is called when a test item has finished executing, analogous to
|
||||||
|
`pytest_runtest_logstart
|
||||||
|
<https://docs.pytest.org/en/latest/writing_plugins.html#_pytest.hookspec.pytest_runtest_start>`_.
|
||||||
|
(`#3101 <https://github.com/pytest-dev/pytest/issues/3101>`_)
|
||||||
|
|
||||||
|
- Improve performance when collecting tests using many fixtures. (`#3107
|
||||||
|
<https://github.com/pytest-dev/pytest/issues/3107>`_)
|
||||||
|
|
||||||
|
- New ``caplog.get_records(when)`` method which provides access to the captured
|
||||||
|
records for the ``"setup"``, ``"call"`` and ``"teardown"``
|
||||||
|
testing stages. (`#3117 <https://github.com/pytest-dev/pytest/issues/3117>`_)
|
||||||
|
|
||||||
|
- New fixture ``record_xml_attribute`` that allows modifying and inserting
|
||||||
|
attributes on the ``<testcase>`` xml node in JUnit reports. (`#3130
|
||||||
|
<https://github.com/pytest-dev/pytest/issues/3130>`_)
|
||||||
|
|
||||||
|
- The default cache directory has been renamed from ``.cache`` to
|
||||||
|
``.pytest_cache`` after community feedback that the name ``.cache`` did not
|
||||||
|
make it clear that it was used by pytest. (`#3138
|
||||||
|
<https://github.com/pytest-dev/pytest/issues/3138>`_)
|
||||||
|
|
||||||
|
- Colorize the levelname column in the live-log output. (`#3142
|
||||||
|
<https://github.com/pytest-dev/pytest/issues/3142>`_)
|
||||||
|
|
||||||
|
|
||||||
|
Bug Fixes
|
||||||
|
---------
|
||||||
|
|
||||||
|
- Fix hanging pexpect test on MacOS by using flush() instead of wait().
|
||||||
|
(`#2022 <https://github.com/pytest-dev/pytest/issues/2022>`_)
|
||||||
|
|
||||||
|
- Fix restoring Python state after in-process pytest runs with the
|
||||||
|
``pytester`` plugin; this may break tests using multiple inprocess
|
||||||
|
pytest runs if later ones depend on earlier ones leaking global interpreter
|
||||||
|
changes. (`#3016 <https://github.com/pytest-dev/pytest/issues/3016>`_)
|
||||||
|
|
||||||
|
- Fix skipping plugin reporting hook when test aborted before plugin setup
|
||||||
|
hook. (`#3074 <https://github.com/pytest-dev/pytest/issues/3074>`_)
|
||||||
|
|
||||||
|
- Fix progress percentage reported when tests fail during teardown. (`#3088
|
||||||
|
<https://github.com/pytest-dev/pytest/issues/3088>`_)
|
||||||
|
|
||||||
|
- **Incompatible change**: ``-o/--override`` option no longer eats all the
|
||||||
|
remaining options, which can lead to surprising behavior: for example,
|
||||||
|
``pytest -o foo=1 /path/to/test.py`` would fail because ``/path/to/test.py``
|
||||||
|
would be considered as part of the ``-o`` command-line argument. One
|
||||||
|
consequence of this is that now multiple configuration overrides need
|
||||||
|
multiple ``-o`` flags: ``pytest -o foo=1 -o bar=2``. (`#3103
|
||||||
|
<https://github.com/pytest-dev/pytest/issues/3103>`_)
|
||||||
|
|
||||||
|
|
||||||
|
Improved Documentation
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
- Document hooks (defined with ``historic=True``) which cannot be used with
|
||||||
|
``hookwrapper=True``. (`#2423
|
||||||
|
<https://github.com/pytest-dev/pytest/issues/2423>`_)
|
||||||
|
|
||||||
|
- Clarify that warning capturing doesn't change the warning filter by default.
|
||||||
|
(`#2457 <https://github.com/pytest-dev/pytest/issues/2457>`_)
|
||||||
|
|
||||||
|
- Clarify a possible confusion when using pytest_fixture_setup with fixture
|
||||||
|
functions that return None. (`#2698
|
||||||
|
<https://github.com/pytest-dev/pytest/issues/2698>`_)
|
||||||
|
|
||||||
|
- Fix the wording of a sentence on doctest flags used in pytest. (`#3076
|
||||||
|
<https://github.com/pytest-dev/pytest/issues/3076>`_)
|
||||||
|
|
||||||
|
- Prefer ``https://*.readthedocs.io`` over ``http://*.rtfd.org`` for links in
|
||||||
|
the documentation. (`#3092
|
||||||
|
<https://github.com/pytest-dev/pytest/issues/3092>`_)
|
||||||
|
|
||||||
|
- Improve readability (wording, grammar) of Getting Started guide (`#3131
|
||||||
|
<https://github.com/pytest-dev/pytest/issues/3131>`_)
|
||||||
|
|
||||||
|
- Added note that calling pytest.main multiple times from the same process is
|
||||||
|
not recommended because of import caching. (`#3143
|
||||||
|
<https://github.com/pytest-dev/pytest/issues/3143>`_)
|
||||||
|
|
||||||
|
|
||||||
|
Trivial/Internal Changes
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
- Show a simple and easy error when keyword expressions trigger a syntax error
|
||||||
|
(for example, ``"-k foo and import"`` will show an error that you can not use
|
||||||
|
the ``import`` keyword in expressions). (`#2953
|
||||||
|
<https://github.com/pytest-dev/pytest/issues/2953>`_)
|
||||||
|
|
||||||
|
- Change parametrized automatic test id generation to use the ``__name__``
|
||||||
|
attribute of functions instead of the fallback argument name plus counter.
|
||||||
|
(`#2976 <https://github.com/pytest-dev/pytest/issues/2976>`_)
|
||||||
|
|
||||||
|
- Replace py.std with stdlib imports. (`#3067
|
||||||
|
<https://github.com/pytest-dev/pytest/issues/3067>`_)
|
||||||
|
|
||||||
|
- Corrected 'you' to 'your' in logging docs. (`#3129
|
||||||
|
<https://github.com/pytest-dev/pytest/issues/3129>`_)
|
||||||
|
|
||||||
|
|
||||||
Pytest 3.3.2 (2017-12-25)
|
Pytest 3.3.2 (2017-12-25)
|
||||||
=========================
|
=========================
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ taking a lot of time to make a new one.
|
||||||
|
|
||||||
#. Install development dependencies in a virtual environment with::
|
#. Install development dependencies in a virtual environment with::
|
||||||
|
|
||||||
pip3 install -r tasks/requirements.txt
|
pip3 install -U -r tasks/requirements.txt
|
||||||
|
|
||||||
#. Create a branch ``release-X.Y.Z`` with the version for the release.
|
#. Create a branch ``release-X.Y.Z`` with the version for the release.
|
||||||
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
Fixed hanging pexpect test on MacOS by using flush() instead of wait().
|
|
|
@ -1 +0,0 @@
|
||||||
All pytest classes now subclass ``object`` for better Python 3 compatibility. This should not affect user code except in very rare edge cases.
|
|
|
@ -1 +0,0 @@
|
||||||
Document hooks (defined with ``historic=True``) which cannot be used with ``hookwrapper=True``.
|
|
|
@ -1 +0,0 @@
|
||||||
Clarify that warning capturing doesn't change the warning filter by default.
|
|
|
@ -1 +0,0 @@
|
||||||
Introduce ``empty_parameter_set_mark`` ini option to select which mark to apply when ``@pytest.mark.parametrize`` is given an empty set of parameters. Valid options are ``skip`` (default) and ``xfail``. Note that it is planned to change the default to ``xfail`` in future releases as this is considered less error prone.
|
|
|
@ -1 +0,0 @@
|
||||||
Clarify a possible confusion when using pytest_fixture_setup with fixture functions that return None.
|
|
|
@ -1 +0,0 @@
|
||||||
Show a simple and easy error when keyword expressions trigger a syntax error (for example, ``"-k foo and import"`` will show an error that you can not use the ``import`` keyword in expressions).
|
|
|
@ -1 +0,0 @@
|
||||||
Change parametrized automatic test id generation to use the ``__name__`` attribute of functions instead of the fallback argument name plus counter.
|
|
|
@ -1 +0,0 @@
|
||||||
**Incompatible change**: after community feedback the `logging <https://docs.pytest.org/en/latest/logging.html>`_ functionality has undergone some changes. Please consult the `logging documentation <https://docs.pytest.org/en/latest/logging.html#incompatible-changes-in-pytest-3-4>`_ for details.
|
|
|
@ -1,2 +0,0 @@
|
||||||
Fixed restoring Python state after in-process pytest runs with the ``pytester`` plugin; this may break tests using
|
|
||||||
making multiple inprocess pytest runs if later ones depend on earlier ones leaking global interpreter changes.
|
|
|
@ -1 +0,0 @@
|
||||||
Console output fallsback to "classic" mode when capture is disabled (``-s``), otherwise the output gets garbled to the point of being useless.
|
|
|
@ -1 +0,0 @@
|
||||||
Replace py.std with stdlib imports.
|
|
|
@ -1 +0,0 @@
|
||||||
Fix skipping plugin reporting hook when test aborted before plugin setup hook.
|
|
|
@ -1 +0,0 @@
|
||||||
Fix the wording of a sentence on doctest flags use in pytest.
|
|
|
@ -1 +0,0 @@
|
||||||
Fix progress percentage reported when tests fail during teardown.
|
|
|
@ -1 +0,0 @@
|
||||||
Prefer ``https://*.readthedocs.io`` over ``http://*.rtfd.org`` for links in the documentation.
|
|
|
@ -1,3 +0,0 @@
|
||||||
New `pytest_runtest_logfinish <https://docs.pytest.org/en/latest/writing_plugins.html#_pytest.hookspec.pytest_runtest_logfinish>`_
|
|
||||||
hook which is called when a test item has finished executing, analogous to
|
|
||||||
`pytest_runtest_logstart <https://docs.pytest.org/en/latest/writing_plugins.html#_pytest.hookspec.pytest_runtest_start>`_.
|
|
|
@ -1 +0,0 @@
|
||||||
**Incompatible change**: ``-o/--override`` option no longer eats all the remaining options, which can lead to surprising behavior: for example, ``pytest -o foo=1 /path/to/test.py`` would fail because ``/path/to/test.py`` would be considered as part of the ``-o`` command-line argument. One consequence of this is that now multiple configuration overrides need multiple ``-o`` flags: ``pytest -o foo=1 -o bar=2``.
|
|
|
@ -1 +0,0 @@
|
||||||
Improve performance when collecting tests using many fixtures.
|
|
|
@ -1 +0,0 @@
|
||||||
New ``caplog.get_records(when)`` method which provides access the captured records during each testing stage: ``"setup"``, ``"call"`` and ``"teardown"`` stages.
|
|
|
@ -1 +0,0 @@
|
||||||
Corrected 'you' to 'your' in logging docs.
|
|
|
@ -1 +0,0 @@
|
||||||
New fixture ``record_xml_attribute`` that allows modifying and inserting attributes on the ``<testcase>`` xml node in JUnit reports.
|
|
|
@ -1 +0,0 @@
|
||||||
Improve readability (wording, grammar) of Getting Started guide
|
|
|
@ -1 +0,0 @@
|
||||||
The default cache directory has been renamed from ``.cache`` to ``.pytest_cache`` after community feedback that the name ``.cache`` did not make it clear that it was used by pytest.
|
|
|
@ -1 +0,0 @@
|
||||||
Colorize the levelname column in the live-log output.
|
|
|
@ -1 +0,0 @@
|
||||||
Added note that calling pytest.main multiple times from the same process is not recommended because of import caching.
|
|
|
@ -6,6 +6,7 @@ Release announcements
|
||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
|
|
||||||
|
|
||||||
|
release-3.4.0
|
||||||
release-3.3.2
|
release-3.3.2
|
||||||
release-3.3.1
|
release-3.3.1
|
||||||
release-3.3.0
|
release-3.3.0
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
pytest-3.4.0
|
||||||
|
=======================================
|
||||||
|
|
||||||
|
The pytest team is proud to announce the 3.4.0 release!
|
||||||
|
|
||||||
|
pytest is a mature Python testing tool with more than a 1600 tests
|
||||||
|
against itself, passing on many different interpreters and platforms.
|
||||||
|
|
||||||
|
This release contains a number of bugs fixes and improvements, so users are encouraged
|
||||||
|
to take a look at the CHANGELOG:
|
||||||
|
|
||||||
|
http://doc.pytest.org/en/latest/changelog.html
|
||||||
|
|
||||||
|
For complete documentation, please visit:
|
||||||
|
|
||||||
|
http://docs.pytest.org
|
||||||
|
|
||||||
|
As usual, you can upgrade from pypi via:
|
||||||
|
|
||||||
|
pip install -U pytest
|
||||||
|
|
||||||
|
Thanks to all who contributed to this release, among them:
|
||||||
|
|
||||||
|
* Aaron
|
||||||
|
* Alan Velasco
|
||||||
|
* Anders Hovmöller
|
||||||
|
* Andrew Toolan
|
||||||
|
* Anthony Sottile
|
||||||
|
* Aron Coyle
|
||||||
|
* Brian Maissy
|
||||||
|
* Bruno Oliveira
|
||||||
|
* Cyrus Maden
|
||||||
|
* Florian Bruhin
|
||||||
|
* Henk-Jaap Wagenaar
|
||||||
|
* Ian Lesperance
|
||||||
|
* Jon Dufresne
|
||||||
|
* Jurko Gospodnetić
|
||||||
|
* Kate
|
||||||
|
* Kimberly
|
||||||
|
* Per A. Brodtkorb
|
||||||
|
* Pierre-Alexandre Fonta
|
||||||
|
* Raphael Castaneda
|
||||||
|
* Ronny Pfannschmidt
|
||||||
|
* ST John
|
||||||
|
* Segev Finer
|
||||||
|
* Thomas Hisch
|
||||||
|
* Tzu-ping Chung
|
||||||
|
* feuillemorte
|
||||||
|
|
||||||
|
|
||||||
|
Happy testing,
|
||||||
|
The Pytest Development Team
|
|
@ -116,6 +116,10 @@ You can ask for available builtin or project-custom
|
||||||
Add extra xml properties to the tag for the calling test.
|
Add extra xml properties to the tag for the calling test.
|
||||||
The fixture is callable with ``(name, value)``, with value being automatically
|
The fixture is callable with ``(name, value)``, with value being automatically
|
||||||
xml-encoded.
|
xml-encoded.
|
||||||
|
record_xml_attribute
|
||||||
|
Add extra xml attributes to the tag for the calling test.
|
||||||
|
The fixture is callable with ``(name, value)``, with value being automatically
|
||||||
|
xml-encoded
|
||||||
caplog
|
caplog
|
||||||
Access and control log capturing.
|
Access and control log capturing.
|
||||||
|
|
||||||
|
|
|
@ -225,7 +225,7 @@ You can always peek at the content of the cache using the
|
||||||
=========================== test session starts ============================
|
=========================== test session starts ============================
|
||||||
platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y
|
platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
cachedir: $REGENDOC_TMPDIR/.cache
|
cachedir: $REGENDOC_TMPDIR/.pytest_cache
|
||||||
------------------------------- cache values -------------------------------
|
------------------------------- cache values -------------------------------
|
||||||
cache/lastfailed contains:
|
cache/lastfailed contains:
|
||||||
{'test_caching.py::test_function': True}
|
{'test_caching.py::test_function': True}
|
||||||
|
|
|
@ -157,6 +157,8 @@ class TestRaises(object):
|
||||||
|
|
||||||
# thanks to Matthew Scott for this test
|
# thanks to Matthew Scott for this test
|
||||||
def test_dynamic_compile_shows_nicely():
|
def test_dynamic_compile_shows_nicely():
|
||||||
|
import imp
|
||||||
|
import sys
|
||||||
src = 'def foo():\n assert 1 == 0\n'
|
src = 'def foo():\n assert 1 == 0\n'
|
||||||
name = 'abc-123'
|
name = 'abc-123'
|
||||||
module = imp.new_module(name)
|
module = imp.new_module(name)
|
||||||
|
|
|
@ -32,7 +32,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-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .pytest_cache
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collecting ... collected 4 items
|
collecting ... collected 4 items
|
||||||
|
|
||||||
|
@ -46,7 +46,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-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .pytest_cache
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collecting ... collected 4 items
|
collecting ... collected 4 items
|
||||||
|
|
||||||
|
@ -67,7 +67,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-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .pytest_cache
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collecting ... collected 1 item
|
collecting ... collected 1 item
|
||||||
|
|
||||||
|
@ -80,7 +80,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-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .pytest_cache
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collecting ... collected 1 item
|
collecting ... collected 1 item
|
||||||
|
|
||||||
|
@ -93,7 +93,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-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .pytest_cache
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collecting ... collected 2 items
|
collecting ... collected 2 items
|
||||||
|
|
||||||
|
@ -131,7 +131,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-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .pytest_cache
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collecting ... collected 4 items
|
collecting ... collected 4 items
|
||||||
|
|
||||||
|
@ -145,7 +145,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-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .pytest_cache
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collecting ... collected 4 items
|
collecting ... collected 4 items
|
||||||
|
|
||||||
|
@ -161,7 +161,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-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .pytest_cache
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collecting ... collected 4 items
|
collecting ... collected 4 items
|
||||||
|
|
||||||
|
@ -432,7 +432,7 @@ The output is as follows::
|
||||||
|
|
||||||
$ pytest -q -s
|
$ pytest -q -s
|
||||||
Marker info name=my_marker args=(<function hello_world at 0xdeadbeef>,) kwars={}
|
Marker info name=my_marker args=(<function hello_world at 0xdeadbeef>,) kwars={}
|
||||||
. [100%]
|
.
|
||||||
1 passed in 0.12 seconds
|
1 passed in 0.12 seconds
|
||||||
|
|
||||||
We can see that the custom marker has its argument set extended with the function ``hello_world``. This is the key difference between creating a custom marker as a callable, which invokes ``__call__`` behind the scenes, and using ``with_args``.
|
We can see that the custom marker has its argument set extended with the function ``hello_world``. This is the key difference between creating a custom marker as a callable, which invokes ``__call__`` behind the scenes, and using ``with_args``.
|
||||||
|
@ -477,7 +477,7 @@ Let's run this without capturing output and see what we get::
|
||||||
glob args=('function',) kwargs={'x': 3}
|
glob args=('function',) kwargs={'x': 3}
|
||||||
glob args=('class',) kwargs={'x': 2}
|
glob args=('class',) kwargs={'x': 2}
|
||||||
glob args=('module',) kwargs={'x': 1}
|
glob args=('module',) kwargs={'x': 1}
|
||||||
. [100%]
|
.
|
||||||
1 passed in 0.12 seconds
|
1 passed in 0.12 seconds
|
||||||
|
|
||||||
marking platform specific tests with pytest
|
marking platform specific tests with pytest
|
||||||
|
|
|
@ -60,7 +60,7 @@ 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-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .pytest_cache
|
||||||
rootdir: $REGENDOC_TMPDIR/nonpython, inifile:
|
rootdir: $REGENDOC_TMPDIR/nonpython, inifile:
|
||||||
collecting ... collected 2 items
|
collecting ... collected 2 items
|
||||||
|
|
||||||
|
|
|
@ -411,6 +411,8 @@ get on the terminal - we are working on that)::
|
||||||
____________________ test_dynamic_compile_shows_nicely _____________________
|
____________________ test_dynamic_compile_shows_nicely _____________________
|
||||||
|
|
||||||
def test_dynamic_compile_shows_nicely():
|
def test_dynamic_compile_shows_nicely():
|
||||||
|
import imp
|
||||||
|
import sys
|
||||||
src = 'def foo():\n assert 1 == 0\n'
|
src = 'def foo():\n assert 1 == 0\n'
|
||||||
name = 'abc-123'
|
name = 'abc-123'
|
||||||
module = imp.new_module(name)
|
module = imp.new_module(name)
|
||||||
|
@ -419,14 +421,14 @@ get on the terminal - we are working on that)::
|
||||||
sys.modules[name] = module
|
sys.modules[name] = module
|
||||||
> module.foo()
|
> module.foo()
|
||||||
|
|
||||||
failure_demo.py:166:
|
failure_demo.py:168:
|
||||||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||||
|
|
||||||
def foo():
|
def foo():
|
||||||
> assert 1 == 0
|
> assert 1 == 0
|
||||||
E AssertionError
|
E AssertionError
|
||||||
|
|
||||||
<2-codegen 'abc-123' $REGENDOC_TMPDIR/assertion/failure_demo.py:163>:2: AssertionError
|
<2-codegen 'abc-123' $REGENDOC_TMPDIR/assertion/failure_demo.py:165>:2: AssertionError
|
||||||
____________________ TestMoreErrors.test_complex_error _____________________
|
____________________ TestMoreErrors.test_complex_error _____________________
|
||||||
|
|
||||||
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
||||||
|
@ -438,7 +440,7 @@ get on the terminal - we are working on that)::
|
||||||
return 43
|
return 43
|
||||||
> somefunc(f(), g())
|
> somefunc(f(), g())
|
||||||
|
|
||||||
failure_demo.py:176:
|
failure_demo.py:178:
|
||||||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||||
failure_demo.py:9: in somefunc
|
failure_demo.py:9: in somefunc
|
||||||
otherfunc(x,y)
|
otherfunc(x,y)
|
||||||
|
@ -460,7 +462,7 @@ get on the terminal - we are working on that)::
|
||||||
> a,b = l
|
> a,b = l
|
||||||
E ValueError: not enough values to unpack (expected 2, got 0)
|
E ValueError: not enough values to unpack (expected 2, got 0)
|
||||||
|
|
||||||
failure_demo.py:180: ValueError
|
failure_demo.py:182: ValueError
|
||||||
____________________ TestMoreErrors.test_z2_type_error _____________________
|
____________________ TestMoreErrors.test_z2_type_error _____________________
|
||||||
|
|
||||||
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
||||||
|
@ -470,7 +472,7 @@ get on the terminal - we are working on that)::
|
||||||
> a,b = l
|
> a,b = l
|
||||||
E TypeError: 'int' object is not iterable
|
E TypeError: 'int' object is not iterable
|
||||||
|
|
||||||
failure_demo.py:184: TypeError
|
failure_demo.py:186: TypeError
|
||||||
______________________ TestMoreErrors.test_startswith ______________________
|
______________________ TestMoreErrors.test_startswith ______________________
|
||||||
|
|
||||||
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
||||||
|
@ -483,7 +485,7 @@ get on the terminal - we are working on that)::
|
||||||
E + where False = <built-in method startswith of str object at 0xdeadbeef>('456')
|
E + where False = <built-in method startswith of str object at 0xdeadbeef>('456')
|
||||||
E + where <built-in method startswith of str object at 0xdeadbeef> = '123'.startswith
|
E + where <built-in method startswith of str object at 0xdeadbeef> = '123'.startswith
|
||||||
|
|
||||||
failure_demo.py:189: AssertionError
|
failure_demo.py:191: AssertionError
|
||||||
__________________ TestMoreErrors.test_startswith_nested ___________________
|
__________________ TestMoreErrors.test_startswith_nested ___________________
|
||||||
|
|
||||||
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
||||||
|
@ -500,7 +502,7 @@ get on the terminal - we are working on that)::
|
||||||
E + where '123' = <function TestMoreErrors.test_startswith_nested.<locals>.f at 0xdeadbeef>()
|
E + where '123' = <function TestMoreErrors.test_startswith_nested.<locals>.f at 0xdeadbeef>()
|
||||||
E + and '456' = <function TestMoreErrors.test_startswith_nested.<locals>.g at 0xdeadbeef>()
|
E + and '456' = <function TestMoreErrors.test_startswith_nested.<locals>.g at 0xdeadbeef>()
|
||||||
|
|
||||||
failure_demo.py:196: AssertionError
|
failure_demo.py:198: AssertionError
|
||||||
_____________________ TestMoreErrors.test_global_func ______________________
|
_____________________ TestMoreErrors.test_global_func ______________________
|
||||||
|
|
||||||
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
||||||
|
@ -511,7 +513,7 @@ get on the terminal - we are working on that)::
|
||||||
E + where False = isinstance(43, float)
|
E + where False = isinstance(43, float)
|
||||||
E + where 43 = globf(42)
|
E + where 43 = globf(42)
|
||||||
|
|
||||||
failure_demo.py:199: AssertionError
|
failure_demo.py:201: AssertionError
|
||||||
_______________________ TestMoreErrors.test_instance _______________________
|
_______________________ TestMoreErrors.test_instance _______________________
|
||||||
|
|
||||||
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
||||||
|
@ -522,7 +524,7 @@ get on the terminal - we are working on that)::
|
||||||
E assert 42 != 42
|
E assert 42 != 42
|
||||||
E + where 42 = <failure_demo.TestMoreErrors object at 0xdeadbeef>.x
|
E + where 42 = <failure_demo.TestMoreErrors object at 0xdeadbeef>.x
|
||||||
|
|
||||||
failure_demo.py:203: AssertionError
|
failure_demo.py:205: AssertionError
|
||||||
_______________________ TestMoreErrors.test_compare ________________________
|
_______________________ TestMoreErrors.test_compare ________________________
|
||||||
|
|
||||||
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
||||||
|
@ -532,7 +534,7 @@ get on the terminal - we are working on that)::
|
||||||
E assert 11 < 5
|
E assert 11 < 5
|
||||||
E + where 11 = globf(10)
|
E + where 11 = globf(10)
|
||||||
|
|
||||||
failure_demo.py:206: AssertionError
|
failure_demo.py:208: AssertionError
|
||||||
_____________________ TestMoreErrors.test_try_finally ______________________
|
_____________________ TestMoreErrors.test_try_finally ______________________
|
||||||
|
|
||||||
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
self = <failure_demo.TestMoreErrors object at 0xdeadbeef>
|
||||||
|
@ -543,7 +545,7 @@ get on the terminal - we are working on that)::
|
||||||
> assert x == 0
|
> assert x == 0
|
||||||
E assert 1 == 0
|
E assert 1 == 0
|
||||||
|
|
||||||
failure_demo.py:211: AssertionError
|
failure_demo.py:213: AssertionError
|
||||||
___________________ TestCustomAssertMsg.test_single_line ___________________
|
___________________ TestCustomAssertMsg.test_single_line ___________________
|
||||||
|
|
||||||
self = <failure_demo.TestCustomAssertMsg object at 0xdeadbeef>
|
self = <failure_demo.TestCustomAssertMsg object at 0xdeadbeef>
|
||||||
|
@ -557,7 +559,7 @@ get on the terminal - we are working on that)::
|
||||||
E assert 1 == 2
|
E assert 1 == 2
|
||||||
E + where 1 = <class 'failure_demo.TestCustomAssertMsg.test_single_line.<locals>.A'>.a
|
E + where 1 = <class 'failure_demo.TestCustomAssertMsg.test_single_line.<locals>.A'>.a
|
||||||
|
|
||||||
failure_demo.py:222: AssertionError
|
failure_demo.py:224: AssertionError
|
||||||
____________________ TestCustomAssertMsg.test_multiline ____________________
|
____________________ TestCustomAssertMsg.test_multiline ____________________
|
||||||
|
|
||||||
self = <failure_demo.TestCustomAssertMsg object at 0xdeadbeef>
|
self = <failure_demo.TestCustomAssertMsg object at 0xdeadbeef>
|
||||||
|
@ -574,7 +576,7 @@ get on the terminal - we are working on that)::
|
||||||
E assert 1 == 2
|
E assert 1 == 2
|
||||||
E + where 1 = <class 'failure_demo.TestCustomAssertMsg.test_multiline.<locals>.A'>.a
|
E + where 1 = <class 'failure_demo.TestCustomAssertMsg.test_multiline.<locals>.A'>.a
|
||||||
|
|
||||||
failure_demo.py:228: AssertionError
|
failure_demo.py:230: AssertionError
|
||||||
___________________ TestCustomAssertMsg.test_custom_repr ___________________
|
___________________ TestCustomAssertMsg.test_custom_repr ___________________
|
||||||
|
|
||||||
self = <failure_demo.TestCustomAssertMsg object at 0xdeadbeef>
|
self = <failure_demo.TestCustomAssertMsg object at 0xdeadbeef>
|
||||||
|
@ -594,7 +596,7 @@ get on the terminal - we are working on that)::
|
||||||
E assert 1 == 2
|
E assert 1 == 2
|
||||||
E + where 1 = This is JSON\n{\n 'foo': 'bar'\n}.a
|
E + where 1 = This is JSON\n{\n 'foo': 'bar'\n}.a
|
||||||
|
|
||||||
failure_demo.py:238: AssertionError
|
failure_demo.py:240: AssertionError
|
||||||
============================= warnings summary =============================
|
============================= warnings summary =============================
|
||||||
None
|
None
|
||||||
Metafunc.addcall is deprecated and scheduled to be removed in pytest 4.0.
|
Metafunc.addcall is deprecated and scheduled to be removed in pytest 4.0.
|
||||||
|
|
|
@ -332,7 +332,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-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .pytest_cache
|
||||||
info1: did you know that ...
|
info1: did you know that ...
|
||||||
did you?
|
did you?
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
|
@ -385,9 +385,9 @@ Now we can profile which test functions execute the slowest::
|
||||||
test_some_are_slow.py ... [100%]
|
test_some_are_slow.py ... [100%]
|
||||||
|
|
||||||
========================= slowest 3 test durations =========================
|
========================= slowest 3 test durations =========================
|
||||||
0.31s call test_some_are_slow.py::test_funcslow2
|
0.58s call test_some_are_slow.py::test_funcslow2
|
||||||
0.20s call test_some_are_slow.py::test_funcslow1
|
0.41s call test_some_are_slow.py::test_funcslow1
|
||||||
0.17s call test_some_are_slow.py::test_funcfast
|
0.10s call test_some_are_slow.py::test_funcfast
|
||||||
========================= 3 passed in 0.12 seconds =========================
|
========================= 3 passed in 0.12 seconds =========================
|
||||||
|
|
||||||
incremental testing - test steps
|
incremental testing - test steps
|
||||||
|
@ -537,7 +537,7 @@ We can run this::
|
||||||
file $REGENDOC_TMPDIR/b/test_error.py, line 1
|
file $REGENDOC_TMPDIR/b/test_error.py, line 1
|
||||||
def test_root(db): # no db here, will error out
|
def test_root(db): # no db here, will error out
|
||||||
E fixture 'db' not found
|
E fixture 'db' not found
|
||||||
> available fixtures: cache, capfd, capfdbinary, caplog, capsys, capsysbinary, doctest_namespace, monkeypatch, pytestconfig, record_xml_property, recwarn, tmpdir, tmpdir_factory
|
> available fixtures: cache, capfd, capfdbinary, caplog, capsys, capsysbinary, doctest_namespace, monkeypatch, pytestconfig, record_xml_attribute, record_xml_property, recwarn, tmpdir, tmpdir_factory
|
||||||
> use 'pytest --fixtures [testpath]' for help on them.
|
> use 'pytest --fixtures [testpath]' for help on them.
|
||||||
|
|
||||||
$REGENDOC_TMPDIR/b/test_error.py:1
|
$REGENDOC_TMPDIR/b/test_error.py:1
|
||||||
|
@ -731,7 +731,7 @@ and run it::
|
||||||
|
|
||||||
test_module.py Esetting up a test failed! test_module.py::test_setup_fails
|
test_module.py Esetting up a test failed! test_module.py::test_setup_fails
|
||||||
Fexecuting test failed test_module.py::test_call_fails
|
Fexecuting test failed test_module.py::test_call_fails
|
||||||
F [100%]
|
F
|
||||||
|
|
||||||
================================== ERRORS ==================================
|
================================== ERRORS ==================================
|
||||||
____________________ ERROR at setup of test_setup_fails ____________________
|
____________________ ERROR at setup of test_setup_fails ____________________
|
||||||
|
|
|
@ -68,5 +68,5 @@ If you run this without output capturing::
|
||||||
.test_method1 called
|
.test_method1 called
|
||||||
.test other
|
.test other
|
||||||
.test_unit1 method called
|
.test_unit1 method called
|
||||||
. [100%]
|
.
|
||||||
4 passed in 0.12 seconds
|
4 passed in 0.12 seconds
|
||||||
|
|
|
@ -286,7 +286,7 @@ tests.
|
||||||
Let's execute it::
|
Let's execute it::
|
||||||
|
|
||||||
$ pytest -s -q --tb=no
|
$ pytest -s -q --tb=no
|
||||||
FF [100%]teardown smtp
|
FFteardown smtp
|
||||||
|
|
||||||
2 failed in 0.12 seconds
|
2 failed in 0.12 seconds
|
||||||
|
|
||||||
|
@ -391,7 +391,7 @@ We use the ``request.module`` attribute to optionally obtain an
|
||||||
again, nothing much has changed::
|
again, nothing much has changed::
|
||||||
|
|
||||||
$ pytest -s -q --tb=no
|
$ pytest -s -q --tb=no
|
||||||
FF [100%]finalizing <smtplib.SMTP object at 0xdeadbeef> (smtp.gmail.com)
|
FFfinalizing <smtplib.SMTP object at 0xdeadbeef> (smtp.gmail.com)
|
||||||
|
|
||||||
2 failed in 0.12 seconds
|
2 failed in 0.12 seconds
|
||||||
|
|
||||||
|
@ -612,7 +612,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-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .pytest_cache
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collecting ... collected 2 items
|
collecting ... collected 2 items
|
||||||
|
|
||||||
|
@ -681,40 +681,40 @@ 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-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .pytest_cache
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collecting ... collected 8 items
|
collecting ... collected 8 items
|
||||||
|
|
||||||
test_module.py::test_0[1] SETUP otherarg 1
|
test_module.py::test_0[1] SETUP otherarg 1
|
||||||
RUN test0 with otherarg 1
|
RUN test0 with otherarg 1
|
||||||
PASSED [ 12%] TEARDOWN otherarg 1
|
PASSED TEARDOWN otherarg 1
|
||||||
|
|
||||||
test_module.py::test_0[2] SETUP otherarg 2
|
test_module.py::test_0[2] SETUP otherarg 2
|
||||||
RUN test0 with otherarg 2
|
RUN test0 with otherarg 2
|
||||||
PASSED [ 25%] TEARDOWN otherarg 2
|
PASSED TEARDOWN otherarg 2
|
||||||
|
|
||||||
test_module.py::test_1[mod1] SETUP modarg mod1
|
test_module.py::test_1[mod1] SETUP modarg mod1
|
||||||
RUN test1 with modarg mod1
|
RUN test1 with modarg mod1
|
||||||
PASSED [ 37%]
|
PASSED
|
||||||
test_module.py::test_2[1-mod1] SETUP otherarg 1
|
test_module.py::test_2[1-mod1] SETUP otherarg 1
|
||||||
RUN test2 with otherarg 1 and modarg mod1
|
RUN test2 with otherarg 1 and modarg mod1
|
||||||
PASSED [ 50%] TEARDOWN otherarg 1
|
PASSED TEARDOWN otherarg 1
|
||||||
|
|
||||||
test_module.py::test_2[2-mod1] SETUP otherarg 2
|
test_module.py::test_2[2-mod1] SETUP otherarg 2
|
||||||
RUN test2 with otherarg 2 and modarg mod1
|
RUN test2 with otherarg 2 and modarg mod1
|
||||||
PASSED [ 62%] TEARDOWN otherarg 2
|
PASSED TEARDOWN otherarg 2
|
||||||
|
|
||||||
test_module.py::test_1[mod2] TEARDOWN modarg mod1
|
test_module.py::test_1[mod2] TEARDOWN modarg mod1
|
||||||
SETUP modarg mod2
|
SETUP modarg mod2
|
||||||
RUN test1 with modarg mod2
|
RUN test1 with modarg mod2
|
||||||
PASSED [ 75%]
|
PASSED
|
||||||
test_module.py::test_2[1-mod2] SETUP otherarg 1
|
test_module.py::test_2[1-mod2] SETUP otherarg 1
|
||||||
RUN test2 with otherarg 1 and modarg mod2
|
RUN test2 with otherarg 1 and modarg mod2
|
||||||
PASSED [ 87%] TEARDOWN otherarg 1
|
PASSED TEARDOWN otherarg 1
|
||||||
|
|
||||||
test_module.py::test_2[2-mod2] SETUP otherarg 2
|
test_module.py::test_2[2-mod2] SETUP otherarg 2
|
||||||
RUN test2 with otherarg 2 and modarg mod2
|
RUN test2 with otherarg 2 and modarg mod2
|
||||||
PASSED [100%] TEARDOWN otherarg 2
|
PASSED TEARDOWN otherarg 2
|
||||||
TEARDOWN modarg mod2
|
TEARDOWN modarg mod2
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -447,6 +447,7 @@ hook was invoked::
|
||||||
|
|
||||||
$ python myinvoke.py
|
$ python myinvoke.py
|
||||||
*** test run reporting finishing
|
*** test run reporting finishing
|
||||||
|
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue