[py-svn] pytest commit 3b67bd77f30b: fix issue9 wrong XPass with failing setup/teardown function of xfail marked test

commits-noreply at bitbucket.org commits-noreply at bitbucket.org
Mon Dec 6 18:24:17 CET 2010


# HG changeset patch -- Bitbucket.org
# Project pytest
# URL http://bitbucket.org/hpk42/pytest/overview
# User holger krekel <holger at merlinux.eu>
# Date 1291656047 -3600
# Node ID 3b67bd77f30b91a56847d5a565f80e74979443ee
# Parent  1c3eb86502b30a52e8adf798967b7d547edd8f43
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.

--- a/_pytest/skipping.py
+++ b/_pytest/skipping.py
@@ -97,19 +97,19 @@ def pytest_runtest_makereport(__multical
             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):

--- 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):

--- 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



More information about the pytest-commit mailing list