From fd2f32048554da04d60bae662a82ecd0fc8417e2 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Fri, 28 Jun 2019 14:39:53 -0700 Subject: [PATCH 1/5] Preparing release version 5.0.0 --- CHANGELOG.rst | 178 ++++++++++++++++++++++++++++++ changelog/1149.removal.rst | 7 -- changelog/1403.bugfix.rst | 1 - changelog/1671.bugfix.rst | 2 - changelog/2761.bugfix.rst | 1 - changelog/3457.feature.rst | 4 - changelog/4488.deprecation.rst | 2 - changelog/466.deprecation.rst | 2 - changelog/5078.bugfix.rst | 1 - changelog/5125.removal.rst | 5 - changelog/5260.bugfix.rst | 17 --- changelog/5315.doc.rst | 1 - changelog/5335.bugfix.rst | 2 - changelog/5354.bugfix.rst | 1 - changelog/5370.bugfix.rst | 1 - changelog/5371.bugfix.rst | 1 - changelog/5372.bugfix.rst | 1 - changelog/5383.bugfix.rst | 2 - changelog/5389.bugfix.rst | 1 - changelog/5390.bugfix.rst | 1 - changelog/5402.removal.rst | 23 ---- changelog/5404.bugfix.rst | 2 - changelog/5412.removal.rst | 2 - changelog/5416.doc.rst | 1 - changelog/5432.bugfix.rst | 1 - changelog/5433.bugfix.rst | 1 - changelog/5440.feature.rst | 8 -- changelog/5444.bugfix.rst | 1 - changelog/5452.feature.rst | 1 - changelog/5482.bugfix.rst | 2 - changelog/5505.bugfix.rst | 1 - doc/en/announce/index.rst | 1 + doc/en/announce/release-5.0.0.rst | 47 ++++++++ doc/en/example/parametrize.rst | 12 +- doc/en/example/reportingdemo.rst | 126 +++++++++++---------- 35 files changed, 301 insertions(+), 159 deletions(-) delete mode 100644 changelog/1149.removal.rst delete mode 100644 changelog/1403.bugfix.rst delete mode 100644 changelog/1671.bugfix.rst delete mode 100644 changelog/2761.bugfix.rst delete mode 100644 changelog/3457.feature.rst delete mode 100644 changelog/4488.deprecation.rst delete mode 100644 changelog/466.deprecation.rst delete mode 100644 changelog/5078.bugfix.rst delete mode 100644 changelog/5125.removal.rst delete mode 100644 changelog/5260.bugfix.rst delete mode 100644 changelog/5315.doc.rst delete mode 100644 changelog/5335.bugfix.rst delete mode 100644 changelog/5354.bugfix.rst delete mode 100644 changelog/5370.bugfix.rst delete mode 100644 changelog/5371.bugfix.rst delete mode 100644 changelog/5372.bugfix.rst delete mode 100644 changelog/5383.bugfix.rst delete mode 100644 changelog/5389.bugfix.rst delete mode 100644 changelog/5390.bugfix.rst delete mode 100644 changelog/5402.removal.rst delete mode 100644 changelog/5404.bugfix.rst delete mode 100644 changelog/5412.removal.rst delete mode 100644 changelog/5416.doc.rst delete mode 100644 changelog/5432.bugfix.rst delete mode 100644 changelog/5433.bugfix.rst delete mode 100644 changelog/5440.feature.rst delete mode 100644 changelog/5444.bugfix.rst delete mode 100644 changelog/5452.feature.rst delete mode 100644 changelog/5482.bugfix.rst delete mode 100644 changelog/5505.bugfix.rst create mode 100644 doc/en/announce/release-5.0.0.rst diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 45e31bef9..27d15a875 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -18,6 +18,184 @@ with advance notice in the **Deprecations** section of releases. .. towncrier release notes start +pytest 5.0.0 (2019-06-28) +========================= + +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 `__. + + +- `#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. + + +- `#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: + + .. code-block:: ini + + [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. + + + +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. + + + +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.3 (2019-06-11) ========================= diff --git a/changelog/1149.removal.rst b/changelog/1149.removal.rst deleted file mode 100644 index f507014d9..000000000 --- a/changelog/1149.removal.rst +++ /dev/null @@ -1,7 +0,0 @@ -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 `__. diff --git a/changelog/1403.bugfix.rst b/changelog/1403.bugfix.rst deleted file mode 100644 index 3fb748aec..000000000 --- a/changelog/1403.bugfix.rst +++ /dev/null @@ -1 +0,0 @@ -Switch from ``imp`` to ``importlib``. diff --git a/changelog/1671.bugfix.rst b/changelog/1671.bugfix.rst deleted file mode 100644 index c46eac828..000000000 --- a/changelog/1671.bugfix.rst +++ /dev/null @@ -1,2 +0,0 @@ -The name of the ``.pyc`` files cached by the assertion writer now includes the pytest version -to avoid stale caches. diff --git a/changelog/2761.bugfix.rst b/changelog/2761.bugfix.rst deleted file mode 100644 index c63f02ecd..000000000 --- a/changelog/2761.bugfix.rst +++ /dev/null @@ -1 +0,0 @@ -Honor PEP 235 on case-insensitive file systems. diff --git a/changelog/3457.feature.rst b/changelog/3457.feature.rst deleted file mode 100644 index c30943070..000000000 --- a/changelog/3457.feature.rst +++ /dev/null @@ -1,4 +0,0 @@ -New `pytest_assertion_pass `__ -hook, called with context information when an assertion *passes*. - -This hook is still **experimental** so use it with caution. diff --git a/changelog/4488.deprecation.rst b/changelog/4488.deprecation.rst deleted file mode 100644 index 575df5545..000000000 --- a/changelog/4488.deprecation.rst +++ /dev/null @@ -1,2 +0,0 @@ -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. diff --git a/changelog/466.deprecation.rst b/changelog/466.deprecation.rst deleted file mode 100644 index 65775c386..000000000 --- a/changelog/466.deprecation.rst +++ /dev/null @@ -1,2 +0,0 @@ -The ``funcargnames`` attribute has been an alias for ``fixturenames`` since -pytest 2.3, and is now deprecated in code too. diff --git a/changelog/5078.bugfix.rst b/changelog/5078.bugfix.rst deleted file mode 100644 index 8fed85f5d..000000000 --- a/changelog/5078.bugfix.rst +++ /dev/null @@ -1 +0,0 @@ -Test module is no longer double-imported when using ``--pyargs``. diff --git a/changelog/5125.removal.rst b/changelog/5125.removal.rst deleted file mode 100644 index 8f67c7399..000000000 --- a/changelog/5125.removal.rst +++ /dev/null @@ -1,5 +0,0 @@ -``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. diff --git a/changelog/5260.bugfix.rst b/changelog/5260.bugfix.rst deleted file mode 100644 index 484c1438a..000000000 --- a/changelog/5260.bugfix.rst +++ /dev/null @@ -1,17 +0,0 @@ -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 diff --git a/changelog/5315.doc.rst b/changelog/5315.doc.rst deleted file mode 100644 index 4cb463583..000000000 --- a/changelog/5315.doc.rst +++ /dev/null @@ -1 +0,0 @@ -Expand docs on mocking classes and dictionaries with ``monkeypatch``. diff --git a/changelog/5335.bugfix.rst b/changelog/5335.bugfix.rst deleted file mode 100644 index 0a2e99dc9..000000000 --- a/changelog/5335.bugfix.rst +++ /dev/null @@ -1,2 +0,0 @@ -Colorize level names when the level in the logging format is formatted using -'%(levelname).Xs' (truncated fixed width alignment), where X is an integer. diff --git a/changelog/5354.bugfix.rst b/changelog/5354.bugfix.rst deleted file mode 100644 index 812ea8364..000000000 --- a/changelog/5354.bugfix.rst +++ /dev/null @@ -1 +0,0 @@ -Fix ``pytest.mark.parametrize`` when the argvalues is an iterator. diff --git a/changelog/5370.bugfix.rst b/changelog/5370.bugfix.rst deleted file mode 100644 index 70def0d27..000000000 --- a/changelog/5370.bugfix.rst +++ /dev/null @@ -1 +0,0 @@ -Revert unrolling of ``all()`` to fix ``NameError`` on nested comprehensions. diff --git a/changelog/5371.bugfix.rst b/changelog/5371.bugfix.rst deleted file mode 100644 index 46ff5c890..000000000 --- a/changelog/5371.bugfix.rst +++ /dev/null @@ -1 +0,0 @@ -Revert unrolling of ``all()`` to fix incorrect handling of generators with ``if``. diff --git a/changelog/5372.bugfix.rst b/changelog/5372.bugfix.rst deleted file mode 100644 index e9b644db2..000000000 --- a/changelog/5372.bugfix.rst +++ /dev/null @@ -1 +0,0 @@ -Revert unrolling of ``all()`` to fix incorrect assertion when using ``all()`` in an expression. diff --git a/changelog/5383.bugfix.rst b/changelog/5383.bugfix.rst deleted file mode 100644 index 53e25956d..000000000 --- a/changelog/5383.bugfix.rst +++ /dev/null @@ -1,2 +0,0 @@ -``-q`` has again an impact on the style of the collected items -(``--collect-only``) when ``--log-cli-level`` is used. diff --git a/changelog/5389.bugfix.rst b/changelog/5389.bugfix.rst deleted file mode 100644 index debf0a9da..000000000 --- a/changelog/5389.bugfix.rst +++ /dev/null @@ -1 +0,0 @@ -Fix regressions of `#5063 `__ for ``importlib_metadata.PathDistribution`` which have their ``files`` attribute being ``None``. diff --git a/changelog/5390.bugfix.rst b/changelog/5390.bugfix.rst deleted file mode 100644 index 3f57c3043..000000000 --- a/changelog/5390.bugfix.rst +++ /dev/null @@ -1 +0,0 @@ -Fix regression where the ``obj`` attribute of ``TestCase`` items was no longer bound to methods. diff --git a/changelog/5402.removal.rst b/changelog/5402.removal.rst deleted file mode 100644 index 29921dd97..000000000 --- a/changelog/5402.removal.rst +++ /dev/null @@ -1,23 +0,0 @@ -**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: - -.. code-block:: ini - - [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 `__. diff --git a/changelog/5404.bugfix.rst b/changelog/5404.bugfix.rst deleted file mode 100644 index 2187bed8b..000000000 --- a/changelog/5404.bugfix.rst +++ /dev/null @@ -1,2 +0,0 @@ -Emit a warning when attempting to unwrap a broken object raises an exception, -for easier debugging (`#5080 `__). diff --git a/changelog/5412.removal.rst b/changelog/5412.removal.rst deleted file mode 100644 index a6f197006..000000000 --- a/changelog/5412.removal.rst +++ /dev/null @@ -1,2 +0,0 @@ -``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. diff --git a/changelog/5416.doc.rst b/changelog/5416.doc.rst deleted file mode 100644 index 81e4c6404..000000000 --- a/changelog/5416.doc.rst +++ /dev/null @@ -1 +0,0 @@ -Fix PytestUnknownMarkWarning in run/skip example. diff --git a/changelog/5432.bugfix.rst b/changelog/5432.bugfix.rst deleted file mode 100644 index 44c01c0cf..000000000 --- a/changelog/5432.bugfix.rst +++ /dev/null @@ -1 +0,0 @@ -Prevent "already imported" warnings from assertion rewriter when invoking pytest in-process multiple times. diff --git a/changelog/5433.bugfix.rst b/changelog/5433.bugfix.rst deleted file mode 100644 index c3a7472bc..000000000 --- a/changelog/5433.bugfix.rst +++ /dev/null @@ -1 +0,0 @@ -Fix assertion rewriting in packages (``__init__.py``). diff --git a/changelog/5440.feature.rst b/changelog/5440.feature.rst deleted file mode 100644 index d3bb95f58..000000000 --- a/changelog/5440.feature.rst +++ /dev/null @@ -1,8 +0,0 @@ -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 diff --git a/changelog/5444.bugfix.rst b/changelog/5444.bugfix.rst deleted file mode 100644 index 230d4b49e..000000000 --- a/changelog/5444.bugfix.rst +++ /dev/null @@ -1 +0,0 @@ -Fix ``--stepwise`` mode when the first file passed on the command-line fails to collect. diff --git a/changelog/5452.feature.rst b/changelog/5452.feature.rst deleted file mode 100644 index 4e47e971e..000000000 --- a/changelog/5452.feature.rst +++ /dev/null @@ -1 +0,0 @@ -When warnings are configured as errors, pytest warnings now appear as originating from ``pytest.`` instead of the internal ``_pytest.warning_types.`` module. diff --git a/changelog/5482.bugfix.rst b/changelog/5482.bugfix.rst deleted file mode 100644 index c345458d1..000000000 --- a/changelog/5482.bugfix.rst +++ /dev/null @@ -1,2 +0,0 @@ -Fix bug introduced in 4.6.0 causing collection errors when passing -more than 2 positional arguments to ``pytest.mark.parametrize``. diff --git a/changelog/5505.bugfix.rst b/changelog/5505.bugfix.rst deleted file mode 100644 index 2d0a53b39..000000000 --- a/changelog/5505.bugfix.rst +++ /dev/null @@ -1 +0,0 @@ -Fix crash when discovery fails while using ``-p no:terminal``. diff --git a/doc/en/announce/index.rst b/doc/en/announce/index.rst index c8c7f243a..c8247ceb3 100644 --- a/doc/en/announce/index.rst +++ b/doc/en/announce/index.rst @@ -6,6 +6,7 @@ Release announcements :maxdepth: 2 + release-5.0.0 release-4.6.3 release-4.6.2 release-4.6.1 diff --git a/doc/en/announce/release-5.0.0.rst b/doc/en/announce/release-5.0.0.rst new file mode 100644 index 000000000..a198c6fa6 --- /dev/null +++ b/doc/en/announce/release-5.0.0.rst @@ -0,0 +1,47 @@ +pytest-5.0.0 +======================================= + +The pytest team is proud to announce the 5.0.0 release! + +pytest is a mature Python testing tool with more than a 2000 tests +against itself, passing on many different interpreters and platforms. + +This release contains a number of bugs fixes and improvements, so users are encouraged +to take a look at the CHANGELOG: + + https://docs.pytest.org/en/latest/changelog.html + +For complete documentation, please visit: + + https://docs.pytest.org/en/latest/ + +As usual, you can upgrade from pypi via: + + pip install -U pytest + +Thanks to all who contributed to this release, among them: + +* Anthony Sottile +* Bruno Oliveira +* Daniel Hahler +* Dirk Thomas +* Evan Kepner +* Florian Bruhin +* Hugo +* Kevin J. Foley +* Pulkit Goyal +* Ralph Giles +* Ronny Pfannschmidt +* Thomas Grainger +* Thomas Hisch +* Tim Gates +* Victor Maryama +* Yuri Apollov +* Zac Hatfield-Dodds +* Zac-HD +* curiousjazz77 +* patriksevallius + + +Happy testing, +The Pytest Development Team diff --git a/doc/en/example/parametrize.rst b/doc/en/example/parametrize.rst index d324fc106..8c0e4754f 100644 --- a/doc/en/example/parametrize.rst +++ b/doc/en/example/parametrize.rst @@ -434,10 +434,16 @@ Running it results in some skips if we don't have all the python interpreters in .. code-block:: pytest . $ pytest -rs -q multipython.py - ...sss...sssssssss...sss... [100%] + ssssssssssss......sss...... [100%] + ============================= warnings summary ============================= + $PYTHON_PREFIX/lib/python3.6/distutils/__init__.py:1 + $PYTHON_PREFIX/lib/python3.6/distutils/__init__.py:1: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses + import imp + + -- Docs: https://docs.pytest.org/en/latest/warnings.html ========================= short test summary info ========================== - SKIPPED [15] $REGENDOC_TMPDIR/CWD/multipython.py:31: 'python3.4' not found - 12 passed, 15 skipped in 0.12 seconds + SKIPPED [15] $REGENDOC_TMPDIR/CWD/multipython.py:30: 'python3.5' not found + 12 passed, 15 skipped, 1 warnings in 0.12 seconds Indirect parametrization of optional implementations/imports -------------------------------------------------------------------- diff --git a/doc/en/example/reportingdemo.rst b/doc/en/example/reportingdemo.rst index 928c365ca..617681c19 100644 --- a/doc/en/example/reportingdemo.rst +++ b/doc/en/example/reportingdemo.rst @@ -26,7 +26,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: > assert param1 * 2 < param2 E assert (3 * 2) < 6 - failure_demo.py:21: AssertionError + failure_demo.py:20: AssertionError _________________________ TestFailing.test_simple __________________________ self = @@ -43,7 +43,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E + where 42 = .f at 0xdeadbeef>() E + and 43 = .g at 0xdeadbeef>() - failure_demo.py:32: AssertionError + failure_demo.py:31: AssertionError ____________________ TestFailing.test_simple_multiline _____________________ self = @@ -51,7 +51,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: def test_simple_multiline(self): > otherfunc_multi(42, 6 * 9) - failure_demo.py:35: + failure_demo.py:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ a = 42, b = 54 @@ -60,7 +60,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: > assert a == b E assert 42 == 54 - failure_demo.py:16: AssertionError + failure_demo.py:15: AssertionError ___________________________ TestFailing.test_not ___________________________ self = @@ -73,7 +73,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E assert not 42 E + where 42 = .f at 0xdeadbeef>() - failure_demo.py:41: AssertionError + failure_demo.py:40: AssertionError _________________ TestSpecialisedExplanations.test_eq_text _________________ self = @@ -84,7 +84,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E - spam E + eggs - failure_demo.py:46: AssertionError + failure_demo.py:45: AssertionError _____________ TestSpecialisedExplanations.test_eq_similar_text _____________ self = @@ -97,7 +97,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E + foo 2 bar E ? ^ - failure_demo.py:49: AssertionError + failure_demo.py:48: AssertionError ____________ TestSpecialisedExplanations.test_eq_multiline_text ____________ self = @@ -110,7 +110,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E + eggs E bar - failure_demo.py:52: AssertionError + failure_demo.py:51: AssertionError ______________ TestSpecialisedExplanations.test_eq_long_text _______________ self = @@ -127,7 +127,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E + 1111111111b222222222 E ? ^ - failure_demo.py:57: AssertionError + failure_demo.py:56: AssertionError _________ TestSpecialisedExplanations.test_eq_long_text_multiline __________ self = @@ -147,7 +147,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E E ...Full output truncated (7 lines hidden), use '-vv' to show - failure_demo.py:62: AssertionError + failure_demo.py:61: AssertionError _________________ TestSpecialisedExplanations.test_eq_list _________________ self = @@ -158,7 +158,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E At index 2 diff: 2 != 3 E Use -v to get the full diff - failure_demo.py:65: AssertionError + failure_demo.py:64: AssertionError ______________ TestSpecialisedExplanations.test_eq_list_long _______________ self = @@ -171,7 +171,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E At index 100 diff: 1 != 2 E Use -v to get the full diff - failure_demo.py:70: AssertionError + failure_demo.py:69: AssertionError _________________ TestSpecialisedExplanations.test_eq_dict _________________ self = @@ -189,7 +189,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E E ...Full output truncated (2 lines hidden), use '-vv' to show - failure_demo.py:73: AssertionError + failure_demo.py:72: AssertionError _________________ TestSpecialisedExplanations.test_eq_set __________________ self = @@ -207,7 +207,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E E ...Full output truncated (2 lines hidden), use '-vv' to show - failure_demo.py:76: AssertionError + failure_demo.py:75: AssertionError _____________ TestSpecialisedExplanations.test_eq_longer_list ______________ self = @@ -218,7 +218,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E Right contains one more item: 3 E Use -v to get the full diff - failure_demo.py:79: AssertionError + failure_demo.py:78: AssertionError _________________ TestSpecialisedExplanations.test_in_list _________________ self = @@ -227,7 +227,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: > assert 1 in [0, 2, 3, 4, 5] E assert 1 in [0, 2, 3, 4, 5] - failure_demo.py:82: AssertionError + failure_demo.py:81: AssertionError __________ TestSpecialisedExplanations.test_not_in_text_multiline __________ self = @@ -246,7 +246,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E E ...Full output truncated (2 lines hidden), use '-vv' to show - failure_demo.py:86: AssertionError + failure_demo.py:85: AssertionError ___________ TestSpecialisedExplanations.test_not_in_text_single ____________ self = @@ -259,7 +259,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E single foo line E ? +++ - failure_demo.py:90: AssertionError + failure_demo.py:89: AssertionError _________ TestSpecialisedExplanations.test_not_in_text_single_long _________ self = @@ -272,7 +272,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E head head foo tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail E ? +++ - failure_demo.py:94: AssertionError + failure_demo.py:93: AssertionError ______ TestSpecialisedExplanations.test_not_in_text_single_long_term _______ self = @@ -285,7 +285,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E head head fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffftail tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail tail E ? ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - failure_demo.py:98: AssertionError + failure_demo.py:97: AssertionError ______________ TestSpecialisedExplanations.test_eq_dataclass _______________ self = @@ -294,7 +294,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: from dataclasses import dataclass @dataclass - class Foo(object): + class Foo: a: int b: str @@ -306,7 +306,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E Differing attributes: E b: 'b' != 'c' - failure_demo.py:110: AssertionError + failure_demo.py:109: AssertionError ________________ TestSpecialisedExplanations.test_eq_attrs _________________ self = @@ -315,7 +315,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: import attr @attr.s - class Foo(object): + class Foo: a = attr.ib() b = attr.ib() @@ -327,11 +327,11 @@ Here is a nice run of several failures and how ``pytest`` presents things: E Differing attributes: E b: 'b' != 'c' - failure_demo.py:122: AssertionError + failure_demo.py:121: AssertionError ______________________________ test_attribute ______________________________ def test_attribute(): - class Foo(object): + class Foo: b = 1 i = Foo() @@ -339,11 +339,11 @@ Here is a nice run of several failures and how ``pytest`` presents things: E assert 1 == 2 E + where 1 = .Foo object at 0xdeadbeef>.b - failure_demo.py:130: AssertionError + failure_demo.py:129: AssertionError _________________________ test_attribute_instance __________________________ def test_attribute_instance(): - class Foo(object): + class Foo: b = 1 > assert Foo().b == 2 @@ -351,11 +351,11 @@ Here is a nice run of several failures and how ``pytest`` presents things: E + where 1 = .Foo object at 0xdeadbeef>.b E + where .Foo object at 0xdeadbeef> = .Foo'>() - failure_demo.py:137: AssertionError + failure_demo.py:136: AssertionError __________________________ test_attribute_failure __________________________ def test_attribute_failure(): - class Foo(object): + class Foo: def _get_b(self): raise Exception("Failed to get attrib") @@ -364,7 +364,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: i = Foo() > assert i.b == 2 - failure_demo.py:148: + failure_demo.py:147: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = .Foo object at 0xdeadbeef> @@ -373,14 +373,14 @@ Here is a nice run of several failures and how ``pytest`` presents things: > raise Exception("Failed to get attrib") E Exception: Failed to get attrib - failure_demo.py:143: Exception + failure_demo.py:142: Exception _________________________ test_attribute_multiple __________________________ def test_attribute_multiple(): - class Foo(object): + class Foo: b = 1 - class Bar(object): + class Bar: b = 2 > assert Foo().b == Bar().b @@ -390,7 +390,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E + and 2 = .Bar object at 0xdeadbeef>.b E + where .Bar object at 0xdeadbeef> = .Bar'>() - failure_demo.py:158: AssertionError + failure_demo.py:157: AssertionError __________________________ TestRaises.test_raises __________________________ self = @@ -400,7 +400,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: > raises(TypeError, int, s) E ValueError: invalid literal for int() with base 10: 'qwe' - failure_demo.py:168: ValueError + failure_demo.py:167: ValueError ______________________ TestRaises.test_raises_doesnt _______________________ self = @@ -409,7 +409,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: > raises(IOError, int, "3") E Failed: DID NOT RAISE - failure_demo.py:171: Failed + failure_demo.py:170: Failed __________________________ TestRaises.test_raise ___________________________ self = @@ -418,7 +418,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: > raise ValueError("demo error") E ValueError: demo error - failure_demo.py:174: ValueError + failure_demo.py:173: ValueError ________________________ TestRaises.test_tupleerror ________________________ self = @@ -427,7 +427,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: > a, b = [1] # NOQA E ValueError: not enough values to unpack (expected 2, got 1) - failure_demo.py:177: ValueError + failure_demo.py:176: ValueError ______ TestRaises.test_reinterpret_fails_with_print_for_the_fun_of_it ______ self = @@ -438,7 +438,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: > a, b = items.pop() E TypeError: 'int' object is not iterable - failure_demo.py:182: TypeError + failure_demo.py:181: TypeError --------------------------- Captured stdout call --------------------------- items is [1, 2, 3] ________________________ TestRaises.test_some_error ________________________ @@ -449,7 +449,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: > if namenotexi: # NOQA E NameError: name 'namenotexi' is not defined - failure_demo.py:185: NameError + failure_demo.py:184: NameError ____________________ test_dynamic_compile_shows_nicely _____________________ def test_dynamic_compile_shows_nicely(): @@ -464,14 +464,14 @@ Here is a nice run of several failures and how ``pytest`` presents things: sys.modules[name] = module > module.foo() - failure_demo.py:203: + failure_demo.py:202: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def foo(): > assert 1 == 0 E AssertionError - <0-codegen 'abc-123' $REGENDOC_TMPDIR/assertion/failure_demo.py:200>:2: AssertionError + <0-codegen 'abc-123' $REGENDOC_TMPDIR/assertion/failure_demo.py:199>:2: AssertionError ____________________ TestMoreErrors.test_complex_error _____________________ self = @@ -485,9 +485,9 @@ Here is a nice run of several failures and how ``pytest`` presents things: > somefunc(f(), g()) - failure_demo.py:214: + failure_demo.py:213: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - failure_demo.py:12: in somefunc + failure_demo.py:11: in somefunc otherfunc(x, y) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @@ -497,7 +497,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: > assert a == b E assert 44 == 43 - failure_demo.py:8: AssertionError + failure_demo.py:7: AssertionError ___________________ TestMoreErrors.test_z1_unpack_error ____________________ self = @@ -507,7 +507,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: > a, b = items E ValueError: not enough values to unpack (expected 2, got 0) - failure_demo.py:218: ValueError + failure_demo.py:217: ValueError ____________________ TestMoreErrors.test_z2_type_error _____________________ self = @@ -517,7 +517,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: > a, b = items E TypeError: 'int' object is not iterable - failure_demo.py:222: TypeError + failure_demo.py:221: TypeError ______________________ TestMoreErrors.test_startswith ______________________ self = @@ -530,7 +530,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E + where False = ('456') E + where = '123'.startswith - failure_demo.py:227: AssertionError + failure_demo.py:226: AssertionError __________________ TestMoreErrors.test_startswith_nested ___________________ self = @@ -549,7 +549,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E + where '123' = .f at 0xdeadbeef>() E + and '456' = .g at 0xdeadbeef>() - failure_demo.py:236: AssertionError + failure_demo.py:235: AssertionError _____________________ TestMoreErrors.test_global_func ______________________ self = @@ -560,7 +560,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E + where False = isinstance(43, float) E + where 43 = globf(42) - failure_demo.py:239: AssertionError + failure_demo.py:238: AssertionError _______________________ TestMoreErrors.test_instance _______________________ self = @@ -571,7 +571,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E assert 42 != 42 E + where 42 = .x - failure_demo.py:243: AssertionError + failure_demo.py:242: AssertionError _______________________ TestMoreErrors.test_compare ________________________ self = @@ -581,7 +581,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E assert 11 < 5 E + where 11 = globf(10) - failure_demo.py:246: AssertionError + failure_demo.py:245: AssertionError _____________________ TestMoreErrors.test_try_finally ______________________ self = @@ -592,13 +592,13 @@ Here is a nice run of several failures and how ``pytest`` presents things: > assert x == 0 E assert 1 == 0 - failure_demo.py:251: AssertionError + failure_demo.py:250: AssertionError ___________________ TestCustomAssertMsg.test_single_line ___________________ self = def test_single_line(self): - class A(object): + class A: a = 1 b = 2 @@ -607,13 +607,13 @@ Here is a nice run of several failures and how ``pytest`` presents things: E assert 1 == 2 E + where 1 = .A'>.a - failure_demo.py:262: AssertionError + failure_demo.py:261: AssertionError ____________________ TestCustomAssertMsg.test_multiline ____________________ self = def test_multiline(self): - class A(object): + class A: a = 1 b = 2 @@ -626,13 +626,13 @@ Here is a nice run of several failures and how ``pytest`` presents things: E assert 1 == 2 E + where 1 = .A'>.a - failure_demo.py:269: AssertionError + failure_demo.py:268: AssertionError ___________________ TestCustomAssertMsg.test_custom_repr ___________________ self = def test_custom_repr(self): - class JSON(object): + class JSON: a = 1 def __repr__(self): @@ -648,5 +648,11 @@ Here is a nice run of several failures and how ``pytest`` presents things: E assert 1 == 2 E + where 1 = This is JSON\n{\n 'foo': 'bar'\n}.a - failure_demo.py:282: AssertionError - ======================== 44 failed in 0.12 seconds ========================= + failure_demo.py:281: AssertionError + ============================= warnings summary ============================= + failure_demo.py::test_dynamic_compile_shows_nicely + $REGENDOC_TMPDIR/assertion/failure_demo.py:193: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses + import imp + + -- Docs: https://docs.pytest.org/en/latest/warnings.html + ================== 44 failed, 1 warnings in 0.12 seconds =================== From 5e39eb91bb6d7bdc11364ab741f1057d36fc17d5 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Thu, 27 Jun 2019 10:54:16 -0700 Subject: [PATCH 2/5] Correct Zac-HD's name in changelogs --- doc/en/announce/release-3.8.2.rst | 2 +- doc/en/announce/release-4.3.1.rst | 1 - doc/en/announce/release-4.5.0.rst | 1 - doc/en/announce/release-5.0.0.rst | 1 - 4 files changed, 1 insertion(+), 4 deletions(-) diff --git a/doc/en/announce/release-3.8.2.rst b/doc/en/announce/release-3.8.2.rst index 124c33aa4..ecc47fbb3 100644 --- a/doc/en/announce/release-3.8.2.rst +++ b/doc/en/announce/release-3.8.2.rst @@ -20,7 +20,7 @@ Thanks to all who contributed to this release, among them: * Jeffrey Rackauckas * Jose Carlos Menezes * Ronny Pfannschmidt -* Zac-HD +* Zac Hatfield-Dodds * iwanb diff --git a/doc/en/announce/release-4.3.1.rst b/doc/en/announce/release-4.3.1.rst index 45d14fffe..54cf8b3fc 100644 --- a/doc/en/announce/release-4.3.1.rst +++ b/doc/en/announce/release-4.3.1.rst @@ -21,7 +21,6 @@ Thanks to all who contributed to this release, among them: * Kyle Altendorf * Stephan Hoyer * Zac Hatfield-Dodds -* Zac-HD * songbowen diff --git a/doc/en/announce/release-4.5.0.rst b/doc/en/announce/release-4.5.0.rst index 084579ac4..37c16cd72 100644 --- a/doc/en/announce/release-4.5.0.rst +++ b/doc/en/announce/release-4.5.0.rst @@ -28,7 +28,6 @@ Thanks to all who contributed to this release, among them: * Pulkit Goyal * Samuel Searles-Bryant * Zac Hatfield-Dodds -* Zac-HD Happy testing, diff --git a/doc/en/announce/release-5.0.0.rst b/doc/en/announce/release-5.0.0.rst index a198c6fa6..ca5160602 100644 --- a/doc/en/announce/release-5.0.0.rst +++ b/doc/en/announce/release-5.0.0.rst @@ -38,7 +38,6 @@ Thanks to all who contributed to this release, among them: * Victor Maryama * Yuri Apollov * Zac Hatfield-Dodds -* Zac-HD * curiousjazz77 * patriksevallius From 55d2fe076f6b5a4a3b90d2df829685580dc48937 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Thu, 27 Jun 2019 10:59:58 -0700 Subject: [PATCH 3/5] Use importlib instead of imp in demo --- doc/en/example/assertion/failure_demo.py | 5 +-- doc/en/example/reportingdemo.rst | 41 +++++++++++------------- 2 files changed, 21 insertions(+), 25 deletions(-) diff --git a/doc/en/example/assertion/failure_demo.py b/doc/en/example/assertion/failure_demo.py index 3a307816f..129362cd7 100644 --- a/doc/en/example/assertion/failure_demo.py +++ b/doc/en/example/assertion/failure_demo.py @@ -190,12 +190,13 @@ class TestRaises: # thanks to Matthew Scott for this test def test_dynamic_compile_shows_nicely(): - import imp + import importlib.util import sys src = "def foo():\n assert 1 == 0\n" name = "abc-123" - module = imp.new_module(name) + spec = importlib.util.spec_from_loader(name, loader=None) + module = importlib.util.module_from_spec(spec) code = _pytest._code.compile(src, name, "exec") exec(code, module.__dict__) sys.modules[name] = module diff --git a/doc/en/example/reportingdemo.rst b/doc/en/example/reportingdemo.rst index 617681c19..8212c8e24 100644 --- a/doc/en/example/reportingdemo.rst +++ b/doc/en/example/reportingdemo.rst @@ -453,25 +453,26 @@ Here is a nice run of several failures and how ``pytest`` presents things: ____________________ test_dynamic_compile_shows_nicely _____________________ def test_dynamic_compile_shows_nicely(): - import imp + import importlib.util import sys src = "def foo():\n assert 1 == 0\n" name = "abc-123" - module = imp.new_module(name) + spec = importlib.util.spec_from_loader(name, loader=None) + module = importlib.util.module_from_spec(spec) code = _pytest._code.compile(src, name, "exec") exec(code, module.__dict__) sys.modules[name] = module > module.foo() - failure_demo.py:202: + failure_demo.py:203: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def foo(): > assert 1 == 0 E AssertionError - <0-codegen 'abc-123' $REGENDOC_TMPDIR/assertion/failure_demo.py:199>:2: AssertionError + <0-codegen 'abc-123' $REGENDOC_TMPDIR/assertion/failure_demo.py:200>:2: AssertionError ____________________ TestMoreErrors.test_complex_error _____________________ self = @@ -485,7 +486,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: > somefunc(f(), g()) - failure_demo.py:213: + failure_demo.py:214: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ failure_demo.py:11: in somefunc otherfunc(x, y) @@ -507,7 +508,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: > a, b = items E ValueError: not enough values to unpack (expected 2, got 0) - failure_demo.py:217: ValueError + failure_demo.py:218: ValueError ____________________ TestMoreErrors.test_z2_type_error _____________________ self = @@ -517,7 +518,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: > a, b = items E TypeError: 'int' object is not iterable - failure_demo.py:221: TypeError + failure_demo.py:222: TypeError ______________________ TestMoreErrors.test_startswith ______________________ self = @@ -530,7 +531,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E + where False = ('456') E + where = '123'.startswith - failure_demo.py:226: AssertionError + failure_demo.py:227: AssertionError __________________ TestMoreErrors.test_startswith_nested ___________________ self = @@ -549,7 +550,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E + where '123' = .f at 0xdeadbeef>() E + and '456' = .g at 0xdeadbeef>() - failure_demo.py:235: AssertionError + failure_demo.py:236: AssertionError _____________________ TestMoreErrors.test_global_func ______________________ self = @@ -560,7 +561,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E + where False = isinstance(43, float) E + where 43 = globf(42) - failure_demo.py:238: AssertionError + failure_demo.py:239: AssertionError _______________________ TestMoreErrors.test_instance _______________________ self = @@ -571,7 +572,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E assert 42 != 42 E + where 42 = .x - failure_demo.py:242: AssertionError + failure_demo.py:243: AssertionError _______________________ TestMoreErrors.test_compare ________________________ self = @@ -581,7 +582,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E assert 11 < 5 E + where 11 = globf(10) - failure_demo.py:245: AssertionError + failure_demo.py:246: AssertionError _____________________ TestMoreErrors.test_try_finally ______________________ self = @@ -592,7 +593,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: > assert x == 0 E assert 1 == 0 - failure_demo.py:250: AssertionError + failure_demo.py:251: AssertionError ___________________ TestCustomAssertMsg.test_single_line ___________________ self = @@ -607,7 +608,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E assert 1 == 2 E + where 1 = .A'>.a - failure_demo.py:261: AssertionError + failure_demo.py:262: AssertionError ____________________ TestCustomAssertMsg.test_multiline ____________________ self = @@ -626,7 +627,7 @@ Here is a nice run of several failures and how ``pytest`` presents things: E assert 1 == 2 E + where 1 = .A'>.a - failure_demo.py:268: AssertionError + failure_demo.py:269: AssertionError ___________________ TestCustomAssertMsg.test_custom_repr ___________________ self = @@ -648,11 +649,5 @@ Here is a nice run of several failures and how ``pytest`` presents things: E assert 1 == 2 E + where 1 = This is JSON\n{\n 'foo': 'bar'\n}.a - failure_demo.py:281: AssertionError - ============================= warnings summary ============================= - failure_demo.py::test_dynamic_compile_shows_nicely - $REGENDOC_TMPDIR/assertion/failure_demo.py:193: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses - import imp - - -- Docs: https://docs.pytest.org/en/latest/warnings.html - ================== 44 failed, 1 warnings in 0.12 seconds =================== + failure_demo.py:282: AssertionError + ======================== 44 failed in 0.12 seconds ========================= From 97f0a20ca9fe4e1acac7d3510441214a223f36ac Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Thu, 27 Jun 2019 11:05:07 -0700 Subject: [PATCH 4/5] Add notice about py35+ and move ExitCode changelog entry --- CHANGELOG.rst | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 27d15a875..1ad0a1555 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -21,6 +21,13 @@ with advance notice in the **Deprecations** section of releases. 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 -------- @@ -33,13 +40,6 @@ Removals `#4009 `__. -- `#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. - - - `#5402 `_: **PytestDeprecationWarning are now errors by default.** Following our plan to remove deprecated features with as little disruption as @@ -104,6 +104,13 @@ Features - `#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 --------- From 58bfc7736fc4f88eca669157822e00715c67a9bf Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Thu, 27 Jun 2019 11:08:31 -0700 Subject: [PATCH 5/5] Use shutil.which to avoid distutils+imp warning --- doc/en/example/multipython.py | 4 ++-- doc/en/example/parametrize.rst | 8 +------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/doc/en/example/multipython.py b/doc/en/example/multipython.py index c06e452df..3dc1d9b29 100644 --- a/doc/en/example/multipython.py +++ b/doc/en/example/multipython.py @@ -2,7 +2,7 @@ module containing a parametrized tests testing cross-python serialization via the pickle module. """ -import distutils.spawn +import shutil import subprocess import textwrap @@ -24,7 +24,7 @@ def python2(request, python1): class Python: def __init__(self, version, picklefile): - self.pythonpath = distutils.spawn.find_executable(version) + self.pythonpath = shutil.which(version) if not self.pythonpath: pytest.skip("{!r} not found".format(version)) self.picklefile = picklefile diff --git a/doc/en/example/parametrize.rst b/doc/en/example/parametrize.rst index 8c0e4754f..a9f006f24 100644 --- a/doc/en/example/parametrize.rst +++ b/doc/en/example/parametrize.rst @@ -435,15 +435,9 @@ Running it results in some skips if we don't have all the python interpreters in . $ pytest -rs -q multipython.py ssssssssssss......sss...... [100%] - ============================= warnings summary ============================= - $PYTHON_PREFIX/lib/python3.6/distutils/__init__.py:1 - $PYTHON_PREFIX/lib/python3.6/distutils/__init__.py:1: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses - import imp - - -- Docs: https://docs.pytest.org/en/latest/warnings.html ========================= short test summary info ========================== SKIPPED [15] $REGENDOC_TMPDIR/CWD/multipython.py:30: 'python3.5' not found - 12 passed, 15 skipped, 1 warnings in 0.12 seconds + 12 passed, 15 skipped in 0.12 seconds Indirect parametrization of optional implementations/imports --------------------------------------------------------------------