fix issue9 wrong XPass with failing setup/teardown function of xfail marked test

now when setup or teardown of a test item/function fails and the test
is marked "xfail" it will show up as an xfail-ed test.
This commit is contained in:
holger krekel 2010-12-06 18:20:47 +01:00
parent 2e80512bb8
commit 513482f4f7
3 changed files with 46 additions and 12 deletions

View File

@ -1,6 +1,9 @@
Changes between 2.0.0 and 2.0.1.dev1
----------------------------------------------
- fix issue9: direct setup/teardown functions for an xfail-marked
test will report as xfail if they fail (but reported as normal
passing setup/teardown).
- fix issue8: no logging errors at process exit
- refinements to "collecting" output on non-ttys
- refine internal plugin registration and --traceconfig output

View File

@ -97,19 +97,19 @@ def pytest_runtest_makereport(__multicall__, item, call):
rep.keywords['xfail'] = "reason: " + call.excinfo.value.msg
rep.outcome = "skipped"
return rep
if call.when == "call":
rep = __multicall__.execute()
evalxfail = getattr(item, '_evalxfail')
if not item.config.getvalue("runxfail") and evalxfail.istrue():
if call.excinfo:
rep.outcome = "skipped"
else:
rep.outcome = "failed"
rep = __multicall__.execute()
evalxfail = item._evalxfail
if not item.config.option.runxfail and evalxfail.istrue():
if call.excinfo:
rep.outcome = "skipped"
rep.keywords['xfail'] = evalxfail.getexplanation()
else:
if 'xfail' in rep.keywords:
del rep.keywords['xfail']
return rep
elif call.when == "call":
rep.outcome = "failed"
rep.keywords['xfail'] = evalxfail.getexplanation()
else:
if 'xfail' in rep.keywords:
del rep.keywords['xfail']
return rep
# called by terminalreporter progress reporting
def pytest_report_teststatus(report):

View File

@ -308,6 +308,37 @@ class TestXFail:
"*1 xfailed*",
])
class TestXFailwithSetupTeardown:
def test_failing_setup_issue9(self, testdir):
testdir.makepyfile("""
import pytest
def setup_function(func):
assert 0
@pytest.mark.xfail
def test_func():
pass
""")
result = testdir.runpytest()
result.stdout.fnmatch_lines([
"*1 xfail*",
])
def test_failing_teardown_issue9(self, testdir):
testdir.makepyfile("""
import pytest
def teardown_function(func):
assert 0
@pytest.mark.xfail
def test_func():
pass
""")
result = testdir.runpytest()
result.stdout.fnmatch_lines([
"*1 xfail*",
])
class TestSkipif:
def test_skipif_conditional(self, testdir):