Changelog

Versions follow Semantic Versioning (<major>.<minor>.<patch>).

Backward incompatible (breaking) changes will only be introduced in major versions with advance notice in the Deprecations section of releases.

Changelog draft for the next release

pytest 0.1.dev54+gd283425 (2020-03-09)

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 with PYTEST_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 of FixtureDef is now set to None when the result is unavailable, instead of being deleted.

    If your plugin performs checks like hasattr(fixturedef, 'cached_result'), for example in a pytest_fixture_post_finalizer hook implementation, replace it with fixturedef.cached_result is not None. If you del the attribute, set it to None 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 in pytest 3.5.0 and allows to specify how to display captured output when tests fail: no, stdout, stderr, log or all (the default).

  • #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 entangled Node 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 if they intend to expand the creation of Nodes.

Features

  • #4597: New –capture=tee-sys 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 via indirect. 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 to fE, which displays failures and errors in the short test summary. -rN can be used to disable it (the old behavior).

  • #6469: New options have been added to the junit_logging option: log, out-err, and all.

Improvements

  • #1857: pytest.mark.parametrize accepts integers for ids 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.

  • #5283: Display full crash information in short test summaries on non-tty (e.g. CI).

  • #5686: tmpdir_factory.mktemp now fails when given absolute and non-normalized paths.

  • #5984: The pytest_warning_captured hook now receives a location parameter with the code location that generated the warning.

  • #6181: The reason for a stopped session, e.g. with --maxfail / -x, now gets reported in the test summary stats line.

  • #6213: pytester: the testdir fixture respects environment settings from the monkeypatch fixture for inner runs.

  • #6232: Display traceback / error location with errors from --strict-markers.

  • #6247: --fulltrace is honored with collection errors.

  • #6384: Make --showlocals work also with --tb=short.

  • #6653: Add support for matching lines consecutively with LineMatcher’s fnmatch_lines() and re_match_lines().

  • #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 make pygments a regular dependency in the future.

  • #6795: Import usage error message with invalid -o option.

  • #759: pytest.mark.parametrize supports iterators and generators for ids.

Bug Fixes

  • #310: Add support for calling pytest.xfail() and pytest.importorskip() 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.

  • #5228: Fix pdb.set_trace wrapper when used in child threads after main thread exited.

  • #5301: Fix --last-failed to collect new tests from files with known failures.

  • #5928: Report PytestUnknownMarkWarning at the level of the user’s code, not pytest’s.

  • #5991: Fix interaction with --pdb and unittests: do not use unittest’s TestCase.debug().

  • #6334: Fix summary entries appearing twice when f/F and s/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 is honored with -ra and -rA.

  • #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 of a == b cannot generally be converted to bool. The implemented fix replaces == with is.

  • #6557: Make capture output streams .write() method return the same return value from original streams.

  • #6566: Fix EncodedFile.writelines to call the underlying buffer’s writelines method.

  • #6575: Fix internal crash when faulthandler starts initialized (for example with PYTHONFAULTHANDLER=1 environment variable set) and faulthandler_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 etc.

  • #6660: pytest.exit() is handled when emitted from the pytest_sessionfinish hook. This includes quitting from a debugger.

  • #6701: Node ids for paths outside of the rootdir are generated properly, e.g. for pytest testing --rootdir=/tmp -vv.

  • #6752: When pytest.raises() is used as a function (as opposed to a context manager), a match 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.

Improved Documentation

Trivial/Internal Changes

  • #6404: Remove usage of parser module, deprecated in Python 3.9.


(end of changelog draft)

pytest 5.3.5 (2020-01-29)

Bug Fixes

  • #6517: Fix regression in pytest 5.3.4 causing an INTERNALERROR due to a wrong assertion.

pytest 5.3.4 (2020-01-20)

Bug Fixes

  • #6496: Revert #6436: unfortunately this change has caused a number of regressions in many suites, so the team decided to revert this change and make a new release while we continue to look for a solution.

pytest 5.3.3 (2020-01-16)

Bug Fixes

  • #2780: Captured output during teardown is shown with -rP.

  • #5971: Fix a pytest-xdist crash when dealing with exceptions raised in subprocesses created by the multiprocessing module.

  • #6436: FixtureDef objects now properly register their finalizers with autouse and parameterized fixtures that execute before them in the fixture stack so they are torn down at the right times, and in the right order.

  • #6532: Fix parsing of outcomes containing multiple errors with testdir results (regression in 5.3.0).

Trivial/Internal Changes

  • #6350: Optimized automatic renaming of test parameter IDs.

pytest 5.3.2 (2019-12-13)

Improvements

  • #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.

Bug Fixes

  • #5430: junitxml: Logs for failed test are now passed to junit report in case the test fails during call phase.

  • #6290: The supporting files in the .pytest_cache directory are kept with --cache-clear, which only clears cached values now.

  • #6301: Fix assertion rewriting for egg-based distributions and editable installs (pip install --editable).

pytest 5.3.1 (2019-11-25)

Improvements

Bug Fixes

pytest 5.3.0 (2019-11-19)

Deprecations

  • #6179: The default value of junit_family option will change to "xunit2" in pytest 6.0, given that this is the version supported by default in modern tools that manipulate this type of file.

    In order to smooth the transition, pytest will issue a warning in case the --junitxml option is given in the command line but junit_family is not explicitly configured in pytest.ini.

    For more information, see the docs.

Features

  • #4488: The pytest team has created the pytest-reportlog plugin, which provides a new --report-log=FILE option that writes report logs into a file as the test session executes.

    Each line of the report log contains a self contained JSON object corresponding to a testing event, such as a collection or a test result report. The file is guaranteed to be flushed after writing each line, so systems can read and process events in real-time.

    The plugin is meant to replace the --resultlog option, which is deprecated and meant to be removed in a future release. If you use --resultlog, please try out pytest-reportlog and provide feedback.

  • #4730: When sys.pycache_prefix (Python 3.8+) is set, it will be used by pytest to cache test files changed by the assertion rewriting mechanism.

    This makes it easier to benefit of cached .pyc files even on file systems without permissions.

  • #5515: Allow selective auto-indentation of multiline log messages.

    Adds command line option --log-auto-indent, config option log_auto_indent and support for per-entry configuration of indentation behavior on calls to logging.log().

    Alters the default for auto-indention from "on" to "off". This restores the older behavior that existed prior to v4.6.0. This reversion to earlier behavior was done because it is better to activate new features that may lead to broken tests explicitly rather than implicitly.

  • #5914: testdir learned two new functions, no_fnmatch_line() and no_re_match_line().

    The functions are used to ensure the captured text does not match the given pattern.

    The previous idiom was to use re.match():

    result = testdir.runpytest()
    assert re.match(pat, result.stdout.str()) is None
    

    Or the in operator:

    result = testdir.runpytest()
    assert text in result.stdout.str()
    

    But the new functions produce best output on failure.

  • #6057: Added tolerances to complex values when printing pytest.approx.

    For example, repr(pytest.approx(3+4j)) returns (3+4j) ± 5e-06 ±180°. This is polar notation indicating a circle around the expected value, with a radius of 5e-06. For approx comparisons to return True, the actual value should fall within this circle.

  • #6061: Added the pluginmanager as an argument to pytest_addoption so that hooks can be invoked when setting up command line options. This is useful for having one plugin communicate things to another plugin, such as default values or which set of command line options to add.

Improvements

  • #5061: Use multiple colors with terminal summary statistics.

  • #5630: Quitting from debuggers is now properly handled in doctest items.

  • #5924: Improved verbose diff output with sequences.

    Before:

    E   AssertionError: assert ['version', '...version_info'] == ['version', '...version', ...]
    E     Right contains 3 more items, first extra item: ' '
    E     Full diff:
    E     - ['version', 'version_info', 'sys.version', 'sys.version_info']
    E     + ['version',
    E     +  'version_info',
    E     +  'sys.version',
    E     +  'sys.version_info',
    E     +  ' ',
    E     +  'sys.version',
    E     +  'sys.version_info']
    

    After:

    E   AssertionError: assert ['version', '...version_info'] == ['version', '...version', ...]
    E     Right contains 3 more items, first extra item: ' '
    E     Full diff:
    E       [
    E        'version',
    E        'version_info',
    E        'sys.version',
    E        'sys.version_info',
    E     +  ' ',
    E     +  'sys.version',
    E     +  'sys.version_info',
    E       ]
    
  • #5934: repr of ExceptionInfo objects has been improved to honor the __repr__ method of the underlying exception.

  • #5936: Display untruncated assertion message with -vv.

  • #5990: Fixed plurality mismatch in test summary (e.g. display “1 error” instead of “1 errors”).

  • #6008: Config.InvocationParams.args is now always a tuple to better convey that it should be immutable and avoid accidental modifications.

  • #6023: pytest.main returns a pytest.ExitCode instance now, except for when custom exit codes are used (where it returns int then still).

  • #6026: Align prefixes in output of pytester’s LineMatcher.

  • #6059: Collection errors are reported as errors (and not failures like before) in the terminal’s short test summary.

  • #6069: pytester.spawn does not skip/xfail tests on FreeBSD anymore unconditionally.

  • #6097: The “[…%]” indicator in the test summary is now colored according to the final (new) multi-colored line’s main color.

  • #6116: Added --co as a synonym to --collect-only.

  • #6148: atomicwrites is now only used on Windows, fixing a performance regression with assertion rewriting on Unix.

  • #6152: Now parametrization will use the __name__ attribute of any object for the id, if present. Previously it would only use __name__ for functions and classes.

  • #6176: Improved failure reporting with pytester’s Hookrecorder.assertoutcome.

  • #6181: The reason for a stopped session, e.g. with --maxfail / -x, now gets reported in the test summary.

  • #6206: Improved cache.set robustness and performance.

Bug Fixes

  • #2049: Fixed --setup-plan showing inaccurate information about fixture lifetimes.

  • #2548: Fixed line offset mismatch of skipped tests in terminal summary.

  • #6039: The PytestDoctestRunner is now properly invalidated when unconfiguring the doctest plugin.

    This is important when used with pytester’s runpytest_inprocess.

  • #6047: BaseExceptions are now handled in saferepr, which includes pytest.fail.Exception etc.

  • #6074: pytester: fixed order of arguments in rm_rf warning when cleaning up temporary directories, and do not emit warnings for errors with os.open.

  • #6189: Fixed result of getmodpath method.

Trivial/Internal Changes

  • #4901: RunResult from pytester now displays the mnemonic of the ret attribute when it is a valid pytest.ExitCode value.

pytest 5.2.4 (2019-11-15)

Bug Fixes

  • #6194: Fix incorrect discovery of non-test __init__.py files.

  • #6197: Revert “The first test in a package (__init__.py) marked with @pytest.mark.skip is now correctly skipped.”.

pytest 5.2.3 (2019-11-14)

Bug Fixes

  • #5830: The first test in a package (__init__.py) marked with @pytest.mark.skip is now correctly skipped.

  • #6099: Fix --trace when used with parametrized functions.

  • #6183: Using request as a parameter name in @pytest.mark.parametrize now produces a more user-friendly error.

pytest 5.2.2 (2019-10-24)

Bug Fixes

  • #5206: Fix --nf to not forget about known nodeids with partial test selection.

  • #5906: Fix crash with KeyboardInterrupt during --setup-show.

  • #5946: Fixed issue when parametrizing fixtures with numpy arrays (and possibly other sequence-like types).

  • #6044: Properly ignore FileNotFoundError exceptions when trying to remove old temporary directories, for instance when multiple processes try to remove the same directory (common with pytest-xdist for example).

pytest 5.2.1 (2019-10-06)

Bug Fixes

  • #5902: Fix warnings about deprecated cmp attribute in attrs>=19.2.

pytest 5.2.0 (2019-09-28)

Deprecations

  • #1682: Passing arguments to pytest.fixture() as positional arguments is deprecated - pass them as a keyword argument instead.

Features

  • #1682: The scope parameter of @pytest.fixture can now be a callable that receives the fixture name and the config object as keyword-only parameters. See the docs for more information.

  • #5764: New behavior of the --pastebin option: failures to connect to the pastebin server are reported, without failing the pytest run

Bug Fixes

  • #5806: Fix “lexer” being used when uploading to bpaste.net from --pastebin to “text”.

  • #5884: Fix --setup-only and --setup-show for custom pytest items.

Trivial/Internal Changes

  • #5056: The HelpFormatter uses py.io.get_terminal_width for better width detection.

pytest 5.1.3 (2019-09-18)

Bug Fixes

  • #5807: Fix pypy3.6 (nightly) on windows.

  • #5811: Handle --fulltrace correctly with pytest.raises.

  • #5819: Windows: Fix regression with conftest whose qualified name contains uppercase characters (introduced by #5792).

pytest 5.1.2 (2019-08-30)

Bug Fixes

  • #2270: Fixed self reference in function-scoped fixtures defined plugin classes: previously self would be a reference to a test class, not the plugin class.

  • #570: Fixed long standing issue where fixture scope was not respected when indirect fixtures were used during parametrization.

  • #5782: Fix decoding error when printing an error response from --pastebin.

  • #5786: Chained exceptions in test and collection reports are now correctly serialized, allowing plugins like pytest-xdist to display them properly.

  • #5792: Windows: Fix error that occurs in certain circumstances when loading conftest.py from a working directory that has casing other than the one stored in the filesystem (e.g., c:\test instead of C:\test).

pytest 5.1.1 (2019-08-20)

Bug Fixes

  • #5751: Fixed TypeError when importing pytest on Python 3.5.0 and 3.5.1.

pytest 5.1.0 (2019-08-15)

Removals

  • #5180: As per our policy, the following features have been deprecated in the 4.X series and are now removed:

    • Request.getfuncargvalue: use Request.getfixturevalue instead.

    • pytest.raises and pytest.warns no longer support strings as the second argument.

    • message parameter of pytest.raises.

    • pytest.raises, pytest.warns and ParameterSet.param now use native keyword-only syntax. This might change the exception message from previous versions, but they still raise TypeError on unknown keyword arguments as before.

    • pytest.config global variable.

    • tmpdir_factory.ensuretemp method.

    • pytest_logwarning hook.

    • RemovedInPytest4Warning warning type.

    • request is now a reserved name for fixtures.

    For more information consult Deprecations and Removals in the docs.

  • #5565: Removed unused support code for unittest2.

    The unittest2 backport module is no longer necessary since Python 3.3+, and the small amount of code in pytest to support it also doesn’t seem to be used: after removed, all tests still pass unchanged.

    Although our policy is to introduce a deprecation period before removing any features or support for third party libraries, because this code is apparently not used at all (even if unittest2 is used by a test suite executed by pytest), it was decided to remove it in this release.

    If you experience a regression because of this, please file an issue.

  • #5615: pytest.fail, pytest.xfail and pytest.skip no longer support bytes for the message argument.

    This was supported for Python 2 where it was tempting to use "message" instead of u"message".

    Python 3 code is unlikely to pass bytes to these functions. If you do, please decode it to an str beforehand.

Features

  • #5564: New Config.invocation_args attribute containing the unchanged arguments passed to pytest.main().

  • #5576: New NUMBER option for doctests to ignore irrelevant differences in floating-point numbers. Inspired by Sébastien Boisgérault’s numtest extension for doctest.

Improvements

  • #5471: JUnit XML now includes a timestamp and hostname in the testsuite tag.

  • #5707: Time taken to run the test suite now includes a human-readable representation when it takes over 60 seconds, for example:

    ===== 2 failed in 102.70s (0:01:42) =====
    

Bug Fixes

  • #4344: Fix RuntimeError/StopIteration when trying to collect package with “__init__.py” only.

  • #5115: Warnings issued during pytest_configure are explicitly not treated as errors, even if configured as such, because it otherwise completely breaks pytest.

  • #5477: The XML file produced by --junitxml now correctly contain a <testsuites> root element.

  • #5524: Fix issue where tmp_path and tmpdir would not remove directories containing files marked as read-only, which could lead to pytest crashing when executed a second time with the --basetemp option.

  • #5537: Replace importlib_metadata backport with importlib.metadata from the standard library on Python 3.8+.

  • #5578: Improve type checking for some exception-raising functions (pytest.xfail, pytest.skip, etc) so they provide better error messages when users meant to use marks (for example @pytest.xfail instead of @pytest.mark.xfail).

  • #5606: Fixed internal error when test functions were patched with objects that cannot be compared for truth values against others, like numpy arrays.

  • #5634: pytest.exit is now correctly handled in unittest cases. This makes unittest cases handle quit from pytest’s pdb correctly.

  • #5650: Improved output when parsing an ini configuration file fails.

  • #5701: Fix collection of staticmethod objects defined with functools.partial.

  • #5734: Skip async generator test functions, and update the warning message to refer to async def functions.

Improved Documentation

  • #5669: Add docstring for Testdir.copy_example.

Trivial/Internal Changes

  • #5095: XML files of the xunit2 family are now validated against the schema by pytest’s own test suite to avoid future regressions.

  • #5516: Cache node splitting function which can improve collection performance in very large test suites.

  • #5603: Simplified internal SafeRepr class and removed some dead code.

  • #5664: When invoking pytest’s own testsuite with PYTHONDONTWRITEBYTECODE=1, the test_xfail_handling test no longer fails.

  • #5684: Replace manual handling of OSError.errno in the codebase by new OSError subclasses (PermissionError, FileNotFoundError, etc.).

pytest 5.0.1 (2019-07-04)

Bug Fixes

  • #5479: Improve quoting in raises match failure message.

  • #5523: Fixed using multiple short options together in the command-line (for example -vs) in Python 3.8+.

  • #5547: --step-wise now handles xfail(strict=True) markers properly.

Improved Documentation

  • #5517: Improve “Declaring new hooks” section in chapter “Writing Plugins”

pytest 5.0.0 (2019-06-28)

Important

This release is a Python3.5+ only release.

For more details, see our Python 2.7 and 3.4 support plan.

Removals

  • #1149: Pytest no longer accepts prefixes of command-line arguments, for example typing pytest --doctest-mod inplace of --doctest-modules. This was previously allowed where the ArgumentParser thought it was unambiguous, but this could be incorrect due to delayed parsing of options for plugins. See for example issues #1149, #3413, and #4009.

  • #5402: PytestDeprecationWarning are now errors by default.

    Following our plan to remove deprecated features with as little disruption as possible, all warnings of type PytestDeprecationWarning now generate errors instead of warning messages.

    The affected features will be effectively removed in pytest 5.1, so please consult the Deprecations and Removals section in the docs for directions on how to update existing code.

    In the pytest 5.0.X series, it is possible to change the errors back into warnings as a stop gap measure by adding this to your pytest.ini file:

    [pytest]
    filterwarnings =
        ignore::pytest.PytestDeprecationWarning
    

    But this will stop working when pytest 5.1 is released.

    If you have concerns about the removal of a specific feature, please add a comment to #5402.

  • #5412: ExceptionInfo objects (returned by pytest.raises) now have the same str representation as repr, which avoids some confusion when users use print(e) to inspect the object.

    This means code like:

    with pytest.raises(SomeException) as e:
        ...
    assert "some message" in str(e)
    

    Needs to be changed to:

    with pytest.raises(SomeException) as e:
        ...
    assert "some message" in str(e.value)
    

Deprecations

  • #4488: The removal of the --result-log option and module has been postponed to (tentatively) pytest 6.0 as the team has not yet got around to implement a good alternative for it.

  • #466: The funcargnames attribute has been an alias for fixturenames since pytest 2.3, and is now deprecated in code too.

Features

  • #3457: New pytest_assertion_pass hook, called with context information when an assertion passes.

    This hook is still experimental so use it with caution.

  • #5440: The faulthandler standard library module is now enabled by default to help users diagnose crashes in C modules.

    This functionality was provided by integrating the external pytest-faulthandler plugin into the core, so users should remove that plugin from their requirements if used.

    For more information see the docs: https://docs.pytest.org/en/latest/usage.html#fault-handler

  • #5452: When warnings are configured as errors, pytest warnings now appear as originating from pytest. instead of the internal _pytest.warning_types. module.

  • #5125: Session.exitcode values are now coded in pytest.ExitCode, an IntEnum. This makes the exit code available for consumer code and are more explicit other than just documentation. User defined exit codes are still valid, but should be used with caution.

    The team doesn’t expect this change to break test suites or plugins in general, except in esoteric/specific scenarios.

    pytest-xdist users should upgrade to 1.29.0 or later, as pytest-xdist required a compatibility fix because of this change.

Bug Fixes

  • #1403: Switch from imp to importlib.

  • #1671: The name of the .pyc files cached by the assertion writer now includes the pytest version to avoid stale caches.

  • #2761: Honor PEP 235 on case-insensitive file systems.

  • #5078: Test module is no longer double-imported when using --pyargs.

  • #5260: Improved comparison of byte strings.

    When comparing bytes, the assertion message used to show the byte numeric value when showing the differences:

        def test():
    >       assert b'spam' == b'eggs'
    E       AssertionError: assert b'spam' == b'eggs'
    E         At index 0 diff: 115 != 101
    E         Use -v to get the full diff
    

    It now shows the actual ascii representation instead, which is often more useful:

        def test():
    >       assert b'spam' == b'eggs'
    E       AssertionError: assert b'spam' == b'eggs'
    E         At index 0 diff: b's' != b'e'
    E         Use -v to get the full diff
    
  • #5335: Colorize level names when the level in the logging format is formatted using ‘%(levelname).Xs’ (truncated fixed width alignment), where X is an integer.

  • #5354: Fix pytest.mark.parametrize when the argvalues is an iterator.

  • #5370: Revert unrolling of all() to fix NameError on nested comprehensions.

  • #5371: Revert unrolling of all() to fix incorrect handling of generators with if.

  • #5372: Revert unrolling of all() to fix incorrect assertion when using all() in an expression.

  • #5383: -q has again an impact on the style of the collected items (--collect-only) when --log-cli-level is used.

  • #5389: Fix regressions of #5063 for importlib_metadata.PathDistribution which have their files attribute being None.

  • #5390: Fix regression where the obj attribute of TestCase items was no longer bound to methods.

  • #5404: Emit a warning when attempting to unwrap a broken object raises an exception, for easier debugging (#5080).

  • #5432: Prevent “already imported” warnings from assertion rewriter when invoking pytest in-process multiple times.

  • #5433: Fix assertion rewriting in packages (__init__.py).

  • #5444: Fix --stepwise mode when the first file passed on the command-line fails to collect.

  • #5482: Fix bug introduced in 4.6.0 causing collection errors when passing more than 2 positional arguments to pytest.mark.parametrize.

  • #5505: Fix crash when discovery fails while using -p no:terminal.

Improved Documentation

  • #5315: Expand docs on mocking classes and dictionaries with monkeypatch.

  • #5416: Fix PytestUnknownMarkWarning in run/skip example.

pytest 4.6.9 (2020-01-04)

Bug Fixes

  • #6301: Fix assertion rewriting for egg-based distributions and editable installs (pip install --editable).

pytest 4.6.8 (2019-12-19)

Features

  • #5471: JUnit XML now includes a timestamp and hostname in the testsuite tag.

Bug Fixes

  • #5430: junitxml: Logs for failed test are now passed to junit report in case the test fails during call phase.

Trivial/Internal Changes

  • #6345: Pin colorama to 0.4.1 only for Python 3.4 so newer Python versions can still receive colorama updates.

pytest 4.6.7 (2019-12-05)

Bug Fixes

  • #5477: The XML file produced by --junitxml now correctly contain a <testsuites> root element.

  • #6044: Properly ignore FileNotFoundError (OSError.errno == NOENT in Python 2) exceptions when trying to remove old temporary directories, for instance when multiple processes try to remove the same directory (common with pytest-xdist for example).

pytest 4.6.6 (2019-10-11)

Bug Fixes

  • #5523: Fixed using multiple short options together in the command-line (for example -vs) in Python 3.8+.

  • #5537: Replace importlib_metadata backport with importlib.metadata from the standard library on Python 3.8+.

  • #5806: Fix “lexer” being used when uploading to bpaste.net from --pastebin to “text”.

  • #5902: Fix warnings about deprecated cmp attribute in attrs>=19.2.

Trivial/Internal Changes

  • #5801: Fixes python version checks (detected by flake8-2020) in case python4 becomes a thing.

pytest 4.6.5 (2019-08-05)

Bug Fixes

  • #4344: Fix RuntimeError/StopIteration when trying to collect package with “__init__.py” only.

  • #5478: Fix encode error when using unicode strings in exceptions with pytest.raises.

  • #5524: Fix issue where tmp_path and tmpdir would not remove directories containing files marked as read-only, which could lead to pytest crashing when executed a second time with the --basetemp option.

  • #5547: --step-wise now handles xfail(strict=True) markers properly.

  • #5650: Improved output when parsing an ini configuration file fails.

pytest 4.6.4 (2019-06-28)

Bug Fixes

  • #5404: Emit a warning when attempting to unwrap a broken object raises an exception, for easier debugging (#5080).

  • #5444: Fix --stepwise mode when the first file passed on the command-line fails to collect.

  • #5482: Fix bug introduced in 4.6.0 causing collection errors when passing more than 2 positional arguments to pytest.mark.parametrize.

  • #5505: Fix crash when discovery fails while using -p no:terminal.

pytest 4.6.3 (2019-06-11)

Bug Fixes

  • #5383: -q has again an impact on the style of the collected items (--collect-only) when --log-cli-level is used.

  • #5389: Fix regressions of #5063 for importlib_metadata.PathDistribution which have their files attribute being None.

  • #5390: Fix regression where the obj attribute of TestCase items was no longer bound to methods.

pytest 4.6.2 (2019-06-03)

Bug Fixes

  • #5370: Revert unrolling of all() to fix NameError on nested comprehensions.

  • #5371: Revert unrolling of all() to fix incorrect handling of generators with if.

  • #5372: Revert unrolling of all() to fix incorrect assertion when using all() in an expression.

pytest 4.6.1 (2019-06-02)

Bug Fixes

  • #5354: Fix pytest.mark.parametrize when the argvalues is an iterator.

  • #5358: Fix assertion rewriting of all() calls to deal with non-generators.

pytest 4.6.0 (2019-05-31)

Important

The 4.6.X series will be the last series to support Python 2 and Python 3.4.

For more details, see our Python 2.7 and 3.4 support plan.

Features

  • #4559: Added the junit_log_passing_tests ini value which can be used to enable or disable logging of passing test output in the Junit XML file.

  • #4956: pytester’s testdir.spawn uses tmpdir as HOME/USERPROFILE directory.

  • #5062: Unroll calls to all to full for-loops with assertion rewriting for better failure messages, especially when using Generator Expressions.

  • #5063: Switch from pkg_resources to importlib-metadata for entrypoint detection for improved performance and import time.

  • #5091: The output for ini options in --help has been improved.

  • #5269: pytest.importorskip includes the ImportError now in the default reason.

  • #5311: Captured logs that are output for each failing test are formatted using the ColoredLevelFormatter.

  • #5312: Improved formatting of multiline log messages in Python 3.

Bug Fixes

  • #2064: The debugging plugin imports the wrapped Pdb class (--pdbcls) on-demand now.

  • #4908: The pytest_enter_pdb hook gets called with post-mortem (--pdb).

  • #5036: Fix issue where fixtures dependent on other parametrized fixtures would be erroneously parametrized.

  • #5256: Handle internal error due to a lone surrogate unicode character not being representable in Jython.

  • #5257: Ensure that sys.stdout.mode does not include 'b' as it is a text stream.

  • #5278: Pytest’s internal python plugin can be disabled using -p no:python again.

  • #5286: Fix issue with disable_test_id_escaping_and_forfeit_all_rights_to_community_support option not working when using a list of test IDs in parametrized tests.

  • #5330: Show the test module being collected when emitting PytestCollectionWarning messages for test classes with __init__ and __new__ methods to make it easier to pin down the problem.

  • #5333: Fix regression in 4.5.0 with --lf not re-running all tests with known failures from non-selected tests.

Improved Documentation

  • #5250: Expand docs on use of setenv and delenv with monkeypatch.

Archive

For older changelogs see the changelog archive.