diff --git a/CHANGELOG b/CHANGELOG index baf05e64a..5db3a6489 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -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 diff --git a/_pytest/skipping.py b/_pytest/skipping.py index d22f2d308..106c8518c 100644 --- a/_pytest/skipping.py +++ b/_pytest/skipping.py @@ -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): diff --git a/testing/test_skipping.py b/testing/test_skipping.py index 1f2a445d9..46ec04b06 100644 --- a/testing/test_skipping.py +++ b/testing/test_skipping.py @@ -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):