Merge pull request #2163 from nicoddemus/merge-master-into-features
Merge master into features
This commit is contained in:
commit
964ccb93bb
|
@ -30,8 +30,12 @@ env:
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
allow_failures:
|
allow_failures:
|
||||||
# py35-trial failing on Linux: #1989
|
# see #1989
|
||||||
|
- env: TESTENV=py27-trial
|
||||||
- env: TESTENV=py35-trial
|
- env: TESTENV=py35-trial
|
||||||
|
include:
|
||||||
|
- env: TESTENV=py36
|
||||||
|
python: '3.6-dev'
|
||||||
|
|
||||||
script: tox --recreate -e $TESTENV
|
script: tox --recreate -e $TESTENV
|
||||||
|
|
||||||
|
|
1
AUTHORS
1
AUTHORS
|
@ -82,6 +82,7 @@ Katarzyna Jachim
|
||||||
Kevin Cox
|
Kevin Cox
|
||||||
Lee Kamentsky
|
Lee Kamentsky
|
||||||
Lev Maximov
|
Lev Maximov
|
||||||
|
Loic Esteve
|
||||||
Lukas Bednar
|
Lukas Bednar
|
||||||
Luke Murphy
|
Luke Murphy
|
||||||
Maciek Fijalkowski
|
Maciek Fijalkowski
|
||||||
|
|
341
CHANGELOG.rst
341
CHANGELOG.rst
|
@ -1,5 +1,5 @@
|
||||||
3.1.0.dev
|
3.1.0.dev (unreleased)
|
||||||
=========
|
======================
|
||||||
|
|
||||||
|
|
||||||
New Features
|
New Features
|
||||||
|
@ -32,7 +32,6 @@ Changes
|
||||||
* Change exception raised by ``capture.DontReadFromInput.fileno()`` from ``ValueError``
|
* Change exception raised by ``capture.DontReadFromInput.fileno()`` from ``ValueError``
|
||||||
to ``io.UnsupportedOperation``. Thanks `@vlad-dragos`_ for the PR.
|
to ``io.UnsupportedOperation``. Thanks `@vlad-dragos`_ for the PR.
|
||||||
|
|
||||||
|
|
||||||
* fix `#2013`_: turn RecordedWarning into namedtupe,
|
* fix `#2013`_: turn RecordedWarning into namedtupe,
|
||||||
to give it a comprehensible repr while preventing unwarranted modification
|
to give it a comprehensible repr while preventing unwarranted modification
|
||||||
|
|
||||||
|
@ -44,58 +43,109 @@ Changes
|
||||||
.. _#1512: https://github.com/pytest-dev/pytest/issues/1512
|
.. _#1512: https://github.com/pytest-dev/pytest/issues/1512
|
||||||
.. _#1874: https://github.com/pytest-dev/pytest/pull/1874
|
.. _#1874: https://github.com/pytest-dev/pytest/pull/1874
|
||||||
.. _#1952: https://github.com/pytest-dev/pytest/pull/1952
|
.. _#1952: https://github.com/pytest-dev/pytest/pull/1952
|
||||||
|
.. _#2007: https://github.com/pytest-dev/pytest/issues/2007
|
||||||
.. _#2013: https://github.com/pytest-dev/pytest/issues/2013
|
.. _#2013: https://github.com/pytest-dev/pytest/issues/2013
|
||||||
.. _#2101: https://github.com/pytest-dev/pytest/pull/2101
|
.. _#2101: https://github.com/pytest-dev/pytest/pull/2101
|
||||||
|
|
||||||
|
|
||||||
3.0.5.dev0
|
3.0.6.dev0 (unreleased)
|
||||||
==========
|
=======================
|
||||||
|
|
||||||
|
*
|
||||||
|
|
||||||
|
* pytest no longer recognizes coroutine functions as yield tests (`#2129`_).
|
||||||
|
Thanks to `@malinoff`_ for the PR.
|
||||||
|
|
||||||
|
* Improve error message when pytest.warns fails (`#2150`_). The type(s) of the
|
||||||
|
expected warnings and the list of caught warnings is added to the
|
||||||
|
error message. Thanks `@lesteve`_ for the PR.
|
||||||
|
|
||||||
|
* Specifying tests with colons like ``test_foo.py::test_bar`` for tests in
|
||||||
|
subdirectories with ini configuration files now uses the correct ini file
|
||||||
|
(`#2148`_). Thanks `@pelme`_.
|
||||||
|
|
||||||
|
*
|
||||||
|
|
||||||
|
.. _@lesteve: https://github.com/lesteve
|
||||||
|
.. _@malinoff: https://github.com/malinoff
|
||||||
|
.. _@pelme: https://github.com/pelme
|
||||||
|
|
||||||
|
.. _#2129: https://github.com/pytest-dev/pytest/issues/2129
|
||||||
|
.. _#2148: https://github.com/pytest-dev/pytest/issues/2148
|
||||||
|
.. _#2150: https://github.com/pytest-dev/pytest/issues/2150
|
||||||
|
|
||||||
|
|
||||||
|
3.0.5 (2016-12-05)
|
||||||
|
==================
|
||||||
|
|
||||||
|
* Add warning when not passing ``option=value`` correctly to ``-o/--override-ini`` (`#2105`_).
|
||||||
|
Also improved the help documentation. Thanks to `@mbukatov`_ for the report and
|
||||||
|
`@lwm`_ for the PR.
|
||||||
|
|
||||||
|
* Now ``--confcutdir`` and ``--junit-xml`` are properly validated if they are directories
|
||||||
|
and filenames, respectively (`#2089`_ and `#2078`_). Thanks to `@lwm`_ for the PR.
|
||||||
|
|
||||||
* Add hint to error message hinting possible missing ``__init__.py`` (`#478`_). Thanks `@DuncanBetts`_.
|
* Add hint to error message hinting possible missing ``__init__.py`` (`#478`_). Thanks `@DuncanBetts`_.
|
||||||
|
|
||||||
|
* More accurately describe when fixture finalization occurs in documentation (`#687`_). Thanks `@DuncanBetts`_.
|
||||||
|
|
||||||
* Provide ``:ref:`` targets for ``recwarn.rst`` so we can use intersphinx referencing.
|
* Provide ``:ref:`` targets for ``recwarn.rst`` so we can use intersphinx referencing.
|
||||||
Thanks to `@dupuy`_ for the report and `@lwm`_ for the PR.
|
Thanks to `@dupuy`_ for the report and `@lwm`_ for the PR.
|
||||||
|
|
||||||
|
* In Python 2, use a simple ``+-`` ASCII string in the string representation of ``pytest.approx`` (for example ``"4 +- 4.0e-06"``)
|
||||||
|
because it is brittle to handle that in different contexts and representations internally in pytest
|
||||||
|
which can result in bugs such as `#2111`_. In Python 3, the representation still uses ``±`` (for example ``4 ± 4.0e-06``).
|
||||||
|
Thanks `@kerrick-lyft`_ for the report and `@nicoddemus`_ for the PR.
|
||||||
|
|
||||||
* Using ``item.Function``, ``item.Module``, etc., is now issuing deprecation warnings, prefer
|
* Using ``item.Function``, ``item.Module``, etc., is now issuing deprecation warnings, prefer
|
||||||
``pytest.Function``, ``pytest.Module``, etc., instead (`#2034`_).
|
``pytest.Function``, ``pytest.Module``, etc., instead (`#2034`_).
|
||||||
Thanks `@nmundar`_ for the PR.
|
Thanks `@nmundar`_ for the PR.
|
||||||
|
|
||||||
* An error message is now displayed if ``--confcutdir`` is not a valid directory, avoiding
|
|
||||||
subtle bugs (`#2078`_).
|
|
||||||
Thanks `@nicoddemus`_ for the PR.
|
|
||||||
|
|
||||||
* Fix error message using ``approx`` with complex numbers (`#2082`_).
|
* Fix error message using ``approx`` with complex numbers (`#2082`_).
|
||||||
Thanks `@adler-j`_ for the report and `@nicoddemus`_ for the PR.
|
Thanks `@adler-j`_ for the report and `@nicoddemus`_ for the PR.
|
||||||
|
|
||||||
*
|
* Fixed false-positives warnings from assertion rewrite hook for modules imported more than
|
||||||
|
once by the ``pytest_plugins`` mechanism.
|
||||||
|
Thanks `@nicoddemus`_ for the PR.
|
||||||
|
|
||||||
|
* Remove an internal cache which could cause hooks from ``conftest.py`` files in
|
||||||
|
sub-directories to be called in other directories incorrectly (`#2016`_).
|
||||||
|
Thanks `@d-b-w`_ for the report and `@nicoddemus`_ for the PR.
|
||||||
|
|
||||||
|
* Remove internal code meant to support earlier Python 3 versions that produced the side effect
|
||||||
|
of leaving ``None`` in ``sys.modules`` when expressions were evaluated by pytest (for example passing a condition
|
||||||
|
as a string to ``pytest.mark.skipif``)(`#2103`_).
|
||||||
|
Thanks `@jaraco`_ for the report and `@nicoddemus`_ for the PR.
|
||||||
|
|
||||||
* Cope gracefully with a .pyc file with no matching .py file (`#2038`_). Thanks
|
* Cope gracefully with a .pyc file with no matching .py file (`#2038`_). Thanks
|
||||||
`@nedbat`_.
|
`@nedbat`_.
|
||||||
|
|
||||||
*
|
|
||||||
|
|
||||||
*
|
|
||||||
|
|
||||||
.. _@syre: https://github.com/syre
|
.. _@syre: https://github.com/syre
|
||||||
.. _@dupuy: https://bitbucket.org/dupuy/
|
|
||||||
.. _@lwm: https://github.com/lwm
|
|
||||||
.. _@adler-j: https://github.com/adler-j
|
.. _@adler-j: https://github.com/adler-j
|
||||||
|
.. _@d-b-w: https://bitbucket.org/d-b-w/
|
||||||
.. _@DuncanBetts: https://github.com/DuncanBetts
|
.. _@DuncanBetts: https://github.com/DuncanBetts
|
||||||
|
.. _@dupuy: https://bitbucket.org/dupuy/
|
||||||
|
.. _@kerrick-lyft: https://github.com/kerrick-lyft
|
||||||
|
.. _@lwm: https://github.com/lwm
|
||||||
|
.. _@mbukatov: https://github.com/mbukatov
|
||||||
.. _@nedbat: https://github.com/nedbat
|
.. _@nedbat: https://github.com/nedbat
|
||||||
.. _@nmundar: https://github.com/nmundar
|
.. _@nmundar: https://github.com/nmundar
|
||||||
|
|
||||||
.. _#478: https://github.com/pytest-dev/pytest/issues/478
|
.. _#2016: https://github.com/pytest-dev/pytest/issues/2016
|
||||||
.. _#2034: https://github.com/pytest-dev/pytest/issues/2034
|
.. _#2034: https://github.com/pytest-dev/pytest/issues/2034
|
||||||
.. _#2038: https://github.com/pytest-dev/pytest/issues/2038
|
.. _#2038: https://github.com/pytest-dev/pytest/issues/2038
|
||||||
.. _#2078: https://github.com/pytest-dev/pytest/issues/2078
|
.. _#2078: https://github.com/pytest-dev/pytest/issues/2078
|
||||||
.. _#2082: https://github.com/pytest-dev/pytest/issues/2082
|
.. _#2082: https://github.com/pytest-dev/pytest/issues/2082
|
||||||
.. _#2007: https://github.com/pytest-dev/pytest/issues/2007
|
.. _#2089: https://github.com/pytest-dev/pytest/issues/2089
|
||||||
|
.. _#2103: https://github.com/pytest-dev/pytest/issues/2103
|
||||||
|
.. _#2105: https://github.com/pytest-dev/pytest/issues/2105
|
||||||
|
.. _#2111: https://github.com/pytest-dev/pytest/issues/2111
|
||||||
|
.. _#478: https://github.com/pytest-dev/pytest/issues/478
|
||||||
|
.. _#687: https://github.com/pytest-dev/pytest/issues/687
|
||||||
|
|
||||||
|
|
||||||
3.0.4
|
3.0.4 (2016-11-09)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
* Import errors when collecting test modules now display the full traceback (`#1976`_).
|
* Import errors when collecting test modules now display the full traceback (`#1976`_).
|
||||||
Thanks `@cwitty`_ for the report and `@nicoddemus`_ for the PR.
|
Thanks `@cwitty`_ for the report and `@nicoddemus`_ for the PR.
|
||||||
|
@ -148,8 +198,8 @@ Changes
|
||||||
.. _#1649: https://github.com/pytest-dev/pytest/issues/1649
|
.. _#1649: https://github.com/pytest-dev/pytest/issues/1649
|
||||||
|
|
||||||
|
|
||||||
3.0.3
|
3.0.3 (2016-09-28)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
* The ``ids`` argument to ``parametrize`` again accepts ``unicode`` strings
|
* The ``ids`` argument to ``parametrize`` again accepts ``unicode`` strings
|
||||||
in Python 2 (`#1905`_).
|
in Python 2 (`#1905`_).
|
||||||
|
@ -188,8 +238,8 @@ Changes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3.0.2
|
3.0.2 (2016-09-01)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
* Improve error message when passing non-string ids to ``pytest.mark.parametrize`` (`#1857`_).
|
* Improve error message when passing non-string ids to ``pytest.mark.parametrize`` (`#1857`_).
|
||||||
Thanks `@okken`_ for the report and `@nicoddemus`_ for the PR.
|
Thanks `@okken`_ for the report and `@nicoddemus`_ for the PR.
|
||||||
|
@ -228,19 +278,8 @@ Changes
|
||||||
.. _#1898: https://github.com/pytest-dev/pytest/issues/1898
|
.. _#1898: https://github.com/pytest-dev/pytest/issues/1898
|
||||||
|
|
||||||
|
|
||||||
3.0.2.dev
|
3.0.1 (2016-08-23)
|
||||||
=========
|
==================
|
||||||
|
|
||||||
*
|
|
||||||
|
|
||||||
*
|
|
||||||
|
|
||||||
*
|
|
||||||
|
|
||||||
*
|
|
||||||
|
|
||||||
3.0.1
|
|
||||||
=====
|
|
||||||
|
|
||||||
* Fix regression when ``importorskip`` is used at module level (`#1822`_).
|
* Fix regression when ``importorskip`` is used at module level (`#1822`_).
|
||||||
Thanks `@jaraco`_ and `@The-Compiler`_ for the report and `@nicoddemus`_ for the PR.
|
Thanks `@jaraco`_ and `@The-Compiler`_ for the report and `@nicoddemus`_ for the PR.
|
||||||
|
@ -265,8 +304,8 @@ Changes
|
||||||
.. _#1849: https://github.com/pytest-dev/pytest/issues/1849
|
.. _#1849: https://github.com/pytest-dev/pytest/issues/1849
|
||||||
|
|
||||||
|
|
||||||
3.0.0
|
3.0.0 (2016-08-18)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
**Incompatible changes**
|
**Incompatible changes**
|
||||||
|
|
||||||
|
@ -691,8 +730,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
.. _@matthiasha: https://github.com/matthiasha
|
.. _@matthiasha: https://github.com/matthiasha
|
||||||
|
|
||||||
|
|
||||||
2.9.2
|
2.9.2 (2016-05-31)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
**Bug Fixes**
|
**Bug Fixes**
|
||||||
|
|
||||||
|
@ -730,8 +769,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
.. _@astraw38: https://github.com/astraw38
|
.. _@astraw38: https://github.com/astraw38
|
||||||
|
|
||||||
|
|
||||||
2.9.1
|
2.9.1 (2016-03-17)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
**Bug Fixes**
|
**Bug Fixes**
|
||||||
|
|
||||||
|
@ -766,8 +805,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
.. _@asottile: https://github.com/asottile
|
.. _@asottile: https://github.com/asottile
|
||||||
|
|
||||||
|
|
||||||
2.9.0
|
2.9.0 (2016-02-29)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
**New Features**
|
**New Features**
|
||||||
|
|
||||||
|
@ -887,13 +926,13 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
.. _@pquentin: https://github.com/pquentin
|
.. _@pquentin: https://github.com/pquentin
|
||||||
.. _@ioggstream: https://github.com/ioggstream
|
.. _@ioggstream: https://github.com/ioggstream
|
||||||
|
|
||||||
2.8.7
|
2.8.7 (2016-01-24)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix #1338: use predictable object resolution for monkeypatch
|
- fix #1338: use predictable object resolution for monkeypatch
|
||||||
|
|
||||||
2.8.6
|
2.8.6 (2016-01-21)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix #1259: allow for double nodeids in junitxml,
|
- fix #1259: allow for double nodeids in junitxml,
|
||||||
this was a regression failing plugins combinations
|
this was a regression failing plugins combinations
|
||||||
|
@ -924,8 +963,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
Thanks Georgy Dyuldin for the PR.
|
Thanks Georgy Dyuldin for the PR.
|
||||||
|
|
||||||
|
|
||||||
2.8.5
|
2.8.5 (2015-12-11)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix #1243: fixed issue where class attributes injected during collection could break pytest.
|
- fix #1243: fixed issue where class attributes injected during collection could break pytest.
|
||||||
PR by Alexei Kozlenok, thanks Ronny Pfannschmidt and Bruno Oliveira for the review and help.
|
PR by Alexei Kozlenok, thanks Ronny Pfannschmidt and Bruno Oliveira for the review and help.
|
||||||
|
@ -938,8 +977,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
Bruno Oliveira for the PR.
|
Bruno Oliveira for the PR.
|
||||||
|
|
||||||
|
|
||||||
2.8.4
|
2.8.4 (2015-12-06)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix #1190: ``deprecated_call()`` now works when the deprecated
|
- fix #1190: ``deprecated_call()`` now works when the deprecated
|
||||||
function has been already called by another test in the same
|
function has been already called by another test in the same
|
||||||
|
@ -962,8 +1001,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
- a number of documentation modernizations wrt good practices.
|
- a number of documentation modernizations wrt good practices.
|
||||||
Thanks Bruno Oliveira for the PR.
|
Thanks Bruno Oliveira for the PR.
|
||||||
|
|
||||||
2.8.3
|
2.8.3 (2015-11-18)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix #1169: add __name__ attribute to testcases in TestCaseFunction to
|
- fix #1169: add __name__ attribute to testcases in TestCaseFunction to
|
||||||
support the @unittest.skip decorator on functions and methods.
|
support the @unittest.skip decorator on functions and methods.
|
||||||
|
@ -990,8 +1029,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
system integrity protection (thanks Florian)
|
system integrity protection (thanks Florian)
|
||||||
|
|
||||||
|
|
||||||
2.8.2
|
2.8.2 (2015-10-07)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix #1085: proper handling of encoding errors when passing encoded byte
|
- fix #1085: proper handling of encoding errors when passing encoded byte
|
||||||
strings to pytest.parametrize in Python 2.
|
strings to pytest.parametrize in Python 2.
|
||||||
|
@ -1010,8 +1049,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
Thanks Sergey B Kirpichev and Vital Kudzelka for contributing and Bruno
|
Thanks Sergey B Kirpichev and Vital Kudzelka for contributing and Bruno
|
||||||
Oliveira for the PR.
|
Oliveira for the PR.
|
||||||
|
|
||||||
2.8.1
|
2.8.1 (2015-09-29)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix #1034: Add missing nodeid on pytest_logwarning call in
|
- fix #1034: Add missing nodeid on pytest_logwarning call in
|
||||||
addhook. Thanks Simon Gomizelj for the PR.
|
addhook. Thanks Simon Gomizelj for the PR.
|
||||||
|
@ -1057,8 +1096,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
|
|
||||||
- fix issue 1029: transform errors when writing cache values into pytest-warnings
|
- fix issue 1029: transform errors when writing cache values into pytest-warnings
|
||||||
|
|
||||||
2.8.0
|
2.8.0 (2015-09-18)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- new ``--lf`` and ``-ff`` options to run only the last failing tests or
|
- new ``--lf`` and ``-ff`` options to run only the last failing tests or
|
||||||
"failing tests first" from the last run. This functionality is provided
|
"failing tests first" from the last run. This functionality is provided
|
||||||
|
@ -1247,8 +1286,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
properly used to discover ``rootdir`` and ``ini`` files.
|
properly used to discover ``rootdir`` and ``ini`` files.
|
||||||
Thanks Peter Lauri for the report and Bruno Oliveira for the PR.
|
Thanks Peter Lauri for the report and Bruno Oliveira for the PR.
|
||||||
|
|
||||||
2.7.3 (compared to 2.7.2)
|
2.7.3 (2015-09-15)
|
||||||
=============================
|
==================
|
||||||
|
|
||||||
- Allow 'dev', 'rc', or other non-integer version strings in ``importorskip``.
|
- Allow 'dev', 'rc', or other non-integer version strings in ``importorskip``.
|
||||||
Thanks to Eric Hunsberger for the PR.
|
Thanks to Eric Hunsberger for the PR.
|
||||||
|
@ -1290,8 +1329,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
directories created by this fixture (defaults to $TEMP/pytest-$USER).
|
directories created by this fixture (defaults to $TEMP/pytest-$USER).
|
||||||
Thanks Bruno Oliveira for the PR.
|
Thanks Bruno Oliveira for the PR.
|
||||||
|
|
||||||
2.7.2 (compared to 2.7.1)
|
2.7.2 (2015-06-23)
|
||||||
=============================
|
==================
|
||||||
|
|
||||||
- fix issue767: pytest.raises value attribute does not contain the exception
|
- fix issue767: pytest.raises value attribute does not contain the exception
|
||||||
instance on Python 2.6. Thanks Eric Siegerman for providing the test
|
instance on Python 2.6. Thanks Eric Siegerman for providing the test
|
||||||
|
@ -1319,8 +1358,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
which has a refined algorithm for traceback generation.
|
which has a refined algorithm for traceback generation.
|
||||||
|
|
||||||
|
|
||||||
2.7.1 (compared to 2.7.0)
|
2.7.1 (2015-05-19)
|
||||||
=============================
|
==================
|
||||||
|
|
||||||
- fix issue731: do not get confused by the braces which may be present
|
- fix issue731: do not get confused by the braces which may be present
|
||||||
and unbalanced in an object's repr while collapsing False
|
and unbalanced in an object's repr while collapsing False
|
||||||
|
@ -1352,8 +1391,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
- reintroduced _pytest fixture of the pytester plugin which is used
|
- reintroduced _pytest fixture of the pytester plugin which is used
|
||||||
at least by pytest-xdist.
|
at least by pytest-xdist.
|
||||||
|
|
||||||
2.7.0 (compared to 2.6.4)
|
2.7.0 (2015-03-26)
|
||||||
=============================
|
==================
|
||||||
|
|
||||||
- fix issue435: make reload() work when assert rewriting is active.
|
- fix issue435: make reload() work when assert rewriting is active.
|
||||||
Thanks Daniel Hahler.
|
Thanks Daniel Hahler.
|
||||||
|
@ -1422,8 +1461,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
``sys.last_traceback`` are set, so that a user can inspect the error
|
``sys.last_traceback`` are set, so that a user can inspect the error
|
||||||
via postmortem debugging (almarklein).
|
via postmortem debugging (almarklein).
|
||||||
|
|
||||||
2.6.4
|
2.6.4 (2014-10-24)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- Improve assertion failure reporting on iterables, by using ndiff and
|
- Improve assertion failure reporting on iterables, by using ndiff and
|
||||||
pprint.
|
pprint.
|
||||||
|
@ -1451,8 +1490,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
|
|
||||||
- fix issue614: fixed pastebin support.
|
- fix issue614: fixed pastebin support.
|
||||||
|
|
||||||
2.6.3
|
2.6.3 (2014-09-24)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix issue575: xunit-xml was reporting collection errors as failures
|
- fix issue575: xunit-xml was reporting collection errors as failures
|
||||||
instead of errors, thanks Oleg Sinyavskiy.
|
instead of errors, thanks Oleg Sinyavskiy.
|
||||||
|
@ -1478,8 +1517,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
- check xfail/skip also with non-python function test items. Thanks
|
- check xfail/skip also with non-python function test items. Thanks
|
||||||
Floris Bruynooghe.
|
Floris Bruynooghe.
|
||||||
|
|
||||||
2.6.2
|
2.6.2 (2014-09-05)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- Added function pytest.freeze_includes(), which makes it easy to embed
|
- Added function pytest.freeze_includes(), which makes it easy to embed
|
||||||
pytest into executables using tools like cx_freeze.
|
pytest into executables using tools like cx_freeze.
|
||||||
|
@ -1507,8 +1546,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
replace the py.test introspection message but are shown in addition
|
replace the py.test introspection message but are shown in addition
|
||||||
to them.
|
to them.
|
||||||
|
|
||||||
2.6.1
|
2.6.1 (2014-08-07)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- No longer show line numbers in the --verbose output, the output is now
|
- No longer show line numbers in the --verbose output, the output is now
|
||||||
purely the nodeid. The line number is still shown in failure reports.
|
purely the nodeid. The line number is still shown in failure reports.
|
||||||
|
@ -1644,8 +1683,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
in monkeypatch plugin. Improves output in documentation.
|
in monkeypatch plugin. Improves output in documentation.
|
||||||
|
|
||||||
|
|
||||||
2.5.2
|
2.5.2 (2014-01-29)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix issue409 -- better interoperate with cx_freeze by not
|
- fix issue409 -- better interoperate with cx_freeze by not
|
||||||
trying to import from collections.abc which causes problems
|
trying to import from collections.abc which causes problems
|
||||||
|
@ -1672,8 +1711,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
- make capfd/capsys.capture private, its unused and shouldnt be exposed
|
- make capfd/capsys.capture private, its unused and shouldnt be exposed
|
||||||
|
|
||||||
|
|
||||||
2.5.1
|
2.5.1 (2013-12-17)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- merge new documentation styling PR from Tobias Bieniek.
|
- merge new documentation styling PR from Tobias Bieniek.
|
||||||
|
|
||||||
|
@ -1693,8 +1732,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
2.5.0
|
2.5.0 (2013-12-12)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- dropped python2.5 from automated release testing of pytest itself
|
- dropped python2.5 from automated release testing of pytest itself
|
||||||
which means it's probably going to break soon (but still works
|
which means it's probably going to break soon (but still works
|
||||||
|
@ -1829,8 +1868,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
|
|
||||||
- fix verbose reporting for @mock'd test functions
|
- fix verbose reporting for @mock'd test functions
|
||||||
|
|
||||||
2.4.2
|
2.4.2 (2013-10-04)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- on Windows require colorama and a newer py lib so that py.io.TerminalWriter()
|
- on Windows require colorama and a newer py lib so that py.io.TerminalWriter()
|
||||||
now uses colorama instead of its own ctypes hacks. (fixes issue365)
|
now uses colorama instead of its own ctypes hacks. (fixes issue365)
|
||||||
|
@ -1860,8 +1899,8 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||||
- add pluginmanager.do_configure(config) as a link to
|
- add pluginmanager.do_configure(config) as a link to
|
||||||
config.do_configure() for plugin-compatibility
|
config.do_configure() for plugin-compatibility
|
||||||
|
|
||||||
2.4.1
|
2.4.1 (2013-10-02)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- When using parser.addoption() unicode arguments to the
|
- When using parser.addoption() unicode arguments to the
|
||||||
"type" keyword should also be converted to the respective types.
|
"type" keyword should also be converted to the respective types.
|
||||||
|
@ -2045,8 +2084,8 @@ Bug fixes:
|
||||||
".section(title)" and ".line(msg)" methods to print extra
|
".section(title)" and ".line(msg)" methods to print extra
|
||||||
information at the end of a test run.
|
information at the end of a test run.
|
||||||
|
|
||||||
2.3.5
|
2.3.5 (2013-04-30)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix issue169: respect --tb=style with setup/teardown errors as well.
|
- fix issue169: respect --tb=style with setup/teardown errors as well.
|
||||||
|
|
||||||
|
@ -2110,8 +2149,8 @@ Bug fixes:
|
||||||
|
|
||||||
- fix issue266 - accept unicode in MarkEvaluator expressions
|
- fix issue266 - accept unicode in MarkEvaluator expressions
|
||||||
|
|
||||||
2.3.4
|
2.3.4 (2012-11-20)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- yielded test functions will now have autouse-fixtures active but
|
- yielded test functions will now have autouse-fixtures active but
|
||||||
cannot accept fixtures as funcargs - it's anyway recommended to
|
cannot accept fixtures as funcargs - it's anyway recommended to
|
||||||
|
@ -2130,8 +2169,8 @@ Bug fixes:
|
||||||
need to write as -k "TestClass and test_method" to match a certain
|
need to write as -k "TestClass and test_method" to match a certain
|
||||||
method in a certain test class.
|
method in a certain test class.
|
||||||
|
|
||||||
2.3.3
|
2.3.3 (2012-11-06)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix issue214 - parse modules that contain special objects like e. g.
|
- fix issue214 - parse modules that contain special objects like e. g.
|
||||||
flask's request object which blows up on getattr access if no request
|
flask's request object which blows up on getattr access if no request
|
||||||
|
@ -2162,8 +2201,8 @@ Bug fixes:
|
||||||
- fix issue127 - improve documentation for pytest_addoption() and
|
- fix issue127 - improve documentation for pytest_addoption() and
|
||||||
add a ``config.getoption(name)`` helper function for consistency.
|
add a ``config.getoption(name)`` helper function for consistency.
|
||||||
|
|
||||||
2.3.2
|
2.3.2 (2012-10-25)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix issue208 and fix issue29 use new py version to avoid long pauses
|
- fix issue208 and fix issue29 use new py version to avoid long pauses
|
||||||
when printing tracebacks in long modules
|
when printing tracebacks in long modules
|
||||||
|
@ -2195,8 +2234,8 @@ Bug fixes:
|
||||||
- add tox.ini to pytest distribution so that ignore-dirs and others config
|
- add tox.ini to pytest distribution so that ignore-dirs and others config
|
||||||
bits are properly distributed for maintainers who run pytest-own tests
|
bits are properly distributed for maintainers who run pytest-own tests
|
||||||
|
|
||||||
2.3.1
|
2.3.1 (2012-10-20)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix issue202 - fix regression: using "self" from fixture functions now
|
- fix issue202 - fix regression: using "self" from fixture functions now
|
||||||
works as expected (it's the same "self" instance that a test method
|
works as expected (it's the same "self" instance that a test method
|
||||||
|
@ -2208,8 +2247,8 @@ Bug fixes:
|
||||||
- link to web pages from --markers output which provides help for
|
- link to web pages from --markers output which provides help for
|
||||||
pytest.mark.* usage.
|
pytest.mark.* usage.
|
||||||
|
|
||||||
2.3.0
|
2.3.0 (2012-10-19)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix issue202 - better automatic names for parametrized test functions
|
- fix issue202 - better automatic names for parametrized test functions
|
||||||
- fix issue139 - introduce @pytest.fixture which allows direct scoping
|
- fix issue139 - introduce @pytest.fixture which allows direct scoping
|
||||||
|
@ -2287,8 +2326,8 @@ Bug fixes:
|
||||||
|
|
||||||
- py.test -vv will show all of assert comparisations instead of truncating
|
- py.test -vv will show all of assert comparisations instead of truncating
|
||||||
|
|
||||||
2.2.4
|
2.2.4 (2012-05-22)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix error message for rewritten assertions involving the % operator
|
- fix error message for rewritten assertions involving the % operator
|
||||||
- fix issue 126: correctly match all invalid xml characters for junitxml
|
- fix issue 126: correctly match all invalid xml characters for junitxml
|
||||||
|
@ -2304,13 +2343,13 @@ Bug fixes:
|
||||||
- fix issue #144: better mangle test ids to junitxml classnames
|
- fix issue #144: better mangle test ids to junitxml classnames
|
||||||
- upgrade distribute_setup.py to 0.6.27
|
- upgrade distribute_setup.py to 0.6.27
|
||||||
|
|
||||||
2.2.3
|
2.2.3 (2012-02-05)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix uploaded package to only include neccesary files
|
- fix uploaded package to only include neccesary files
|
||||||
|
|
||||||
2.2.2
|
2.2.2 (2012-02-05)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix issue101: wrong args to unittest.TestCase test function now
|
- fix issue101: wrong args to unittest.TestCase test function now
|
||||||
produce better output
|
produce better output
|
||||||
|
@ -2329,8 +2368,8 @@ Bug fixes:
|
||||||
- allow adding of attributes to test reports such that it also works
|
- allow adding of attributes to test reports such that it also works
|
||||||
with distributed testing (no upgrade of pytest-xdist needed)
|
with distributed testing (no upgrade of pytest-xdist needed)
|
||||||
|
|
||||||
2.2.1
|
2.2.1 (2011-12-16)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix issue99 (in pytest and py) internallerrors with resultlog now
|
- fix issue99 (in pytest and py) internallerrors with resultlog now
|
||||||
produce better output - fixed by normalizing pytest_internalerror
|
produce better output - fixed by normalizing pytest_internalerror
|
||||||
|
@ -2346,8 +2385,8 @@ Bug fixes:
|
||||||
- fix collection crash due to unknown-source collected items, thanks
|
- fix collection crash due to unknown-source collected items, thanks
|
||||||
to Ralf Schmitt (fixed by depending on a more recent pylib)
|
to Ralf Schmitt (fixed by depending on a more recent pylib)
|
||||||
|
|
||||||
2.2.0
|
2.2.0 (2011-11-18)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix issue90: introduce eager tearing down of test items so that
|
- fix issue90: introduce eager tearing down of test items so that
|
||||||
teardown function are called earlier.
|
teardown function are called earlier.
|
||||||
|
@ -2381,8 +2420,8 @@ Bug fixes:
|
||||||
- simplify junitxml output code by relying on py.xml
|
- simplify junitxml output code by relying on py.xml
|
||||||
- add support for skip properties on unittest classes and functions
|
- add support for skip properties on unittest classes and functions
|
||||||
|
|
||||||
2.1.3
|
2.1.3 (2011-10-18)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix issue79: assertion rewriting failed on some comparisons in boolops
|
- fix issue79: assertion rewriting failed on some comparisons in boolops
|
||||||
- correctly handle zero length arguments (a la pytest '')
|
- correctly handle zero length arguments (a la pytest '')
|
||||||
|
@ -2390,8 +2429,8 @@ Bug fixes:
|
||||||
- fix issue75 / skipping test failure on jython
|
- fix issue75 / skipping test failure on jython
|
||||||
- fix issue77 / Allow assertrepr_compare hook to apply to a subset of tests
|
- fix issue77 / Allow assertrepr_compare hook to apply to a subset of tests
|
||||||
|
|
||||||
2.1.2
|
2.1.2 (2011-09-24)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix assertion rewriting on files with windows newlines on some Python versions
|
- fix assertion rewriting on files with windows newlines on some Python versions
|
||||||
- refine test discovery by package/module name (--pyargs), thanks Florian Mayer
|
- refine test discovery by package/module name (--pyargs), thanks Florian Mayer
|
||||||
|
@ -2413,8 +2452,8 @@ Bug fixes:
|
||||||
- fix issue61: assertion rewriting on boolean operations with 3 or more operands
|
- fix issue61: assertion rewriting on boolean operations with 3 or more operands
|
||||||
- you can now build a man page with "cd doc ; make man"
|
- you can now build a man page with "cd doc ; make man"
|
||||||
|
|
||||||
2.1.0
|
2.1.0 (2011-07-09)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix issue53 call nosestyle setup functions with correct ordering
|
- fix issue53 call nosestyle setup functions with correct ordering
|
||||||
- fix issue58 and issue59: new assertion code fixes
|
- fix issue58 and issue59: new assertion code fixes
|
||||||
|
@ -2433,8 +2472,8 @@ Bug fixes:
|
||||||
- report KeyboardInterrupt even if interrupted during session startup
|
- report KeyboardInterrupt even if interrupted during session startup
|
||||||
- fix issue 35 - provide PDF doc version and download link from index page
|
- fix issue 35 - provide PDF doc version and download link from index page
|
||||||
|
|
||||||
2.0.3
|
2.0.3 (2011-05-11)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix issue38: nicer tracebacks on calls to hooks, particularly early
|
- fix issue38: nicer tracebacks on calls to hooks, particularly early
|
||||||
configure/sessionstart ones
|
configure/sessionstart ones
|
||||||
|
@ -2453,8 +2492,8 @@ Bug fixes:
|
||||||
|
|
||||||
- fix issue37: avoid invalid characters in junitxml's output
|
- fix issue37: avoid invalid characters in junitxml's output
|
||||||
|
|
||||||
2.0.2
|
2.0.2 (2011-03-09)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- tackle issue32 - speed up test runs of very quick test functions
|
- tackle issue32 - speed up test runs of very quick test functions
|
||||||
by reducing the relative overhead
|
by reducing the relative overhead
|
||||||
|
@ -2505,8 +2544,8 @@ Bug fixes:
|
||||||
|
|
||||||
- avoid std unittest assertion helper code in tracebacks (thanks Ronny)
|
- avoid std unittest assertion helper code in tracebacks (thanks Ronny)
|
||||||
|
|
||||||
2.0.1
|
2.0.1 (2011-02-07)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- refine and unify initial capturing so that it works nicely
|
- refine and unify initial capturing so that it works nicely
|
||||||
even if the logging module is used on an early-loaded conftest.py
|
even if the logging module is used on an early-loaded conftest.py
|
||||||
|
@ -2554,8 +2593,8 @@ Bug fixes:
|
||||||
parametraization remains the "pytest_generate_tests"
|
parametraization remains the "pytest_generate_tests"
|
||||||
mechanism, see the docs.
|
mechanism, see the docs.
|
||||||
|
|
||||||
2.0.0
|
2.0.0 (2010-11-25)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- pytest-2.0 is now its own package and depends on pylib-2.0
|
- pytest-2.0 is now its own package and depends on pylib-2.0
|
||||||
- new ability: python -m pytest / python -m pytest.main ability
|
- new ability: python -m pytest / python -m pytest.main ability
|
||||||
|
@ -2599,8 +2638,8 @@ Bug fixes:
|
||||||
- add ability to use "class" level for cached_setup helper
|
- add ability to use "class" level for cached_setup helper
|
||||||
- fix strangeness: mark.* objects are now immutable, create new instances
|
- fix strangeness: mark.* objects are now immutable, create new instances
|
||||||
|
|
||||||
1.3.4
|
1.3.4 (2010-09-14)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix issue111: improve install documentation for windows
|
- fix issue111: improve install documentation for windows
|
||||||
- fix issue119: fix custom collectability of __init__.py as a module
|
- fix issue119: fix custom collectability of __init__.py as a module
|
||||||
|
@ -2608,8 +2647,8 @@ Bug fixes:
|
||||||
- fix issue115: unify internal exception passthrough/catching/GeneratorExit
|
- fix issue115: unify internal exception passthrough/catching/GeneratorExit
|
||||||
- fix issue118: new --tb=native for presenting cpython-standard exceptions
|
- fix issue118: new --tb=native for presenting cpython-standard exceptions
|
||||||
|
|
||||||
1.3.3
|
1.3.3 (2010-07-30)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- fix issue113: assertion representation problem with triple-quoted strings
|
- fix issue113: assertion representation problem with triple-quoted strings
|
||||||
(and possibly other cases)
|
(and possibly other cases)
|
||||||
|
@ -2623,8 +2662,8 @@ Bug fixes:
|
||||||
(thanks Armin Ronacher for reporting)
|
(thanks Armin Ronacher for reporting)
|
||||||
- remove trailing whitespace in all py/text distribution files
|
- remove trailing whitespace in all py/text distribution files
|
||||||
|
|
||||||
1.3.2
|
1.3.2 (2010-07-08)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
**New features**
|
**New features**
|
||||||
|
|
||||||
|
@ -2696,8 +2735,8 @@ Bug fixes:
|
||||||
- fix homedir detection on Windows
|
- fix homedir detection on Windows
|
||||||
- ship distribute_setup.py version 0.6.13
|
- ship distribute_setup.py version 0.6.13
|
||||||
|
|
||||||
1.3.1
|
1.3.1 (2010-05-25)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
**New features**
|
**New features**
|
||||||
|
|
||||||
|
@ -2766,8 +2805,8 @@ Bug fixes:
|
||||||
(and internally be more careful when presenting unexpected byte sequences)
|
(and internally be more careful when presenting unexpected byte sequences)
|
||||||
|
|
||||||
|
|
||||||
1.3.0
|
1.3.0 (2010-05-05)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- deprecate --report option in favour of a new shorter and easier to
|
- deprecate --report option in favour of a new shorter and easier to
|
||||||
remember -r option: it takes a string argument consisting of any
|
remember -r option: it takes a string argument consisting of any
|
||||||
|
@ -2831,8 +2870,8 @@ Bug fixes:
|
||||||
- added links to the new capturelog and coverage plugins
|
- added links to the new capturelog and coverage plugins
|
||||||
|
|
||||||
|
|
||||||
1.2.0
|
1.2.0 (2010-01-18)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- refined usage and options for "py.cleanup"::
|
- refined usage and options for "py.cleanup"::
|
||||||
|
|
||||||
|
@ -2870,8 +2909,8 @@ Bug fixes:
|
||||||
|
|
||||||
- fix plugin links
|
- fix plugin links
|
||||||
|
|
||||||
1.1.1
|
1.1.1 (2009-11-24)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- moved dist/looponfailing from py.test core into a new
|
- moved dist/looponfailing from py.test core into a new
|
||||||
separately released pytest-xdist plugin.
|
separately released pytest-xdist plugin.
|
||||||
|
@ -2954,8 +2993,8 @@ Bug fixes:
|
||||||
- fix docs, fix internal bin/ script generation
|
- fix docs, fix internal bin/ script generation
|
||||||
|
|
||||||
|
|
||||||
1.1.0
|
1.1.0 (2009-11-05)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
- introduce automatic plugin registration via 'pytest11'
|
- introduce automatic plugin registration via 'pytest11'
|
||||||
entrypoints via setuptools' pkg_resources.iter_entry_points
|
entrypoints via setuptools' pkg_resources.iter_entry_points
|
||||||
|
@ -3058,16 +3097,16 @@ Bug fixes:
|
||||||
|
|
||||||
* simplified internal localpath implementation
|
* simplified internal localpath implementation
|
||||||
|
|
||||||
1.0.2
|
1.0.2 (2009-08-27)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
* fixing packaging issues, triggered by fedora redhat packaging,
|
* fixing packaging issues, triggered by fedora redhat packaging,
|
||||||
also added doc, examples and contrib dirs to the tarball.
|
also added doc, examples and contrib dirs to the tarball.
|
||||||
|
|
||||||
* added a documentation link to the new django plugin.
|
* added a documentation link to the new django plugin.
|
||||||
|
|
||||||
1.0.1
|
1.0.1 (2009-08-19)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
* added a 'pytest_nose' plugin which handles nose.SkipTest,
|
* added a 'pytest_nose' plugin which handles nose.SkipTest,
|
||||||
nose-style function/method/generator setup/teardown and
|
nose-style function/method/generator setup/teardown and
|
||||||
|
@ -3100,14 +3139,14 @@ Bug fixes:
|
||||||
* simplified multicall mechanism and plugin architecture,
|
* simplified multicall mechanism and plugin architecture,
|
||||||
renamed some internal methods and argnames
|
renamed some internal methods and argnames
|
||||||
|
|
||||||
1.0.0
|
1.0.0 (2009-08-04)
|
||||||
=====
|
==================
|
||||||
|
|
||||||
* more terse reporting try to show filesystem path relatively to current dir
|
* more terse reporting try to show filesystem path relatively to current dir
|
||||||
* improve xfail output a bit
|
* improve xfail output a bit
|
||||||
|
|
||||||
1.0.0b9
|
1.0.0b9 (2009-07-31)
|
||||||
=======
|
====================
|
||||||
|
|
||||||
* cleanly handle and report final teardown of test setup
|
* cleanly handle and report final teardown of test setup
|
||||||
|
|
||||||
|
@ -3140,8 +3179,8 @@ Bug fixes:
|
||||||
* item.repr_failure(excinfo) instead of item.repr_failure(excinfo, outerr)
|
* item.repr_failure(excinfo) instead of item.repr_failure(excinfo, outerr)
|
||||||
|
|
||||||
|
|
||||||
1.0.0b8
|
1.0.0b8 (2009-07-22)
|
||||||
=======
|
====================
|
||||||
|
|
||||||
* pytest_unittest-plugin is now enabled by default
|
* pytest_unittest-plugin is now enabled by default
|
||||||
|
|
||||||
|
@ -3194,8 +3233,8 @@ Bug fixes:
|
||||||
|
|
||||||
* make __name__ == "__channelexec__" for remote_exec code
|
* make __name__ == "__channelexec__" for remote_exec code
|
||||||
|
|
||||||
1.0.0b3
|
1.0.0b3 (2009-06-19)
|
||||||
=======
|
====================
|
||||||
|
|
||||||
* plugin classes are removed: one now defines
|
* plugin classes are removed: one now defines
|
||||||
hooks directly in conftest.py or global pytest_*.py
|
hooks directly in conftest.py or global pytest_*.py
|
||||||
|
|
|
@ -4,7 +4,6 @@ from bisect import bisect_right
|
||||||
import sys
|
import sys
|
||||||
import inspect, tokenize
|
import inspect, tokenize
|
||||||
import py
|
import py
|
||||||
from types import ModuleType
|
|
||||||
cpy_compile = compile
|
cpy_compile = compile
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -192,14 +191,6 @@ class Source(object):
|
||||||
if flag & _AST_FLAG:
|
if flag & _AST_FLAG:
|
||||||
return co
|
return co
|
||||||
lines = [(x + "\n") for x in self.lines]
|
lines = [(x + "\n") for x in self.lines]
|
||||||
if sys.version_info[0] >= 3:
|
|
||||||
# XXX py3's inspect.getsourcefile() checks for a module
|
|
||||||
# and a pep302 __loader__ ... we don't have a module
|
|
||||||
# at code compile-time so we need to fake it here
|
|
||||||
m = ModuleType("_pycodecompile_pseudo_module")
|
|
||||||
py.std.inspect.modulesbyfile[filename] = None
|
|
||||||
py.std.sys.modules[None] = m
|
|
||||||
m.__loader__ = 1
|
|
||||||
py.std.linecache.cache[filename] = (1, None, lines, filename)
|
py.std.linecache.cache[filename] = (1, None, lines, filename)
|
||||||
return co
|
return co
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ def pytest_namespace():
|
||||||
|
|
||||||
|
|
||||||
def register_assert_rewrite(*names):
|
def register_assert_rewrite(*names):
|
||||||
"""Register a module name to be rewritten on import.
|
"""Register one or more module names to be rewritten on import.
|
||||||
|
|
||||||
This function will make sure that this module or all modules inside
|
This function will make sure that this module or all modules inside
|
||||||
the package will get their assert statements rewritten.
|
the package will get their assert statements rewritten.
|
||||||
|
|
|
@ -186,16 +186,15 @@ class AssertionRewritingHook(object):
|
||||||
"""
|
"""
|
||||||
already_imported = set(names).intersection(set(sys.modules))
|
already_imported = set(names).intersection(set(sys.modules))
|
||||||
if already_imported:
|
if already_imported:
|
||||||
for name in names:
|
for name in already_imported:
|
||||||
if name not in self._rewritten_names:
|
if name not in self._rewritten_names:
|
||||||
self._warn_already_imported(already_imported)
|
self._warn_already_imported(name)
|
||||||
self._must_rewrite.update(names)
|
self._must_rewrite.update(names)
|
||||||
|
|
||||||
def _warn_already_imported(self, names):
|
def _warn_already_imported(self, name):
|
||||||
self.config.warn(
|
self.config.warn(
|
||||||
'P1',
|
'P1',
|
||||||
'Modules are already imported so can not be re-written: %s' %
|
'Module already imported so can not be re-written: %s' % name)
|
||||||
','.join(names))
|
|
||||||
|
|
||||||
def load_module(self, name):
|
def load_module(self, name):
|
||||||
# If there is an existing module object named 'fullname' in
|
# If there is an existing module object named 'fullname' in
|
||||||
|
|
|
@ -19,6 +19,7 @@ except ImportError: # pragma: no cover
|
||||||
# Only available in Python 3.4+ or as a backport
|
# Only available in Python 3.4+ or as a backport
|
||||||
enum = None
|
enum = None
|
||||||
|
|
||||||
|
|
||||||
_PY3 = sys.version_info > (3, 0)
|
_PY3 = sys.version_info > (3, 0)
|
||||||
_PY2 = not _PY3
|
_PY2 = not _PY3
|
||||||
|
|
||||||
|
@ -26,6 +27,9 @@ _PY2 = not _PY3
|
||||||
NoneType = type(None)
|
NoneType = type(None)
|
||||||
NOTSET = object()
|
NOTSET = object()
|
||||||
|
|
||||||
|
PY36 = sys.version_info[:2] >= (3, 6)
|
||||||
|
MODULE_NOT_FOUND_ERROR = 'ModuleNotFoundError' if PY36 else 'ImportError'
|
||||||
|
|
||||||
if hasattr(inspect, 'signature'):
|
if hasattr(inspect, 'signature'):
|
||||||
def _format_args(func):
|
def _format_args(func):
|
||||||
return str(inspect.signature(func))
|
return str(inspect.signature(func))
|
||||||
|
@ -42,11 +46,18 @@ REGEX_TYPE = type(re.compile(''))
|
||||||
|
|
||||||
|
|
||||||
def is_generator(func):
|
def is_generator(func):
|
||||||
try:
|
genfunc = inspect.isgeneratorfunction(func)
|
||||||
return _pytest._code.getrawcode(func).co_flags & 32 # generator function
|
return genfunc and not iscoroutinefunction(func)
|
||||||
except AttributeError: # builtin functions have no bytecode
|
|
||||||
# assume them to not be generators
|
|
||||||
return False
|
def iscoroutinefunction(func):
|
||||||
|
"""Return True if func is a decorated coroutine function.
|
||||||
|
|
||||||
|
Note: copied and modified from Python 3.5's builtin couroutines.py to avoid import asyncio directly,
|
||||||
|
which in turns also initializes the "logging" module as side-effect (see issue #8).
|
||||||
|
"""
|
||||||
|
return (getattr(func, '_is_coroutine', False) or
|
||||||
|
(hasattr(inspect, 'iscoroutinefunction') and inspect.iscoroutinefunction(func)))
|
||||||
|
|
||||||
|
|
||||||
def getlocation(function, curdir):
|
def getlocation(function, curdir):
|
||||||
|
|
|
@ -70,6 +70,28 @@ class UsageError(Exception):
|
||||||
""" error in pytest usage or invocation"""
|
""" error in pytest usage or invocation"""
|
||||||
|
|
||||||
|
|
||||||
|
def filename_arg(path, optname):
|
||||||
|
""" Argparse type validator for filename arguments.
|
||||||
|
|
||||||
|
:path: path of filename
|
||||||
|
:optname: name of the option
|
||||||
|
"""
|
||||||
|
if os.path.isdir(path):
|
||||||
|
raise UsageError("{0} must be a filename, given: {1}".format(optname, path))
|
||||||
|
return path
|
||||||
|
|
||||||
|
|
||||||
|
def directory_arg(path, optname):
|
||||||
|
"""Argparse type validator for directory arguments.
|
||||||
|
|
||||||
|
:path: path of directory
|
||||||
|
:optname: name of the option
|
||||||
|
"""
|
||||||
|
if not os.path.isdir(path):
|
||||||
|
raise UsageError("{0} must be a directory, given: {1}".format(optname, path))
|
||||||
|
return path
|
||||||
|
|
||||||
|
|
||||||
_preinit = []
|
_preinit = []
|
||||||
|
|
||||||
default_plugins = (
|
default_plugins = (
|
||||||
|
@ -996,7 +1018,6 @@ class Config(object):
|
||||||
"(are you using python -O?)\n")
|
"(are you using python -O?)\n")
|
||||||
|
|
||||||
def _preparse(self, args, addopts=True):
|
def _preparse(self, args, addopts=True):
|
||||||
import pytest
|
|
||||||
self._initini(args)
|
self._initini(args)
|
||||||
if addopts:
|
if addopts:
|
||||||
args[:] = shlex.split(os.environ.get('PYTEST_ADDOPTS', '')) + args
|
args[:] = shlex.split(os.environ.get('PYTEST_ADDOPTS', '')) + args
|
||||||
|
@ -1009,9 +1030,7 @@ class Config(object):
|
||||||
self.pluginmanager.consider_env()
|
self.pluginmanager.consider_env()
|
||||||
self.known_args_namespace = ns = self._parser.parse_known_args(args, namespace=self.option.copy())
|
self.known_args_namespace = ns = self._parser.parse_known_args(args, namespace=self.option.copy())
|
||||||
confcutdir = self.known_args_namespace.confcutdir
|
confcutdir = self.known_args_namespace.confcutdir
|
||||||
if confcutdir and not os.path.isdir(confcutdir):
|
if self.known_args_namespace.confcutdir is None and self.inifile:
|
||||||
raise pytest.UsageError('--confcutdir must be a directory, given: {0}'.format(confcutdir))
|
|
||||||
if confcutdir is None and self.inifile:
|
|
||||||
confcutdir = py.path.local(self.inifile).dirname
|
confcutdir = py.path.local(self.inifile).dirname
|
||||||
self.known_args_namespace.confcutdir = confcutdir
|
self.known_args_namespace.confcutdir = confcutdir
|
||||||
try:
|
try:
|
||||||
|
@ -1130,7 +1149,10 @@ class Config(object):
|
||||||
if self.getoption("override_ini", None):
|
if self.getoption("override_ini", None):
|
||||||
for ini_config_list in self.option.override_ini:
|
for ini_config_list in self.option.override_ini:
|
||||||
for ini_config in ini_config_list:
|
for ini_config in ini_config_list:
|
||||||
|
try:
|
||||||
(key, user_ini_value) = ini_config.split("=", 1)
|
(key, user_ini_value) = ini_config.split("=", 1)
|
||||||
|
except ValueError:
|
||||||
|
raise UsageError("-o/--override-ini expects option=value style.")
|
||||||
if key == name:
|
if key == name:
|
||||||
value = user_ini_value
|
value = user_ini_value
|
||||||
return value
|
return value
|
||||||
|
@ -1206,25 +1228,20 @@ def getcfg(args, warnfunc=None):
|
||||||
return None, None, None
|
return None, None, None
|
||||||
|
|
||||||
|
|
||||||
def get_common_ancestor(args):
|
def get_common_ancestor(paths):
|
||||||
# args are what we get after early command line parsing (usually
|
|
||||||
# strings, but can be py.path.local objects as well)
|
|
||||||
common_ancestor = None
|
common_ancestor = None
|
||||||
for arg in args:
|
for path in paths:
|
||||||
if str(arg)[0] == "-":
|
if not path.exists():
|
||||||
continue
|
|
||||||
p = py.path.local(arg)
|
|
||||||
if not p.exists():
|
|
||||||
continue
|
continue
|
||||||
if common_ancestor is None:
|
if common_ancestor is None:
|
||||||
common_ancestor = p
|
common_ancestor = path
|
||||||
else:
|
else:
|
||||||
if p.relto(common_ancestor) or p == common_ancestor:
|
if path.relto(common_ancestor) or path == common_ancestor:
|
||||||
continue
|
continue
|
||||||
elif common_ancestor.relto(p):
|
elif common_ancestor.relto(path):
|
||||||
common_ancestor = p
|
common_ancestor = path
|
||||||
else:
|
else:
|
||||||
shared = p.common(common_ancestor)
|
shared = path.common(common_ancestor)
|
||||||
if shared is not None:
|
if shared is not None:
|
||||||
common_ancestor = shared
|
common_ancestor = shared
|
||||||
if common_ancestor is None:
|
if common_ancestor is None:
|
||||||
|
@ -1235,9 +1252,29 @@ def get_common_ancestor(args):
|
||||||
|
|
||||||
|
|
||||||
def get_dirs_from_args(args):
|
def get_dirs_from_args(args):
|
||||||
return [d for d in (py.path.local(x) for x in args
|
def is_option(x):
|
||||||
if not str(x).startswith("-"))
|
return str(x).startswith('-')
|
||||||
if d.exists()]
|
|
||||||
|
def get_file_part_from_node_id(x):
|
||||||
|
return str(x).split('::')[0]
|
||||||
|
|
||||||
|
def get_dir_from_path(path):
|
||||||
|
if path.isdir():
|
||||||
|
return path
|
||||||
|
return py.path.local(path.dirname)
|
||||||
|
|
||||||
|
# These look like paths but may not exist
|
||||||
|
possible_paths = (
|
||||||
|
py.path.local(get_file_part_from_node_id(arg))
|
||||||
|
for arg in args
|
||||||
|
if not is_option(arg)
|
||||||
|
)
|
||||||
|
|
||||||
|
return [
|
||||||
|
get_dir_from_path(path)
|
||||||
|
for path in possible_paths
|
||||||
|
if path.exists()
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def determine_setup(inifile, args, warnfunc=None):
|
def determine_setup(inifile, args, warnfunc=None):
|
||||||
|
|
|
@ -23,7 +23,7 @@ def pytest_addoption(parser):
|
||||||
group._addoption(
|
group._addoption(
|
||||||
'-o', '--override-ini', nargs='*', dest="override_ini",
|
'-o', '--override-ini', nargs='*', dest="override_ini",
|
||||||
action="append",
|
action="append",
|
||||||
help="override config option, e.g. `-o xfail_strict=True`.")
|
help="override config option with option=value style, e.g. `-o xfail_strict=True`.")
|
||||||
|
|
||||||
|
|
||||||
@pytest.hookimpl(hookwrapper=True)
|
@pytest.hookimpl(hookwrapper=True)
|
||||||
|
|
|
@ -8,12 +8,14 @@ Based on initial code from Ross Lawley.
|
||||||
# Output conforms to https://github.com/jenkinsci/xunit-plugin/blob/master/
|
# Output conforms to https://github.com/jenkinsci/xunit-plugin/blob/master/
|
||||||
# src/main/resources/org/jenkinsci/plugins/xunit/types/model/xsd/junit-10.xsd
|
# src/main/resources/org/jenkinsci/plugins/xunit/types/model/xsd/junit-10.xsd
|
||||||
|
|
||||||
|
import functools
|
||||||
import py
|
import py
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
import pytest
|
import pytest
|
||||||
|
from _pytest.config import filename_arg
|
||||||
|
|
||||||
# Python 2.X and 3.X compatibility
|
# Python 2.X and 3.X compatibility
|
||||||
if sys.version_info[0] < 3:
|
if sys.version_info[0] < 3:
|
||||||
|
@ -216,6 +218,7 @@ def pytest_addoption(parser):
|
||||||
action="store",
|
action="store",
|
||||||
dest="xmlpath",
|
dest="xmlpath",
|
||||||
metavar="path",
|
metavar="path",
|
||||||
|
type=functools.partial(filename_arg, optname="--junitxml"),
|
||||||
default=None,
|
default=None,
|
||||||
help="create junit-xml style report file at given path.")
|
help="create junit-xml style report file at given path.")
|
||||||
group.addoption(
|
group.addoption(
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
""" core implementation of testing process: init, session, runtest loop. """
|
""" core implementation of testing process: init, session, runtest loop. """
|
||||||
|
import functools
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
@ -11,6 +12,7 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
from UserDict import DictMixin as MappingMixin
|
from UserDict import DictMixin as MappingMixin
|
||||||
|
|
||||||
|
from _pytest.config import directory_arg
|
||||||
from _pytest.runner import collect_one_node
|
from _pytest.runner import collect_one_node
|
||||||
|
|
||||||
tracebackcutdir = py.path.local(_pytest.__file__).dirpath()
|
tracebackcutdir = py.path.local(_pytest.__file__).dirpath()
|
||||||
|
@ -58,7 +60,7 @@ def pytest_addoption(parser):
|
||||||
# when changing this to --conf-cut-dir, config.py Conftest.setinitial
|
# when changing this to --conf-cut-dir, config.py Conftest.setinitial
|
||||||
# needs upgrading as well
|
# needs upgrading as well
|
||||||
group.addoption('--confcutdir', dest="confcutdir", default=None,
|
group.addoption('--confcutdir', dest="confcutdir", default=None,
|
||||||
metavar="dir",
|
metavar="dir", type=functools.partial(directory_arg, optname="--confcutdir"),
|
||||||
help="only load conftest.py's relative to specified dir.")
|
help="only load conftest.py's relative to specified dir.")
|
||||||
group.addoption('--noconftest', action="store_true",
|
group.addoption('--noconftest', action="store_true",
|
||||||
dest="noconftest", default=False,
|
dest="noconftest", default=False,
|
||||||
|
@ -533,7 +535,6 @@ class Session(FSCollector):
|
||||||
def __init__(self, config):
|
def __init__(self, config):
|
||||||
FSCollector.__init__(self, config.rootdir, parent=None,
|
FSCollector.__init__(self, config.rootdir, parent=None,
|
||||||
config=config, session=self)
|
config=config, session=self)
|
||||||
self._fs2hookproxy = {}
|
|
||||||
self.testsfailed = 0
|
self.testsfailed = 0
|
||||||
self.testscollected = 0
|
self.testscollected = 0
|
||||||
self.shouldstop = False
|
self.shouldstop = False
|
||||||
|
@ -564,9 +565,6 @@ class Session(FSCollector):
|
||||||
return path in self._initialpaths
|
return path in self._initialpaths
|
||||||
|
|
||||||
def gethookproxy(self, fspath):
|
def gethookproxy(self, fspath):
|
||||||
try:
|
|
||||||
return self._fs2hookproxy[fspath]
|
|
||||||
except KeyError:
|
|
||||||
# check if we have the common case of running
|
# check if we have the common case of running
|
||||||
# hooks with all conftest.py filesall conftest.py
|
# hooks with all conftest.py filesall conftest.py
|
||||||
pm = self.config.pluginmanager
|
pm = self.config.pluginmanager
|
||||||
|
@ -578,8 +576,6 @@ class Session(FSCollector):
|
||||||
else:
|
else:
|
||||||
# all plugis are active for this fspath
|
# all plugis are active for this fspath
|
||||||
proxy = self.config.hook
|
proxy = self.config.hook
|
||||||
|
|
||||||
self._fs2hookproxy[fspath] = proxy
|
|
||||||
return proxy
|
return proxy
|
||||||
|
|
||||||
def perform_collect(self, args=None, genitems=True):
|
def perform_collect(self, args=None, genitems=True):
|
||||||
|
|
|
@ -481,6 +481,7 @@ class Testdir:
|
||||||
ret = None
|
ret = None
|
||||||
for name, value in items:
|
for name, value in items:
|
||||||
p = self.tmpdir.join(name).new(ext=ext)
|
p = self.tmpdir.join(name).new(ext=ext)
|
||||||
|
p.dirpath().ensure_dir()
|
||||||
source = Source(value)
|
source = Source(value)
|
||||||
|
|
||||||
def my_totext(s, encoding="utf-8"):
|
def my_totext(s, encoding="utf-8"):
|
||||||
|
|
|
@ -1431,16 +1431,10 @@ class ApproxNonIterable(object):
|
||||||
except ValueError:
|
except ValueError:
|
||||||
vetted_tolerance = '???'
|
vetted_tolerance = '???'
|
||||||
|
|
||||||
plus_minus = u'{0} \u00b1 {1}'.format(self.expected, vetted_tolerance)
|
|
||||||
|
|
||||||
# In python2, __repr__() must return a string (i.e. not a unicode
|
|
||||||
# object). In python3, __repr__() must return a unicode object
|
|
||||||
# (although now strings are unicode objects and bytes are what
|
|
||||||
# strings were).
|
|
||||||
if sys.version_info[0] == 2:
|
if sys.version_info[0] == 2:
|
||||||
return plus_minus.encode('utf-8')
|
return '{0} +- {1}'.format(self.expected, vetted_tolerance)
|
||||||
else:
|
else:
|
||||||
return plus_minus
|
return u'{0} \u00b1 {1}'.format(self.expected, vetted_tolerance)
|
||||||
|
|
||||||
def __eq__(self, actual):
|
def __eq__(self, actual):
|
||||||
# Short-circuit exact equality.
|
# Short-circuit exact equality.
|
||||||
|
|
|
@ -218,4 +218,7 @@ class WarningsChecker(WarningsRecorder):
|
||||||
if self.expected_warning is not None:
|
if self.expected_warning is not None:
|
||||||
if not any(r.category in self.expected_warning for r in self):
|
if not any(r.category in self.expected_warning for r in self):
|
||||||
__tracebackhide__ = True
|
__tracebackhide__ = True
|
||||||
pytest.fail("DID NOT WARN")
|
pytest.fail("DID NOT WARN. No warnings of type {0} was emitted. "
|
||||||
|
"The list of emitted warnings is: {1}.".format(
|
||||||
|
self.expected_warning,
|
||||||
|
[each.message for each in self]))
|
||||||
|
|
|
@ -5,9 +5,9 @@ import sys
|
||||||
def pytest_addoption(parser):
|
def pytest_addoption(parser):
|
||||||
group = parser.getgroup("debugconfig")
|
group = parser.getgroup("debugconfig")
|
||||||
group.addoption('--setuponly', '--setup-only', action="store_true",
|
group.addoption('--setuponly', '--setup-only', action="store_true",
|
||||||
help="only setup fixtures, don't execute the tests.")
|
help="only setup fixtures, do not execute tests.")
|
||||||
group.addoption('--setupshow', '--setup-show', action="store_true",
|
group.addoption('--setupshow', '--setup-show', action="store_true",
|
||||||
help="show setup fixtures while executing the tests.")
|
help="show setup of fixtures while executing tests.")
|
||||||
|
|
||||||
|
|
||||||
@pytest.hookimpl(hookwrapper=True)
|
@pytest.hookimpl(hookwrapper=True)
|
||||||
|
|
|
@ -27,6 +27,12 @@ environment:
|
||||||
- TOXENV: "freeze"
|
- TOXENV: "freeze"
|
||||||
- TOXENV: "docs"
|
- TOXENV: "docs"
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
allow_failures:
|
||||||
|
# see #1989
|
||||||
|
- TOXENV: "py27-trial"
|
||||||
|
- TOXENV: "py35-trial"
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- echo Installed Pythons
|
- echo Installed Pythons
|
||||||
- dir c:\Python*
|
- dir c:\Python*
|
||||||
|
|
|
@ -6,6 +6,7 @@ Release announcements
|
||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
|
|
||||||
|
|
||||||
|
release-3.0.5
|
||||||
release-3.0.4
|
release-3.0.4
|
||||||
release-3.0.3
|
release-3.0.3
|
||||||
release-3.0.2
|
release-3.0.2
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
pytest-3.0.5
|
||||||
|
============
|
||||||
|
|
||||||
|
pytest 3.0.5 has just been released to PyPI.
|
||||||
|
|
||||||
|
This is a bug-fix release, being a drop-in replacement. To upgrade::
|
||||||
|
|
||||||
|
pip install --upgrade pytest
|
||||||
|
|
||||||
|
The changelog is available at http://doc.pytest.org/en/latest/changelog.html.
|
||||||
|
|
||||||
|
Thanks to all who contributed to this release, among them:
|
||||||
|
|
||||||
|
* Ana Vojnovic
|
||||||
|
* Bruno Oliveira
|
||||||
|
* Daniel Hahler
|
||||||
|
* Duncan Betts
|
||||||
|
* Igor Starikov
|
||||||
|
* Ismail
|
||||||
|
* Luke Murphy
|
||||||
|
* Ned Batchelder
|
||||||
|
* Ronny Pfannschmidt
|
||||||
|
* Sebastian Ramacher
|
||||||
|
* nmundar
|
||||||
|
|
||||||
|
Happy testing,
|
||||||
|
The pytest Development Team
|
|
@ -26,7 +26,7 @@ you will see the return value of the function call::
|
||||||
|
|
||||||
$ pytest test_assert1.py
|
$ pytest test_assert1.py
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 1 items
|
collected 1 items
|
||||||
|
|
||||||
|
@ -170,7 +170,7 @@ if you run this module::
|
||||||
|
|
||||||
$ pytest test_assert2.py
|
$ pytest test_assert2.py
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 1 items
|
collected 1 items
|
||||||
|
|
||||||
|
|
|
@ -80,7 +80,7 @@ If you then run it with ``--lf``::
|
||||||
|
|
||||||
$ pytest --lf
|
$ pytest --lf
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
run-last-failure: rerun last 2 failures
|
run-last-failure: rerun last 2 failures
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 50 items
|
collected 50 items
|
||||||
|
@ -122,7 +122,7 @@ of ``FF`` and dots)::
|
||||||
|
|
||||||
$ pytest --ff
|
$ pytest --ff
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
run-last-failure: rerun last 2 failures first
|
run-last-failure: rerun last 2 failures first
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 50 items
|
collected 50 items
|
||||||
|
@ -227,7 +227,7 @@ You can always peek at the content of the cache using the
|
||||||
|
|
||||||
$ py.test --cache-show
|
$ py.test --cache-show
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
cachedir: $REGENDOC_TMPDIR/.cache
|
cachedir: $REGENDOC_TMPDIR/.cache
|
||||||
------------------------------- cache values -------------------------------
|
------------------------------- cache values -------------------------------
|
||||||
|
|
|
@ -64,7 +64,7 @@ of the failing function and hide the other one::
|
||||||
|
|
||||||
$ pytest
|
$ pytest
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 2 items
|
collected 2 items
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,7 @@ then you can just invoke ``pytest`` without command line options::
|
||||||
|
|
||||||
$ pytest
|
$ pytest
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini
|
rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini
|
||||||
collected 1 items
|
collected 1 items
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,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.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .cache
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collecting ... collected 4 items
|
collecting ... collected 4 items
|
||||||
|
@ -45,7 +45,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.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .cache
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collecting ... collected 4 items
|
collecting ... collected 4 items
|
||||||
|
@ -66,7 +66,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.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .cache
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collecting ... collected 5 items
|
collecting ... collected 5 items
|
||||||
|
@ -79,7 +79,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.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .cache
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collecting ... collected 4 items
|
collecting ... collected 4 items
|
||||||
|
@ -92,7 +92,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.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .cache
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collecting ... collected 8 items
|
collecting ... collected 8 items
|
||||||
|
@ -130,7 +130,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.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .cache
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collecting ... collected 4 items
|
collecting ... collected 4 items
|
||||||
|
@ -144,7 +144,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.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .cache
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collecting ... collected 4 items
|
collecting ... collected 4 items
|
||||||
|
@ -160,7 +160,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.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .cache
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collecting ... collected 4 items
|
collecting ... collected 4 items
|
||||||
|
@ -352,7 +352,7 @@ the test needs::
|
||||||
|
|
||||||
$ pytest -E stage2
|
$ pytest -E stage2
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 1 items
|
collected 1 items
|
||||||
|
|
||||||
|
@ -364,7 +364,7 @@ and here is one that specifies exactly the environment needed::
|
||||||
|
|
||||||
$ pytest -E stage1
|
$ pytest -E stage1
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 1 items
|
collected 1 items
|
||||||
|
|
||||||
|
@ -485,7 +485,7 @@ then you will see two test skipped and two executed tests as expected::
|
||||||
|
|
||||||
$ pytest -rs # this option reports skip reasons
|
$ pytest -rs # this option reports skip reasons
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 4 items
|
collected 4 items
|
||||||
|
|
||||||
|
@ -499,7 +499,7 @@ Note that if you specify a platform via the marker-command line option like this
|
||||||
|
|
||||||
$ pytest -m linux2
|
$ pytest -m linux2
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 4 items
|
collected 4 items
|
||||||
|
|
||||||
|
@ -551,7 +551,7 @@ We can now use the ``-m option`` to select one set::
|
||||||
|
|
||||||
$ pytest -m interface --tb=short
|
$ pytest -m interface --tb=short
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 4 items
|
collected 4 items
|
||||||
|
|
||||||
|
@ -573,7 +573,7 @@ or to select both "event" and "interface" tests::
|
||||||
|
|
||||||
$ pytest -m "interface or event" --tb=short
|
$ pytest -m "interface or event" --tb=short
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 4 items
|
collected 4 items
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ now execute the test specification::
|
||||||
|
|
||||||
nonpython $ pytest test_simple.yml
|
nonpython $ pytest test_simple.yml
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR/nonpython, inifile:
|
rootdir: $REGENDOC_TMPDIR/nonpython, inifile:
|
||||||
collected 2 items
|
collected 2 items
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ consulted when reporting in ``verbose`` mode::
|
||||||
|
|
||||||
nonpython $ pytest -v
|
nonpython $ pytest -v
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .cache
|
||||||
rootdir: $REGENDOC_TMPDIR/nonpython, inifile:
|
rootdir: $REGENDOC_TMPDIR/nonpython, inifile:
|
||||||
collecting ... collected 2 items
|
collecting ... collected 2 items
|
||||||
|
@ -81,7 +81,7 @@ interesting to just look at the collection tree::
|
||||||
|
|
||||||
nonpython $ pytest --collect-only
|
nonpython $ pytest --collect-only
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR/nonpython, inifile:
|
rootdir: $REGENDOC_TMPDIR/nonpython, inifile:
|
||||||
collected 2 items
|
collected 2 items
|
||||||
<YamlFile 'test_simple.yml'>
|
<YamlFile 'test_simple.yml'>
|
||||||
|
|
|
@ -130,7 +130,7 @@ objects, they are still using the default pytest representation::
|
||||||
|
|
||||||
$ pytest test_time.py --collect-only
|
$ pytest test_time.py --collect-only
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 6 items
|
collected 6 items
|
||||||
<Module 'test_time.py'>
|
<Module 'test_time.py'>
|
||||||
|
@ -181,7 +181,7 @@ this is a fully self-contained example which you can run with::
|
||||||
|
|
||||||
$ pytest test_scenarios.py
|
$ pytest test_scenarios.py
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 4 items
|
collected 4 items
|
||||||
|
|
||||||
|
@ -194,7 +194,7 @@ If you just collect tests you'll also nicely see 'advanced' and 'basic' as varia
|
||||||
|
|
||||||
$ pytest --collect-only test_scenarios.py
|
$ pytest --collect-only test_scenarios.py
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 4 items
|
collected 4 items
|
||||||
<Module 'test_scenarios.py'>
|
<Module 'test_scenarios.py'>
|
||||||
|
@ -259,7 +259,7 @@ Let's first see how it looks like at collection time::
|
||||||
|
|
||||||
$ pytest test_backends.py --collect-only
|
$ pytest test_backends.py --collect-only
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 2 items
|
collected 2 items
|
||||||
<Module 'test_backends.py'>
|
<Module 'test_backends.py'>
|
||||||
|
@ -320,7 +320,7 @@ The result of this test will be successful::
|
||||||
|
|
||||||
$ pytest test_indirect_list.py --collect-only
|
$ pytest test_indirect_list.py --collect-only
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 1 items
|
collected 1 items
|
||||||
<Module 'test_indirect_list.py'>
|
<Module 'test_indirect_list.py'>
|
||||||
|
@ -447,7 +447,7 @@ If you run this with reporting for skips enabled::
|
||||||
|
|
||||||
$ pytest -rs test_module.py
|
$ pytest -rs test_module.py
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 2 items
|
collected 2 items
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,7 @@ then the test collection looks like this::
|
||||||
|
|
||||||
$ pytest --collect-only
|
$ pytest --collect-only
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini
|
rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini
|
||||||
collected 2 items
|
collected 2 items
|
||||||
<Module 'check_myapp.py'>
|
<Module 'check_myapp.py'>
|
||||||
|
@ -163,7 +163,7 @@ You can always peek at the collection tree without running tests like this::
|
||||||
|
|
||||||
. $ pytest --collect-only pythoncollection.py
|
. $ pytest --collect-only pythoncollection.py
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini
|
rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini
|
||||||
collected 3 items
|
collected 3 items
|
||||||
<Module 'CWD/pythoncollection.py'>
|
<Module 'CWD/pythoncollection.py'>
|
||||||
|
@ -230,7 +230,7 @@ will be left out::
|
||||||
|
|
||||||
$ pytest --collect-only
|
$ pytest --collect-only
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini
|
rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini
|
||||||
collected 0 items
|
collected 0 items
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ get on the terminal - we are working on that)::
|
||||||
|
|
||||||
assertion $ pytest failure_demo.py
|
assertion $ pytest failure_demo.py
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR/assertion, inifile:
|
rootdir: $REGENDOC_TMPDIR/assertion, inifile:
|
||||||
collected 42 items
|
collected 42 items
|
||||||
|
|
||||||
|
@ -359,7 +359,7 @@ get on the terminal - we are working on that)::
|
||||||
> int(s)
|
> int(s)
|
||||||
E ValueError: invalid literal for int() with base 10: 'qwe'
|
E ValueError: invalid literal for int() with base 10: 'qwe'
|
||||||
|
|
||||||
<0-codegen $PYTHON_PREFIX/lib/python3.5/site-packages/_pytest/python.py:1204>:1: ValueError
|
<0-codegen $PYTHON_PREFIX/lib/python3.5/site-packages/_pytest/python.py:1207>:1: ValueError
|
||||||
_______ TestRaises.test_raises_doesnt ________
|
_______ TestRaises.test_raises_doesnt ________
|
||||||
|
|
||||||
self = <failure_demo.TestRaises object at 0xdeadbeef>
|
self = <failure_demo.TestRaises object at 0xdeadbeef>
|
||||||
|
|
|
@ -113,7 +113,7 @@ directory with the above conftest.py::
|
||||||
|
|
||||||
$ pytest
|
$ pytest
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 0 items
|
collected 0 items
|
||||||
|
|
||||||
|
@ -164,7 +164,7 @@ and when running it will see a skipped "slow" test::
|
||||||
|
|
||||||
$ pytest -rs # "-rs" means report details on the little 's'
|
$ pytest -rs # "-rs" means report details on the little 's'
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 2 items
|
collected 2 items
|
||||||
|
|
||||||
|
@ -178,7 +178,7 @@ Or run it including the ``slow`` marked test::
|
||||||
|
|
||||||
$ pytest --runslow
|
$ pytest --runslow
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 2 items
|
collected 2 items
|
||||||
|
|
||||||
|
@ -302,7 +302,7 @@ which will add the string to the test header accordingly::
|
||||||
|
|
||||||
$ pytest
|
$ pytest
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
project deps: mylib-1.1
|
project deps: mylib-1.1
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 0 items
|
collected 0 items
|
||||||
|
@ -327,7 +327,7 @@ which will add info only when run with "--v"::
|
||||||
|
|
||||||
$ pytest -v
|
$ pytest -v
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .cache
|
||||||
info1: did you know that ...
|
info1: did you know that ...
|
||||||
did you?
|
did you?
|
||||||
|
@ -340,7 +340,7 @@ and nothing when run plainly::
|
||||||
|
|
||||||
$ pytest
|
$ pytest
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 0 items
|
collected 0 items
|
||||||
|
|
||||||
|
@ -374,7 +374,7 @@ Now we can profile which test functions execute the slowest::
|
||||||
|
|
||||||
$ pytest --durations=3
|
$ pytest --durations=3
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 3 items
|
collected 3 items
|
||||||
|
|
||||||
|
@ -440,7 +440,7 @@ If we run this::
|
||||||
|
|
||||||
$ pytest -rx
|
$ pytest -rx
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 4 items
|
collected 4 items
|
||||||
|
|
||||||
|
@ -519,7 +519,7 @@ We can run this::
|
||||||
|
|
||||||
$ pytest
|
$ pytest
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 7 items
|
collected 7 items
|
||||||
|
|
||||||
|
@ -627,7 +627,7 @@ and run them::
|
||||||
|
|
||||||
$ pytest test_module.py
|
$ pytest test_module.py
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 2 items
|
collected 2 items
|
||||||
|
|
||||||
|
@ -721,7 +721,7 @@ and run it::
|
||||||
|
|
||||||
$ pytest -s test_module.py
|
$ pytest -s test_module.py
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 3 items
|
collected 3 items
|
||||||
|
|
||||||
|
|
|
@ -70,7 +70,7 @@ marked ``smtp`` fixture function. Running the test looks like this::
|
||||||
|
|
||||||
$ pytest test_smtpsimple.py
|
$ pytest test_smtpsimple.py
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 1 items
|
collected 1 items
|
||||||
|
|
||||||
|
@ -188,7 +188,7 @@ inspect what is going on and can now run the tests::
|
||||||
|
|
||||||
$ pytest test_module.py
|
$ pytest test_module.py
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 2 items
|
collected 2 items
|
||||||
|
|
||||||
|
@ -257,8 +257,9 @@ the code after the *yield* statement serves as the teardown code.::
|
||||||
print("teardown smtp")
|
print("teardown smtp")
|
||||||
smtp.close()
|
smtp.close()
|
||||||
|
|
||||||
The ``print`` and ``smtp.close()`` statements will execute when the last test using
|
The ``print`` and ``smtp.close()`` statements will execute when the last test in
|
||||||
the fixture in the module has finished execution, regardless of the exception status of the tests.
|
the module has finished execution, regardless of the exception status of the
|
||||||
|
tests.
|
||||||
|
|
||||||
Let's execute it::
|
Let's execute it::
|
||||||
|
|
||||||
|
@ -318,8 +319,7 @@ the ``with`` statement ends.
|
||||||
request.addfinalizer(fin)
|
request.addfinalizer(fin)
|
||||||
return smtp # provide the fixture value
|
return smtp # provide the fixture value
|
||||||
|
|
||||||
The ``fin`` function will execute when the last test using
|
The ``fin`` function will execute when the last test in the module has finished execution.
|
||||||
the fixture in the module has finished execution.
|
|
||||||
|
|
||||||
This method is still fully supported, but ``yield`` is recommended from 2.10 onward because
|
This method is still fully supported, but ``yield`` is recommended from 2.10 onward because
|
||||||
it is considered simpler and better describes the natural code flow.
|
it is considered simpler and better describes the natural code flow.
|
||||||
|
@ -520,7 +520,7 @@ Running the above tests results in the following test IDs being used::
|
||||||
|
|
||||||
$ pytest --collect-only
|
$ pytest --collect-only
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 11 items
|
collected 11 items
|
||||||
<Module 'test_anothersmtp.py'>
|
<Module 'test_anothersmtp.py'>
|
||||||
|
@ -573,7 +573,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.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .cache
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collecting ... collected 2 items
|
collecting ... collected 2 items
|
||||||
|
@ -642,7 +642,7 @@ Let's run the tests in verbose mode and with looking at the print-output::
|
||||||
|
|
||||||
$ pytest -v -s test_module.py
|
$ pytest -v -s test_module.py
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0 -- $PYTHON_PREFIX/bin/python3.5
|
||||||
cachedir: .cache
|
cachedir: .cache
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collecting ... collected 8 items
|
collecting ... collected 8 items
|
||||||
|
@ -1002,7 +1002,7 @@ Given the tests file structure is:
|
||||||
|
|
||||||
@pytest.mark.parametrize('username', ['directly-overridden-username-other'])
|
@pytest.mark.parametrize('username', ['directly-overridden-username-other'])
|
||||||
def test_username_other(other_username):
|
def test_username_other(other_username):
|
||||||
assert username == 'other-directly-overridden-username-other'
|
assert other_username == 'other-directly-overridden-username-other'
|
||||||
|
|
||||||
In the example above, a fixture value is overridden by the test parameter value. Note that the value of the fixture
|
In the example above, a fixture value is overridden by the test parameter value. Note that the value of the fixture
|
||||||
can be overridden this way even if the test doesn't use it directly (doesn't mention it in the function prototype).
|
can be overridden this way even if the test doesn't use it directly (doesn't mention it in the function prototype).
|
||||||
|
|
|
@ -26,7 +26,7 @@ Installation::
|
||||||
To check your installation has installed the correct version::
|
To check your installation has installed the correct version::
|
||||||
|
|
||||||
$ pytest --version
|
$ pytest --version
|
||||||
This is pytest version 3.0.4, imported from $PYTHON_PREFIX/lib/python3.5/site-packages/pytest.py
|
This is pytest version 3.0.5, imported from $PYTHON_PREFIX/lib/python3.5/site-packages/pytest.py
|
||||||
|
|
||||||
.. _`simpletest`:
|
.. _`simpletest`:
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ That's it. You can execute the test function now::
|
||||||
|
|
||||||
$ pytest
|
$ pytest
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 1 items
|
collected 1 items
|
||||||
|
|
||||||
|
|
|
@ -127,7 +127,7 @@ required configurations.
|
||||||
The reason for this somewhat evolved importing technique is
|
The reason for this somewhat evolved importing technique is
|
||||||
that in larger projects multiple test modules might import
|
that in larger projects multiple test modules might import
|
||||||
from each other and thus deriving a canonical import name helps
|
from each other and thus deriving a canonical import name helps
|
||||||
to avoid surprises such as a test modules getting imported twice.
|
to avoid surprises such as a test module getting imported twice.
|
||||||
|
|
||||||
|
|
||||||
.. _`virtualenv`: http://pypi.python.org/pypi/virtualenv
|
.. _`virtualenv`: http://pypi.python.org/pypi/virtualenv
|
||||||
|
|
|
@ -24,13 +24,15 @@ An example of a simple test:
|
||||||
To execute it::
|
To execute it::
|
||||||
|
|
||||||
$ pytest
|
$ pytest
|
||||||
============================= test session starts =============================
|
======= test session starts ========
|
||||||
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 1 items
|
collected 1 items
|
||||||
|
|
||||||
test_sample.py F
|
test_sample.py F
|
||||||
|
|
||||||
================================== FAILURES ===================================
|
======= FAILURES ========
|
||||||
_________________________________ test_answer _________________________________
|
_______ test_answer ________
|
||||||
|
|
||||||
def test_answer():
|
def test_answer():
|
||||||
> assert inc(3) == 5
|
> assert inc(3) == 5
|
||||||
|
@ -38,7 +40,7 @@ To execute it::
|
||||||
E + where 4 = inc(3)
|
E + where 4 = inc(3)
|
||||||
|
|
||||||
test_sample.py:5: AssertionError
|
test_sample.py:5: AssertionError
|
||||||
========================== 1 failed in 0.04 seconds ===========================
|
======= 1 failed in 0.12 seconds ========
|
||||||
|
|
||||||
Due to ``pytest``'s detailed assertion introspection, only plain ``assert`` statements are used.
|
Due to ``pytest``'s detailed assertion introspection, only plain ``assert`` statements are used.
|
||||||
See :ref:`Getting Started <getstarted>` for more examples.
|
See :ref:`Getting Started <getstarted>` for more examples.
|
||||||
|
|
|
@ -55,7 +55,7 @@ them in turn::
|
||||||
|
|
||||||
$ pytest
|
$ pytest
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 3 items
|
collected 3 items
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ Let's run this::
|
||||||
|
|
||||||
$ pytest
|
$ pytest
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 3 items
|
collected 3 items
|
||||||
|
|
||||||
|
|
|
@ -224,7 +224,7 @@ Running it with the report-on-xfail option gives this output::
|
||||||
|
|
||||||
example $ pytest -rx xfail_demo.py
|
example $ pytest -rx xfail_demo.py
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR/example, inifile:
|
rootdir: $REGENDOC_TMPDIR/example, inifile:
|
||||||
collected 7 items
|
collected 7 items
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ Running this would result in a passed test except for the last
|
||||||
|
|
||||||
$ pytest test_tmpdir.py
|
$ pytest test_tmpdir.py
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 1 items
|
collected 1 items
|
||||||
|
|
||||||
|
|
|
@ -100,7 +100,7 @@ the ``self.db`` values in the traceback::
|
||||||
|
|
||||||
$ pytest test_unittest_db.py
|
$ pytest test_unittest_db.py
|
||||||
======= test session starts ========
|
======= test session starts ========
|
||||||
platform linux -- Python 3.5.2, pytest-3.0.4, py-1.4.31, pluggy-0.4.0
|
platform linux -- Python 3.5.2, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
|
||||||
rootdir: $REGENDOC_TMPDIR, inifile:
|
rootdir: $REGENDOC_TMPDIR, inifile:
|
||||||
collected 2 items
|
collected 2 items
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,8 @@ You can invoke testing through the Python interpreter from the command line::
|
||||||
|
|
||||||
python -m pytest [...]
|
python -m pytest [...]
|
||||||
|
|
||||||
This is equivalent to invoking the command line script ``pytest [...]``
|
This is almost equivalent to invoking the command line script ``pytest [...]``
|
||||||
directly.
|
directly, except that python will also add the current directory to ``sys.path``.
|
||||||
|
|
||||||
Getting help on version, option names, environment variables
|
Getting help on version, option names, environment variables
|
||||||
--------------------------------------------------------------
|
--------------------------------------------------------------
|
||||||
|
|
2
setup.py
2
setup.py
|
@ -48,7 +48,7 @@ def has_environment_marker_support():
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
install_requires = ['py>=1.4.29'] # pluggy is vendored in _pytest.vendored_packages
|
install_requires = ['py>=1.4.29', 'setuptools'] # pluggy is vendored in _pytest.vendored_packages
|
||||||
extras_require = {}
|
extras_require = {}
|
||||||
if has_environment_marker_support():
|
if has_environment_marker_support():
|
||||||
extras_require[':python_version=="2.6"'] = ['argparse']
|
extras_require[':python_version=="2.6"'] = ['argparse']
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# encoding: utf-8
|
# encoding: utf-8
|
||||||
|
import sys
|
||||||
import pytest
|
import pytest
|
||||||
import doctest
|
import doctest
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ from decimal import Decimal
|
||||||
from fractions import Fraction
|
from fractions import Fraction
|
||||||
inf, nan = float('inf'), float('nan')
|
inf, nan = float('inf'), float('nan')
|
||||||
|
|
||||||
|
|
||||||
class MyDocTestRunner(doctest.DocTestRunner):
|
class MyDocTestRunner(doctest.DocTestRunner):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
@ -22,13 +23,17 @@ class MyDocTestRunner(doctest.DocTestRunner):
|
||||||
class TestApprox:
|
class TestApprox:
|
||||||
|
|
||||||
def test_repr_string(self):
|
def test_repr_string(self):
|
||||||
# Just make sure the Unicode handling doesn't raise any exceptions.
|
# for some reason in Python 2.6 it is not displaying the tolerance representation correctly
|
||||||
print(approx(1.0))
|
plus_minus = u'\u00b1' if sys.version_info[0] > 2 else u'+-'
|
||||||
print(approx([1.0, 2.0, 3.0]))
|
tol1, tol2, infr = '1.0e-06', '2.0e-06', 'inf'
|
||||||
print(approx(inf))
|
if sys.version_info[:2] == (2, 6):
|
||||||
print(approx(1.0, rel=nan))
|
tol1, tol2, infr = '???', '???', '???'
|
||||||
print(approx(1.0, rel=inf))
|
assert repr(approx(1.0)) == '1.0 {pm} {tol1}'.format(pm=plus_minus, tol1=tol1)
|
||||||
print(approx(1.0j, rel=inf))
|
assert repr(approx([1.0, 2.0])) == '1.0 {pm} {tol1}, 2.0 {pm} {tol2}'.format(pm=plus_minus, tol1=tol1, tol2=tol2)
|
||||||
|
assert repr(approx(inf)) == 'inf'
|
||||||
|
assert repr(approx(1.0, rel=nan)) == '1.0 {pm} ???'.format(pm=plus_minus)
|
||||||
|
assert repr(approx(1.0, rel=inf)) == '1.0 {pm} {infr}'.format(pm=plus_minus, infr=infr)
|
||||||
|
assert repr(approx(1.0j, rel=inf)) == '1j'
|
||||||
|
|
||||||
def test_operator_overloading(self):
|
def test_operator_overloading(self):
|
||||||
assert 1 == approx(1, rel=1e-6, abs=1e-12)
|
assert 1 == approx(1, rel=1e-6, abs=1e-12)
|
||||||
|
@ -285,3 +290,23 @@ class TestApprox:
|
||||||
runner = MyDocTestRunner()
|
runner = MyDocTestRunner()
|
||||||
runner.run(test)
|
runner.run(test)
|
||||||
|
|
||||||
|
def test_unicode_plus_minus(self, testdir):
|
||||||
|
"""
|
||||||
|
Comparing approx instances inside lists should not produce an error in the detailed diff.
|
||||||
|
Integration test for issue #2111.
|
||||||
|
"""
|
||||||
|
testdir.makepyfile("""
|
||||||
|
import pytest
|
||||||
|
def test_foo():
|
||||||
|
assert [3] == [pytest.approx(4)]
|
||||||
|
""")
|
||||||
|
expected = '4.0e-06'
|
||||||
|
# for some reason in Python 2.6 it is not displaying the tolerance representation correctly
|
||||||
|
if sys.version_info[:2] == (2, 6):
|
||||||
|
expected = '???'
|
||||||
|
result = testdir.runpytest()
|
||||||
|
result.stdout.fnmatch_lines([
|
||||||
|
'*At index 0 diff: 3 != 4 * {0}'.format(expected),
|
||||||
|
'=* 1 failed in *=',
|
||||||
|
])
|
||||||
|
|
||||||
|
|
|
@ -682,6 +682,19 @@ def test_rewritten():
|
||||||
hook.mark_rewrite('test_remember_rewritten_modules')
|
hook.mark_rewrite('test_remember_rewritten_modules')
|
||||||
assert warnings == []
|
assert warnings == []
|
||||||
|
|
||||||
|
def test_rewrite_warning_using_pytest_plugins(self, testdir, monkeypatch):
|
||||||
|
testdir.makepyfile(**{
|
||||||
|
'conftest.py': "pytest_plugins = ['core', 'gui', 'sci']",
|
||||||
|
'core.py': "",
|
||||||
|
'gui.py': "pytest_plugins = ['core', 'sci']",
|
||||||
|
'sci.py': "pytest_plugins = ['core']",
|
||||||
|
'test_rewrite_warning_pytest_plugins.py': "def test(): pass",
|
||||||
|
})
|
||||||
|
testdir.chdir()
|
||||||
|
result = testdir.runpytest_subprocess()
|
||||||
|
result.stdout.fnmatch_lines(['*= 1 passed in *=*'])
|
||||||
|
assert 'pytest-warning summary' not in result.stdout.str()
|
||||||
|
|
||||||
|
|
||||||
class TestAssertionRewriteHookDetails(object):
|
class TestAssertionRewriteHookDetails(object):
|
||||||
def test_loader_is_package_false_for_module(self, testdir):
|
def test_loader_is_package_false_for_module(self, testdir):
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
from _pytest.compat import is_generator
|
||||||
|
|
||||||
|
|
||||||
|
def test_is_generator():
|
||||||
|
def zap():
|
||||||
|
yield
|
||||||
|
|
||||||
|
def foo():
|
||||||
|
pass
|
||||||
|
|
||||||
|
assert is_generator(zap)
|
||||||
|
assert not is_generator(foo)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skipif(sys.version_info < (3, 4), reason='asyncio available in Python 3.4+')
|
||||||
|
def test_is_generator_asyncio(testdir):
|
||||||
|
testdir.makepyfile("""
|
||||||
|
from _pytest.compat import is_generator
|
||||||
|
import asyncio
|
||||||
|
@asyncio.coroutine
|
||||||
|
def baz():
|
||||||
|
yield from [1,2,3]
|
||||||
|
|
||||||
|
def test_is_generator_asyncio():
|
||||||
|
assert not is_generator(baz)
|
||||||
|
""")
|
||||||
|
# avoid importing asyncio into pytest's own process, which in turn imports logging (#8)
|
||||||
|
result = testdir.runpytest_subprocess()
|
||||||
|
result.stdout.fnmatch_lines(['*1 passed*'])
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skipif(sys.version_info < (3, 5), reason='async syntax available in Python 3.5+')
|
||||||
|
def test_is_generator_async_syntax(testdir):
|
||||||
|
testdir.makepyfile("""
|
||||||
|
from _pytest.compat import is_generator
|
||||||
|
def test_is_generator_py35():
|
||||||
|
async def foo():
|
||||||
|
await foo()
|
||||||
|
|
||||||
|
async def bar():
|
||||||
|
pass
|
||||||
|
|
||||||
|
assert not is_generator(foo)
|
||||||
|
assert not is_generator(bar)
|
||||||
|
""")
|
||||||
|
result = testdir.runpytest()
|
||||||
|
result.stdout.fnmatch_lines(['*1 passed*'])
|
|
@ -527,6 +527,29 @@ def test_toolongargs_issue224(testdir):
|
||||||
result = testdir.runpytest("-m", "hello" * 500)
|
result = testdir.runpytest("-m", "hello" * 500)
|
||||||
assert result.ret == EXIT_NOTESTSCOLLECTED
|
assert result.ret == EXIT_NOTESTSCOLLECTED
|
||||||
|
|
||||||
|
def test_config_in_subdirectory_colon_command_line_issue2148(testdir):
|
||||||
|
conftest_source = '''
|
||||||
|
def pytest_addoption(parser):
|
||||||
|
parser.addini('foo', 'foo')
|
||||||
|
'''
|
||||||
|
|
||||||
|
testdir.makefile('.ini', **{
|
||||||
|
'pytest': '[pytest]\nfoo = root',
|
||||||
|
'subdir/pytest': '[pytest]\nfoo = subdir',
|
||||||
|
})
|
||||||
|
|
||||||
|
testdir.makepyfile(**{
|
||||||
|
'conftest': conftest_source,
|
||||||
|
'subdir/conftest': conftest_source,
|
||||||
|
'subdir/test_foo': '''
|
||||||
|
def test_foo(pytestconfig):
|
||||||
|
assert pytestconfig.getini('foo') == 'subdir'
|
||||||
|
'''})
|
||||||
|
|
||||||
|
result = testdir.runpytest('subdir/test_foo.py::test_foo')
|
||||||
|
assert result.ret == 0
|
||||||
|
|
||||||
|
|
||||||
def test_notify_exception(testdir, capfd):
|
def test_notify_exception(testdir, capfd):
|
||||||
config = testdir.parseconfig()
|
config = testdir.parseconfig()
|
||||||
excinfo = pytest.raises(ValueError, "raise ValueError(1)")
|
excinfo = pytest.raises(ValueError, "raise ValueError(1)")
|
||||||
|
@ -732,6 +755,14 @@ class TestOverrideIniArgs:
|
||||||
"ini3:True",
|
"ini3:True",
|
||||||
"ini4:False"])
|
"ini4:False"])
|
||||||
|
|
||||||
|
def test_override_ini_usage_error_bad_style(self, testdir):
|
||||||
|
testdir.makeini("""
|
||||||
|
[pytest]
|
||||||
|
xdist_strict=False
|
||||||
|
""")
|
||||||
|
result = testdir.runpytest("--override-ini", 'xdist_strict True', "-s")
|
||||||
|
result.stderr.fnmatch_lines(["*ERROR* *expects option=value*"])
|
||||||
|
|
||||||
def test_with_arg_outside_cwd_without_inifile(self, tmpdir, monkeypatch):
|
def test_with_arg_outside_cwd_without_inifile(self, tmpdir, monkeypatch):
|
||||||
monkeypatch.chdir(str(tmpdir))
|
monkeypatch.chdir(str(tmpdir))
|
||||||
a = tmpdir.mkdir("a")
|
a = tmpdir.mkdir("a")
|
||||||
|
|
|
@ -423,3 +423,28 @@ def test_conftest_exception_handling(testdir):
|
||||||
res = testdir.runpytest()
|
res = testdir.runpytest()
|
||||||
assert res.ret == 4
|
assert res.ret == 4
|
||||||
assert 'raise ValueError()' in [line.strip() for line in res.errlines]
|
assert 'raise ValueError()' in [line.strip() for line in res.errlines]
|
||||||
|
|
||||||
|
|
||||||
|
def test_hook_proxy(testdir):
|
||||||
|
"""Session's gethookproxy() would cache conftests incorrectly (#2016).
|
||||||
|
It was decided to remove the cache altogether.
|
||||||
|
"""
|
||||||
|
testdir.makepyfile(**{
|
||||||
|
'root/demo-0/test_foo1.py': "def test1(): pass",
|
||||||
|
|
||||||
|
'root/demo-a/test_foo2.py': "def test1(): pass",
|
||||||
|
'root/demo-a/conftest.py': """
|
||||||
|
def pytest_ignore_collect(path, config):
|
||||||
|
return True
|
||||||
|
""",
|
||||||
|
|
||||||
|
'root/demo-b/test_foo3.py': "def test1(): pass",
|
||||||
|
'root/demo-c/test_foo4.py': "def test1(): pass",
|
||||||
|
})
|
||||||
|
result = testdir.runpytest()
|
||||||
|
result.stdout.fnmatch_lines([
|
||||||
|
'*test_foo1.py*',
|
||||||
|
'*test_foo3.py*',
|
||||||
|
'*test_foo4.py*',
|
||||||
|
'*3 passed*',
|
||||||
|
])
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
# encoding: utf-8
|
# encoding: utf-8
|
||||||
import sys
|
import sys
|
||||||
import _pytest._code
|
import _pytest._code
|
||||||
|
from _pytest.compat import MODULE_NOT_FOUND_ERROR
|
||||||
from _pytest.doctest import DoctestItem, DoctestModule, DoctestTextfile
|
from _pytest.doctest import DoctestItem, DoctestModule, DoctestTextfile
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
class TestDoctests:
|
class TestDoctests:
|
||||||
|
|
||||||
def test_collect_testtextfile(self, testdir):
|
def test_collect_testtextfile(self, testdir):
|
||||||
|
@ -238,8 +240,8 @@ class TestDoctests:
|
||||||
# doctest is never executed because of error during hello.py collection
|
# doctest is never executed because of error during hello.py collection
|
||||||
result.stdout.fnmatch_lines([
|
result.stdout.fnmatch_lines([
|
||||||
"*>>> import asdals*",
|
"*>>> import asdals*",
|
||||||
"*UNEXPECTED*ImportError*",
|
"*UNEXPECTED*{e}*".format(e=MODULE_NOT_FOUND_ERROR),
|
||||||
"ImportError: No module named *asdal*",
|
"{e}: No module named *asdal*".format(e=MODULE_NOT_FOUND_ERROR),
|
||||||
])
|
])
|
||||||
|
|
||||||
def test_doctest_unex_importerror_with_module(self, testdir):
|
def test_doctest_unex_importerror_with_module(self, testdir):
|
||||||
|
@ -254,7 +256,7 @@ class TestDoctests:
|
||||||
# doctest is never executed because of error during hello.py collection
|
# doctest is never executed because of error during hello.py collection
|
||||||
result.stdout.fnmatch_lines([
|
result.stdout.fnmatch_lines([
|
||||||
"*ERROR collecting hello.py*",
|
"*ERROR collecting hello.py*",
|
||||||
"*ImportError: No module named *asdals*",
|
"*{e}: No module named *asdals*".format(e=MODULE_NOT_FOUND_ERROR),
|
||||||
"*Interrupted: 1 errors during collection*",
|
"*Interrupted: 1 errors during collection*",
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
|
@ -715,6 +715,10 @@ def test_logxml_makedir(testdir):
|
||||||
assert result.ret == 0
|
assert result.ret == 0
|
||||||
assert testdir.tmpdir.join("path/to/results.xml").check()
|
assert testdir.tmpdir.join("path/to/results.xml").check()
|
||||||
|
|
||||||
|
def test_logxml_check_isdir(testdir):
|
||||||
|
"""Give an error if --junit-xml is a directory (#2089)"""
|
||||||
|
result = testdir.runpytest("--junit-xml=.")
|
||||||
|
result.stderr.fnmatch_lines(["*--junitxml must be a filename*"])
|
||||||
|
|
||||||
def test_escaped_parametrized_names_xml(testdir):
|
def test_escaped_parametrized_names_xml(testdir):
|
||||||
testdir.makepyfile("""
|
testdir.makepyfile("""
|
||||||
|
|
|
@ -4,7 +4,8 @@ import py
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from _pytest.config import get_config, PytestPluginManager
|
from _pytest.config import get_config, PytestPluginManager
|
||||||
from _pytest.main import EXIT_NOTESTSCOLLECTED
|
from _pytest.main import EXIT_NOTESTSCOLLECTED, Session
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def pytestpm():
|
def pytestpm():
|
||||||
|
@ -133,6 +134,25 @@ class TestPytestPluginInteractions:
|
||||||
finally:
|
finally:
|
||||||
undo()
|
undo()
|
||||||
|
|
||||||
|
def test_hook_proxy(self, testdir):
|
||||||
|
"""Test the gethookproxy function(#2016)"""
|
||||||
|
config = testdir.parseconfig()
|
||||||
|
session = Session(config)
|
||||||
|
testdir.makepyfile(**{
|
||||||
|
'tests/conftest.py': '',
|
||||||
|
'tests/subdir/conftest.py': '',
|
||||||
|
})
|
||||||
|
|
||||||
|
conftest1 = testdir.tmpdir.join('tests/conftest.py')
|
||||||
|
conftest2 = testdir.tmpdir.join('tests/subdir/conftest.py')
|
||||||
|
|
||||||
|
config.pluginmanager._importconftest(conftest1)
|
||||||
|
ihook_a = session.gethookproxy(testdir.tmpdir.join('tests'))
|
||||||
|
assert ihook_a is not None
|
||||||
|
config.pluginmanager._importconftest(conftest2)
|
||||||
|
ihook_b = session.gethookproxy(testdir.tmpdir.join('tests'))
|
||||||
|
assert ihook_a is not ihook_b
|
||||||
|
|
||||||
def test_warn_on_deprecated_multicall(self, pytestpm):
|
def test_warn_on_deprecated_multicall(self, pytestpm):
|
||||||
warnings = []
|
warnings = []
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import warnings
|
import warnings
|
||||||
|
import re
|
||||||
import py
|
import py
|
||||||
import pytest
|
import pytest
|
||||||
from _pytest.recwarn import WarningsRecorder
|
from _pytest.recwarn import WarningsRecorder
|
||||||
|
@ -114,7 +115,7 @@ class TestDeprecatedCall(object):
|
||||||
with pytest.raises(pytest.fail.Exception) as ex:
|
with pytest.raises(pytest.fail.Exception) as ex:
|
||||||
with pytest.deprecated_call():
|
with pytest.deprecated_call():
|
||||||
self.dep(1)
|
self.dep(1)
|
||||||
assert str(ex.value) == "DID NOT WARN"
|
assert str(ex.value).startswith("DID NOT WARN")
|
||||||
|
|
||||||
def test_deprecated_call_as_context_manager(self):
|
def test_deprecated_call_as_context_manager(self):
|
||||||
with pytest.deprecated_call():
|
with pytest.deprecated_call():
|
||||||
|
@ -185,16 +186,38 @@ class TestWarns(object):
|
||||||
with pytest.warns(RuntimeWarning):
|
with pytest.warns(RuntimeWarning):
|
||||||
warnings.warn("runtime", RuntimeWarning)
|
warnings.warn("runtime", RuntimeWarning)
|
||||||
|
|
||||||
with pytest.raises(pytest.fail.Exception):
|
with pytest.warns(UserWarning):
|
||||||
|
warnings.warn("user", UserWarning)
|
||||||
|
|
||||||
|
with pytest.raises(pytest.fail.Exception) as excinfo:
|
||||||
with pytest.warns(RuntimeWarning):
|
with pytest.warns(RuntimeWarning):
|
||||||
warnings.warn("user", UserWarning)
|
warnings.warn("user", UserWarning)
|
||||||
|
excinfo.match(r"DID NOT WARN. No warnings of type \(.+RuntimeWarning.+,\) was emitted. "
|
||||||
|
r"The list of emitted warnings is: \[UserWarning\('user',\)\].")
|
||||||
|
|
||||||
with pytest.raises(pytest.fail.Exception):
|
with pytest.raises(pytest.fail.Exception) as excinfo:
|
||||||
with pytest.warns(UserWarning):
|
with pytest.warns(UserWarning):
|
||||||
warnings.warn("runtime", RuntimeWarning)
|
warnings.warn("runtime", RuntimeWarning)
|
||||||
|
excinfo.match(r"DID NOT WARN. No warnings of type \(.+UserWarning.+,\) was emitted. "
|
||||||
|
r"The list of emitted warnings is: \[RuntimeWarning\('runtime',\)\].")
|
||||||
|
|
||||||
|
with pytest.raises(pytest.fail.Exception) as excinfo:
|
||||||
with pytest.warns(UserWarning):
|
with pytest.warns(UserWarning):
|
||||||
warnings.warn("user", UserWarning)
|
pass
|
||||||
|
excinfo.match(r"DID NOT WARN. No warnings of type \(.+UserWarning.+,\) was emitted. "
|
||||||
|
r"The list of emitted warnings is: \[\].")
|
||||||
|
|
||||||
|
warning_classes = (UserWarning, FutureWarning)
|
||||||
|
with pytest.raises(pytest.fail.Exception) as excinfo:
|
||||||
|
with pytest.warns(warning_classes) as warninfo:
|
||||||
|
warnings.warn("runtime", RuntimeWarning)
|
||||||
|
warnings.warn("import", ImportWarning)
|
||||||
|
|
||||||
|
message_template = ("DID NOT WARN. No warnings of type {0} was emitted. "
|
||||||
|
"The list of emitted warnings is: {1}.")
|
||||||
|
excinfo.match(re.escape(message_template.format(warning_classes,
|
||||||
|
[each.message for each in warninfo])))
|
||||||
|
|
||||||
|
|
||||||
def test_record(self):
|
def test_record(self):
|
||||||
with pytest.warns(UserWarning) as record:
|
with pytest.warns(UserWarning) as record:
|
||||||
|
|
Loading…
Reference in New Issue