Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Handle xfail(strict=True) properly in --step-wise mode #5555

Merged
merged 1 commit into from Jul 4, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog/5547.bugfix.rst
@@ -0,0 +1 @@
``--step-wise`` now handles ``xfail(strict=True)`` markers properly.
2 changes: 1 addition & 1 deletion src/_pytest/stepwise.py
Expand Up @@ -72,7 +72,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.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment seems wrong

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oops indeed

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if not self.active or "xfail" in report.keywords:
if not self.active:
return

if report.failed:
Expand Down
53 changes: 53 additions & 0 deletions testing/test_stepwise.py
Expand Up @@ -165,3 +165,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()
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

argh!

Should we remove all __pycache__ directories from testdir.tmpdir before each testdir.runpytest call?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ufff that's pretty unfortunate. Probably not though, the assert rewrite tests I think need that

Another idea would be to use utime to force the issue in another way

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well in that case it doesn't really matter, so let's stick with just removing the __pycache__ for now.

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 *",
]
)