From df0cff18ac40e5b62dcf75c2a8067f6c9a05564b Mon Sep 17 00:00:00 2001 From: Bruno Oliveira Date: Thu, 4 Jul 2019 20:50:33 -0300 Subject: [PATCH 1/2] Handle xfail(strict=True) properly in --step-wise mode (#5555) Handle xfail(strict=True) properly in --step-wise mode --- changelog/5547.bugfix.rst | 1 + src/_pytest/stepwise.py | 2 +- testing/test_stepwise.py | 53 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 changelog/5547.bugfix.rst diff --git a/changelog/5547.bugfix.rst b/changelog/5547.bugfix.rst new file mode 100644 index 0000000000..0345bf048f --- /dev/null +++ b/changelog/5547.bugfix.rst @@ -0,0 +1 @@ +``--step-wise`` now handles ``xfail(strict=True)`` markers properly. diff --git a/src/_pytest/stepwise.py b/src/_pytest/stepwise.py index 81b9fa0f43..7225e3e490 100644 --- a/src/_pytest/stepwise.py +++ b/src/_pytest/stepwise.py @@ -73,7 +73,7 @@ def pytest_collection_modifyitems(self, session, config, items): def pytest_runtest_logreport(self, report): # Skip this hook if plugin is not active or the test is xfailed. - if not self.active or "xfail" in report.keywords: + if not self.active: return if report.failed: diff --git a/testing/test_stepwise.py b/testing/test_stepwise.py index b27dd02993..c05d7925df 100644 --- a/testing/test_stepwise.py +++ b/testing/test_stepwise.py @@ -166,3 +166,56 @@ def test_stop_on_collection_errors(broken_testdir, broken_first): files.reverse() result = broken_testdir.runpytest("-v", "--strict-markers", "--stepwise", *files) result.stdout.fnmatch_lines("*errors during collection*") + + +def test_xfail_handling(testdir): + """Ensure normal xfail is ignored, and strict xfail interrupts the session in sw mode + + (#5547) + """ + contents = """ + import pytest + def test_a(): pass + + @pytest.mark.xfail(strict={strict}) + def test_b(): assert {assert_value} + + def test_c(): pass + def test_d(): pass + """ + testdir.makepyfile(contents.format(assert_value="0", strict="False")) + result = testdir.runpytest("--sw", "-v") + result.stdout.fnmatch_lines( + [ + "*::test_a PASSED *", + "*::test_b XFAIL *", + "*::test_c PASSED *", + "*::test_d PASSED *", + "* 3 passed, 1 xfailed in *", + ] + ) + + testdir.makepyfile(contents.format(assert_value="1", strict="True")) + result = testdir.runpytest("--sw", "-v") + result.stdout.fnmatch_lines( + [ + "*::test_a PASSED *", + "*::test_b FAILED *", + "* Interrupted*", + "* 1 failed, 1 passed in *", + ] + ) + + # because we are writing to the same file, mtime might not be affected enough to + # invalidate the cache, making this next run flaky + testdir.tmpdir.join("__pycache__").remove() + testdir.makepyfile(contents.format(assert_value="0", strict="True")) + result = testdir.runpytest("--sw", "-v") + result.stdout.fnmatch_lines( + [ + "*::test_b XFAIL *", + "*::test_c PASSED *", + "*::test_d PASSED *", + "* 2 passed, 1 deselected, 1 xfailed in *", + ] + ) From acb62ba619257de8520e77bd01082f4556d2b14e Mon Sep 17 00:00:00 2001 From: Bruno Oliveira Date: Thu, 4 Jul 2019 21:08:16 -0300 Subject: [PATCH 2/2] Fix test_stepwise::test_xfail_handling when byte code writing is disabled --- testing/test_stepwise.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/testing/test_stepwise.py b/testing/test_stepwise.py index c05d7925df..d8d11917ad 100644 --- a/testing/test_stepwise.py +++ b/testing/test_stepwise.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +import sys + import pytest @@ -208,7 +210,8 @@ def test_d(): pass # because we are writing to the same file, mtime might not be affected enough to # invalidate the cache, making this next run flaky - testdir.tmpdir.join("__pycache__").remove() + if not sys.dont_write_bytecode: + testdir.tmpdir.join("__pycache__").remove() testdir.makepyfile(contents.format(assert_value="0", strict="True")) result = testdir.runpytest("--sw", "-v") result.stdout.fnmatch_lines(