pytest 5.4.0 (2020-03-12)
Breaking Changes
-
#6316: Matching of
-k EXPRESSION
to test names is now case-insensitive. -
#6443: Plugins specified with
-p
are now loaded after internal plugins, which results in their hooks being called before the internal ones.This makes the
-p
behavior consistent withPYTEST_PLUGINS
. -
#6637: Removed the long-deprecated
pytest_itemstart
hook.This hook has been marked as deprecated and not been even called by pytest for over 10 years now.
-
#6673: Reversed / fix meaning of "+/-" in error diffs. "-" means that sth. expected is missing in the result and "+" means that there are unexpected extras in the result.
-
#6737: The
cached_result
attribute ofFixtureDef
is now set toNone
when
the result is unavailable, instead of being deleted.If your plugin performs checks like
hasattr(fixturedef, 'cached_result')
,
for example in apytest_fixture_post_finalizer
hook implementation, replace
it withfixturedef.cached_result is not None
. If youdel
the attribute,
set it toNone
instead.
Deprecations
-
#3238: Option
--no-print-logs
is deprecated and meant to be removed in a future release. If you use--no-print-logs
, please try out--show-capture
and
provide feedback.--show-capture
command-line option was added inpytest 3.5.0
and allows to specify how to
display captured output when tests fail:no
,stdout
,stderr
,log
orall
(the default). -
#571: Deprecate the unused/broken [pytest_collect_directory]{.title-ref} hook.
It was misaligned since the removal of theDirectory
collector in 2010
and incorrect/unusable as soon as collection was split from test execution. -
#5975: Deprecate using direct constructors for
Nodes
.Instead they are new constructed via
Node.from_parent
.This transitional mechanism enables us to detangle the very intensely
entangledNode
relationships by enforcing more controlled creation/configruation patterns.As part of that session/config are already disallowed parameters and as we work on the details we might need disallow a few more as well.
Subclasses are expected to use [super().from_parent]{.title-ref} if they intend to expand the creation of [Nodes]{.title-ref}.
-
#6779: The
TerminalReporter.writer
attribute has been deprecated and should no longer be used. This
was inadvertently exposed as part of the public API of that plugin and ties it too much
withpy.io.TerminalWriter
.
Features
- #4597: New
--capture=tee-sys <capture-method>
{.interpreted-text role="ref"} option to allow both live printing and capturing of test output. - #5712: Now all arguments to
@pytest.mark.parametrize
need to be explicitly declared in the function signature or viaindirect
.
Previously it was possible to omit an argument if a fixture with the same name existed, which was just an accident of implementation and was not meant to be a part of the API. - #6454: Changed default for [-r]{.title-ref} to [fE]{.title-ref}, which displays failures and errors in the
short test summary <pytest.detailed_failed_tests_usage>
{.interpreted-text role="ref"}. [-rN]{.title-ref} can be used to disable it (the old behavior). - #6469: New options have been added to the
junit_logging
{.interpreted-text role="confval"} option:log
,out-err
, andall
. - #6834: Excess warning summaries are now collapsed per file to ensure readable display of warning summaries.
Improvements
-
#1857:
pytest.mark.parametrize
accepts integers forids
again, converting it to strings. -
#449: Use "yellow" main color with any XPASSED tests.
-
#4639: Revert "A warning is now issued when assertions are made for
None
".The warning proved to be less useful than initially expected and had quite a
few false positive cases. -
#5686:
tmpdir_factory.mktemp
now fails when given absolute and non-normalized paths. -
#5984: The
pytest_warning_captured
hook now receives alocation
parameter with the code location that generated the warning. -
#6213: pytester: the
testdir
fixture respects environment settings from themonkeypatch
fixture for inner runs. -
#6247:
--fulltrace
is honored with collection errors. -
#6384: Make [--showlocals]{.title-ref} work also with [--tb=short]{.title-ref}.
-
#6653: Add support for matching lines consecutively with
LineMatcher <_pytest.pytester.LineMatcher>
{.interpreted-text role="attr"}'s~_pytest.pytester.LineMatcher.fnmatch_lines
{.interpreted-text role="func"} and~_pytest.pytester.LineMatcher.re_match_lines
{.interpreted-text role="func"}. -
#6658: Code is now highlighted in tracebacks when
pygments
is installed.Users are encouraged to install
pygments
into their environment and provide feedback, because
the plan is to makepygments
a regular dependency in the future. -
#6795: Import usage error message with invalid [-o]{.title-ref} option.
-
#759:
pytest.mark.parametrize
supports iterators and generators forids
.
Bug Fixes
-
#310: Add support for calling [pytest.xfail()]{.title-ref} and [pytest.importorskip()]{.title-ref} with doctests.
-
#3823:
--trace
now works with unittests. -
#4445: Fixed some warning reports produced by pytest to point to the correct location of the warning in the user's code.
-
#5301: Fix
--last-failed
to collect new tests from files with known failures. -
#5928: Report
PytestUnknownMarkWarning
at the level of the user's code, notpytest
's. -
#5991: Fix interaction with
--pdb
and unittests: do not use unittest'sTestCase.debug()
. -
#6334: Fix summary entries appearing twice when
f/F
ands/S
report chars were used at the same time in the-r
command-line option (for example-rFf
).The upper case variants were never documented and the preferred form should be the lower case.
-
#6409: Fallback to green (instead of yellow) for non-last items without previous passes with colored terminal progress indicator.
-
#6454: [--disable-warnings]{.title-ref} is honored with [-ra]{.title-ref} and [-rA]{.title-ref}.
-
#6497: Fix bug in the comparison of request key with cached key in fixture.
A construct
if key == cached_key:
can fail either because==
is explicitly disallowed, or for, e.g., NumPy arrays, where the result ofa == b
cannot generally be converted to [bool]{.title-ref}.
The implemented fix replaces [==]{.title-ref} withis
. -
#6557: Make capture output streams
.write()
method return the same return value from original streams. -
#6566: Fix
EncodedFile.writelines
to call the underlying buffer'swritelines
method. -
#6575: Fix internal crash when
faulthandler
starts initialized
(for example withPYTHONFAULTHANDLER=1
environment variable set) andfaulthandler_timeout
defined
in the configuration file. -
#6597: Fix node ids which contain a parametrized empty-string variable.
-
#6646: Assertion rewriting hooks are (re)stored for the current item, which fixes them being still used after e.g. pytester's
testdir.runpytest <_pytest.pytester.Testdir.runpytest>
{.interpreted-text role="func"} etc. -
#6660:
pytest.exit() <_pytest.outcomes.exit>
{.interpreted-text role="func"} is handled when emitted from thepytest_sessionfinish <_pytest.hookspec.pytest_sessionfinish>
{.interpreted-text role="func"} hook. This includes quitting from a debugger. -
#6752: When :py
pytest.raises
{.interpreted-text role="func"} is used as a function (as opposed to a context manager),
a [match]{.title-ref} keyword argument is now passed through to the tested function. Previously
it was swallowed and ignored (regression in pytest 5.1.0). -
#6801: Do not display empty lines inbetween traceback for unexpected exceptions with doctests.
-
#6802: The
testdir fixture <testdir>
{.interpreted-text role="fixture"} works within doctests now.
Improved Documentation
- #6696: Add list of fixtures to start of fixture chapter.
- #6742: Expand first sentence on fixtures into a paragraph.
Trivial/Internal Changes
- #6404: Remove usage of
parser
module, deprecated in Python 3.9.