==================
**Incompatible changes**
A number of incompatible changes were made in this release, with the intent of removing features deprecated for a long
time or change existing behaviors in order to make them less surprising/more useful.
* Reinterpretation mode has now been removed. Only plain and rewrite
mode are available, consequently the ``--assert=reinterp`` option is
no longer available. This also means files imported from plugins or
``conftest.py`` will not benefit from improved assertions by
default, you should use ``pytest.register_assert_rewrite()`` to
explicitly turn on assertion rewriting for those files. Thanks
`flub`_ for the PR.
* The following deprecated commandline options were removed:
* ``--genscript``: no longer supported;
* ``--no-assert``: use ``--assert=plain`` instead;
* ``--nomagic``: use ``--assert=plain`` instead;
* ``--report``: use ``-r`` instead;
Thanks to `RedBeardCode`_ for the PR (`1664`_).
* ImportErrors in plugins now are a fatal error instead of issuing a
pytest warning (`1479`_). Thanks to `The-Compiler`_ for the PR.
* Removed support code for Python 3 versions < 3.3 (`1627`_).
* Removed all ``py.test-X*`` entry points. The versioned, suffixed entry points
were never documented and a leftover from a pre-virtualenv era. These entry
points also created broken entry points in wheels, so removing them also
removes a source of confusion for users (`1632`_).
Thanks `obestwalter`_ for the PR.
* ``pytest.skip()`` now raises an error when used to decorate a test function,
as opposed to its original intent (to imperatively skip a test inside a test function). Previously
this usage would cause the entire module to be skipped (`607`_).
Thanks `omarkohl`_ for the complete PR (`1519`_).
* Exit tests if a collection error occurs. A poll indicated most users will hit CTRL-C
anyway as soon as they see collection errors, so pytest might as well make that the default behavior (`1421`_).
A ``--continue-on-collection-errors`` option has been added to restore the previous behaviour.
Thanks `olegpidsadnyi`_ and `omarkohl`_ for the complete PR (`1628`_).
* Renamed the pytest ``pdb`` module (plugin) into ``debugging`` to avoid clashes with the builtin ``pdb`` module.
* Raise a helpful failure message when requesting a parametrized fixture at runtime,
e.g. with ``request.getfixturevalue``. Previously these parameters were simply
never defined, so a fixture decorated like ``pytest.fixture(params=[0, 1, 2])``
only ran once (`460`_).
Thanks to `nikratio`_ for the bug report, `RedBeardCode`_ and `tomviner`_ for the PR.
* ``_pytest.monkeypatch.monkeypatch`` class has been renamed to ``_pytest.monkeypatch.MonkeyPatch``
so it doesn't conflict with the ``monkeypatch`` fixture.
* ``--exitfirst / -x`` can now be overridden by a following ``--maxfail=N``
and is just a synonym for ``--maxfail=1``.
**New Features**
* Support nose-style ``__test__`` attribute on methods of classes,
including unittest-style Classes. If set to ``False``, the test will not be
collected.
* New ``doctest_namespace`` fixture for injecting names into the
namespace in which doctests run.
Thanks `milliams`_ for the complete PR (`1428`_).
* New ``--doctest-report`` option available to change the output format of diffs
when running (failing) doctests (implements `1749`_).
Thanks `hartym`_ for the PR.
* New ``name`` argument to ``pytest.fixture`` decorator which allows a custom name
for a fixture (to solve the funcarg-shadowing-fixture problem).
Thanks `novas0x2a`_ for the complete PR (`1444`_).
* New ``approx()`` function for easily comparing floating-point numbers in
tests.
Thanks `kalekundert`_ for the complete PR (`1441`_).
* Ability to add global properties in the final xunit output file by accessing
the internal ``junitxml`` plugin (experimental).
Thanks `tareqalayan`_ for the complete PR `1454`_).
* New ``ExceptionInfo.match()`` method to match a regular expression on the
string representation of an exception (`372`_).
Thanks `omarkohl`_ for the complete PR (`1502`_).
* ``__tracebackhide__`` can now also be set to a callable which then can decide
whether to filter the traceback based on the ``ExceptionInfo`` object passed
to it. Thanks `The-Compiler`_ for the complete PR (`1526`_).
* New ``pytest_make_parametrize_id(config, val)`` hook which can be used by plugins to provide
friendly strings for custom types.
Thanks `palaviv`_ for the PR.
* ``capsys`` and ``capfd`` now have a ``disabled()`` context-manager method, which
can be used to temporarily disable capture within a test.
Thanks `nicoddemus`_ for the PR.
* New cli flag ``--fixtures-per-test``: shows which fixtures are being used
for each selected test item. Features doc strings of fixtures by default.
Can also show where fixtures are defined if combined with ``-v``.
Thanks `hackebrot`_ for the PR.
* Introduce ``pytest`` command as recommended entry point. Note that ``py.test``
still works and is not scheduled for removal. Closes proposal
`1629`_. Thanks `obestwalter`_ and `davehunt`_ for the complete PR
(`1633`_).
* New cli flags:
+ ``--setup-plan``: performs normal collection and reports
the potential setup and teardown and does not execute any fixtures and tests;
+ ``--setup-only``: performs normal collection, executes setup and teardown of
fixtures and reports them;
+ ``--setup-show``: performs normal test execution and additionally shows
setup and teardown of fixtures;
+ ``--keep-duplicates``: py.test now ignores duplicated paths given in the command
line. To retain the previous behavior where the same test could be run multiple
times by specifying it in the command-line multiple times, pass the ``--keep-duplicates``
argument (`1609`_);
Thanks `d6e`_, `kvas-it`_, `sallner`_, `ioggstream`_ and `omarkohl`_ for the PRs.
* New CLI flag ``--override-ini``/``-o``: overrides values from the ini file.
For example: ``"-o xfail_strict=True"``'.
Thanks `blueyed`_ and `fengxx`_ for the PR.
* New hooks:
+ ``pytest_fixture_setup(fixturedef, request)``: executes fixture setup;
+ ``pytest_fixture_post_finalizer(fixturedef)``: called after the fixture's
finalizer and has access to the fixture's result cache.
Thanks `d6e`_, `sallner`_.
* Issue warnings for asserts whose test is a tuple literal. Such asserts will
never fail because tuples are always truthy and are usually a mistake
(see `1562`_). Thanks `kvas-it`_, for the PR.
* Allow passing a custom debugger class (e.g. ``--pdbcls=IPython.core.debugger:Pdb``).
Thanks to `anntzer`_ for the PR.
**Changes**
* Plugins now benefit from assertion rewriting. Thanks
`sober7`_, `nicoddemus`_ and `flub`_ for the PR.
* Change ``report.outcome`` for ``xpassed`` tests to ``"passed"`` in non-strict
mode and ``"failed"`` in strict mode. Thanks to `hackebrot`_ for the PR
(`1795`_) and `gprasad84`_ for report (`1546`_).
* Tests marked with ``xfail(strict=False)`` (the default) now appear in
JUnitXML reports as passing tests instead of skipped.
Thanks to `hackebrot`_ for the PR (`1795`_).
* Highlight path of the file location in the error report to make it easier to copy/paste.
Thanks `suzaku`_ for the PR (`1778`_).
* Fixtures marked with ``pytest.fixture`` can now use ``yield`` statements exactly like
those marked with the ``pytest.yield_fixture`` decorator. This change renders
``pytest.yield_fixture`` deprecated and makes ``pytest.fixture`` with ``yield`` statements
the preferred way to write teardown code (`1461`_).
Thanks `csaftoiu`_ for bringing this to attention and `nicoddemus`_ for the PR.
* Explicitly passed parametrize ids do not get escaped to ascii (`1351`_).
Thanks `ceridwen`_ for the PR.
* Fixtures are now sorted in the error message displayed when an unknown
fixture is declared in a test function.
Thanks `nicoddemus`_ for the PR.
* ``pytest_terminal_summary`` hook now receives the ``exitstatus``
of the test session as argument. Thanks `blueyed`_ for the PR (`1809`_).
* Parametrize ids can accept ``None`` as specific test id, in which case the
automatically generated id for that argument will be used.
Thanks `palaviv`_ for the complete PR (`1468`_).
* The parameter to xunit-style setup/teardown methods (``setup_method``,
``setup_module``, etc.) is now optional and may be omitted.
Thanks `okken`_ for bringing this to attention and `nicoddemus`_ for the PR.
* Improved automatic id generation selection in case of duplicate ids in
parametrize.
Thanks `palaviv`_ for the complete PR (`1474`_).
* Now pytest warnings summary is shown up by default. Added a new flag
``--disable-pytest-warnings`` to explicitly disable the warnings summary (`1668`_).
* Make ImportError during collection more explicit by reminding
the user to check the name of the test module/package(s) (`1426`_).
Thanks `omarkohl`_ for the complete PR (`1520`_).
* Add ``build/`` and ``dist/`` to the default ``--norecursedirs`` list. Thanks
`mikofski`_ for the report and `tomviner`_ for the PR (`1544`_).
* ``pytest.raises`` in the context manager form accepts a custom
``message`` to raise when no exception occurred.
Thanks `palaviv`_ for the complete PR (`1616`_).
* ``conftest.py`` files now benefit from assertion rewriting; previously it
was only available for test modules. Thanks `flub`_, `sober7`_ and
`nicoddemus`_ for the PR (`1619`_).
* Text documents without any doctests no longer appear as "skipped".
Thanks `graingert`_ for reporting and providing a full PR (`1580`_).
* Ensure that a module within a namespace package can be found when it
is specified on the command line together with the ``--pyargs``
option. Thanks to `taschini`_ for the PR (`1597`_).
* Always include full assertion explanation during assertion rewriting. The previous behaviour was hiding
sub-expressions that happened to be ``False``, assuming this was redundant information.
Thanks `bagerard`_ for reporting (`1503`_). Thanks to `davehunt`_ and
`tomviner`_ for the PR.
* ``OptionGroup.addoption()`` now checks if option names were already
added before, to make it easier to track down issues like `1618`_.
Before, you only got exceptions later from ``argparse`` library,
giving no clue about the actual reason for double-added options.
* ``yield``-based tests are considered deprecated and will be removed in pytest-4.0.
Thanks `nicoddemus`_ for the PR.
* ``[pytest]`` sections in ``setup.cfg`` files should now be named ``[tool:pytest]``
to avoid conflicts with other distutils commands (see `567`_). ``[pytest]`` sections in
``pytest.ini`` or ``tox.ini`` files are supported and unchanged.
Thanks `nicoddemus`_ for the PR.
* Using ``pytest_funcarg__`` prefix to declare fixtures is considered deprecated and will be
removed in pytest-4.0 (`1684`_).
Thanks `nicoddemus`_ for the PR.
* Passing a command-line string to ``pytest.main()`` is considered deprecated and scheduled
for removal in pytest-4.0. It is recommended to pass a list of arguments instead (`1723`_).
* Rename ``getfuncargvalue`` to ``getfixturevalue``. ``getfuncargvalue`` is
still present but is now considered deprecated. Thanks to `RedBeardCode`_ and `tomviner`_
for the PR (`1626`_).
* ``optparse`` type usage now triggers DeprecationWarnings (`1740`_).
* ``optparse`` backward compatibility supports float/complex types (`457`_).
* Refined logic for determining the ``rootdir``, considering only valid
paths which fixes a number of issues: `1594`_, `1435`_ and `1471`_.
Updated the documentation according to current behavior. Thanks to
`blueyed`_, `davehunt`_ and `matthiasha`_ for the PR.
* Always include full assertion explanation. The previous behaviour was hiding
sub-expressions that happened to be False, assuming this was redundant information.
Thanks `bagerard`_ for reporting (`1503`_). Thanks to `davehunt`_ and
`tomviner`_ for PR.
* Better message in case of not using parametrized variable (see `1539`_).
Thanks to `tramwaj29`_ for the PR.
* Updated docstrings with a more uniform style.
* Add stderr write for ``pytest.exit(msg)`` during startup. Previously the message was never shown.
Thanks `BeyondEvil`_ for reporting `1210`_. Thanks to `JonathonSonesen`_ and
`tomviner`_ for the PR.
* No longer display the incorrect test deselection reason (`1372`_).
Thanks `ronnypfannschmidt`_ for the PR.
* The ``--resultlog`` command line option has been deprecated: it is little used
and there are more modern and better alternatives (see `830`_).
Thanks `nicoddemus`_ for the PR.
* Improve error message with fixture lookup errors: add an 'E' to the first
line and '>' to the rest. Fixes `717`_. Thanks `blueyed`_ for reporting and
a PR, `eolo999`_ for the initial PR and `tomviner`_ for his guidance during
EuroPython2016 sprint.
**Bug Fixes**
* Parametrize now correctly handles duplicated test ids.
* Fix internal error issue when the ``method`` argument is missing for
``teardown_method()`` (`1605`_).
* Fix exception visualization in case the current working directory (CWD) gets
deleted during testing (`1235`_). Thanks `bukzor`_ for reporting. PR by
`marscher`_.
* Improve test output for logical expression with brackets (`925`_).
Thanks `DRMacIver`_ for reporting and `RedBeardCode`_ for the PR.
* Create correct diff for strings ending with newlines (`1553`_).
Thanks `Vogtinator`_ for reporting and `RedBeardCode`_ and
`tomviner`_ for the PR.
* ``ConftestImportFailure`` now shows the traceback making it easier to
identify bugs in ``conftest.py`` files (`1516`_). Thanks `txomon`_ for
the PR.
* Text documents without any doctests no longer appear as "skipped".
Thanks `graingert`_ for reporting and providing a full PR (`1580`_).
* Fixed collection of classes with custom ``__new__`` method.
Fixes `1579`_. Thanks to `Stranger6667`_ for the PR.
* Fixed scope overriding inside metafunc.parametrize (`634`_).
Thanks to `Stranger6667`_ for the PR.
* Fixed the total tests tally in junit xml output (`1798`_).
Thanks to `cryporchild`_ for the PR.
* Fixed off-by-one error with lines from ``request.node.warn``.
Thanks to `blueyed`_ for the PR.
.. _1210: https://github.com/pytest-dev/pytest/issues/1210
.. _1235: https://github.com/pytest-dev/pytest/issues/1235
.. _1351: https://github.com/pytest-dev/pytest/issues/1351
.. _1372: https://github.com/pytest-dev/pytest/issues/1372
.. _1421: https://github.com/pytest-dev/pytest/issues/1421
.. _1426: https://github.com/pytest-dev/pytest/issues/1426
.. _1428: https://github.com/pytest-dev/pytest/pull/1428
.. _1435: https://github.com/pytest-dev/pytest/issues/1435
.. _1441: https://github.com/pytest-dev/pytest/pull/1441
.. _1444: https://github.com/pytest-dev/pytest/pull/1444
.. _1454: https://github.com/pytest-dev/pytest/pull/1454
.. _1461: https://github.com/pytest-dev/pytest/pull/1461
.. _1468: https://github.com/pytest-dev/pytest/pull/1468
.. _1471: https://github.com/pytest-dev/pytest/issues/1471
.. _1474: https://github.com/pytest-dev/pytest/pull/1474
.. _1479: https://github.com/pytest-dev/pytest/issues/1479
.. _1502: https://github.com/pytest-dev/pytest/pull/1502
.. _1503: https://github.com/pytest-dev/pytest/issues/1503
.. _1516: https://github.com/pytest-dev/pytest/pull/1516
.. _1519: https://github.com/pytest-dev/pytest/pull/1519
.. _1520: https://github.com/pytest-dev/pytest/pull/1520
.. _1526: https://github.com/pytest-dev/pytest/pull/1526
.. _1539: https://github.com/pytest-dev/pytest/issues/1539
.. _1544: https://github.com/pytest-dev/pytest/issues/1544
.. _1546: https://github.com/pytest-dev/pytest/issues/1546
.. _1553: https://github.com/pytest-dev/pytest/issues/1553
.. _1562: https://github.com/pytest-dev/pytest/issues/1562
.. _1579: https://github.com/pytest-dev/pytest/issues/1579
.. _1580: https://github.com/pytest-dev/pytest/pull/1580
.. _1594: https://github.com/pytest-dev/pytest/issues/1594
.. _1597: https://github.com/pytest-dev/pytest/pull/1597
.. _1605: https://github.com/pytest-dev/pytest/issues/1605
.. _1616: https://github.com/pytest-dev/pytest/pull/1616
.. _1618: https://github.com/pytest-dev/pytest/issues/1618
.. _1619: https://github.com/pytest-dev/pytest/issues/1619
.. _1626: https://github.com/pytest-dev/pytest/pull/1626
.. _1627: https://github.com/pytest-dev/pytest/pull/1627
.. _1628: https://github.com/pytest-dev/pytest/pull/1628
.. _1629: https://github.com/pytest-dev/pytest/issues/1629
.. _1632: https://github.com/pytest-dev/pytest/issues/1632
.. _1633: https://github.com/pytest-dev/pytest/pull/1633
.. _1664: https://github.com/pytest-dev/pytest/pull/1664
.. _1668: https://github.com/pytest-dev/pytest/issues/1668
.. _1684: https://github.com/pytest-dev/pytest/pull/1684
.. _1723: https://github.com/pytest-dev/pytest/pull/1723
.. _1740: https://github.com/pytest-dev/pytest/issues/1740
.. _1749: https://github.com/pytest-dev/pytest/issues/1749
.. _1778: https://github.com/pytest-dev/pytest/pull/1778
.. _1795: https://github.com/pytest-dev/pytest/pull/1795
.. _1798: https://github.com/pytest-dev/pytest/pull/1798
.. _1809: https://github.com/pytest-dev/pytest/pull/1809
.. _372: https://github.com/pytest-dev/pytest/issues/372
.. _457: https://github.com/pytest-dev/pytest/issues/457
.. _460: https://github.com/pytest-dev/pytest/pull/460
.. _567: https://github.com/pytest-dev/pytest/pull/567
.. _607: https://github.com/pytest-dev/pytest/issues/607
.. _634: https://github.com/pytest-dev/pytest/issues/634
.. _717: https://github.com/pytest-dev/pytest/issues/717
.. _830: https://github.com/pytest-dev/pytest/issues/830
.. _925: https://github.com/pytest-dev/pytest/issues/925
.. _anntzer: https://github.com/anntzer
.. _bagerard: https://github.com/bagerard
.. _BeyondEvil: https://github.com/BeyondEvil
.. _blueyed: https://github.com/blueyed
.. _ceridwen: https://github.com/ceridwen
.. _cryporchild: https://github.com/cryporchild
.. _csaftoiu: https://github.com/csaftoiu
.. _d6e: https://github.com/d6e
.. _davehunt: https://github.com/davehunt
.. _DRMacIver: https://github.com/DRMacIver
.. _eolo999: https://github.com/eolo999
.. _fengxx: https://github.com/fengxx
.. _flub: https://github.com/flub
.. _gprasad84: https://github.com/gprasad84
.. _graingert: https://github.com/graingert
.. _hartym: https://github.com/hartym
.. _JonathonSonesen: https://github.com/JonathonSonesen
.. _kalekundert: https://github.com/kalekundert
.. _kvas-it: https://github.com/kvas-it
.. _marscher: https://github.com/marscher
.. _mikofski: https://github.com/mikofski
.. _milliams: https://github.com/milliams
.. _nikratio: https://github.com/nikratio
.. _novas0x2a: https://github.com/novas0x2a
.. _obestwalter: https://github.com/obestwalter
.. _okken: https://github.com/okken
.. _olegpidsadnyi: https://github.com/olegpidsadnyi
.. _omarkohl: https://github.com/omarkohl
.. _palaviv: https://github.com/palaviv
.. _RedBeardCode: https://github.com/RedBeardCode
.. _sallner: https://github.com/sallner
.. _sober7: https://github.com/sober7
.. _Stranger6667: https://github.com/Stranger6667
.. _suzaku: https://github.com/suzaku
.. _tareqalayan: https://github.com/tareqalayan
.. _taschini: https://github.com/taschini
.. _tramwaj29: https://github.com/tramwaj29
.. _txomon: https://github.com/txomon
.. _Vogtinator: https://github.com/Vogtinator
.. _matthiasha: https://github.com/matthiasha