[py-svn] pytest commit 84ce63c04007: teach trial support code to throw separate errors/failures for setup/call/teardown

commits-noreply at bitbucket.org commits-noreply at bitbucket.org
Wed Nov 24 14:35:55 CET 2010


# HG changeset patch -- Bitbucket.org
# Project pytest
# URL http://bitbucket.org/hpk42/pytest/overview
# User holger krekel <holger at merlinux.eu>
# Date 1290605704 -3600
# Node ID 84ce63c04007afe18d1491742bc3c56794a22658
# Parent  19df6d3f871fce3005bbef752f28249669233410
teach trial support code to throw separate errors/failures for setup/call/teardown

--- a/_pytest/unittest.py
+++ b/_pytest/unittest.py
@@ -47,7 +47,7 @@ class TestCaseFunction(pytest.Function):
         # unwrap potential exception info (see twisted trial support below)
         rawexcinfo = getattr(rawexcinfo, '_rawexcinfo', rawexcinfo)
         try:
-            self._excinfo = py.code.ExceptionInfo(rawexcinfo)
+            excinfo = py.code.ExceptionInfo(rawexcinfo)
         except TypeError:
             try:
                 try:
@@ -63,7 +63,8 @@ class TestCaseFunction(pytest.Function):
             except KeyboardInterrupt:
                 raise
             except pytest.fail.Exception:
-                self._excinfo = py.code.ExceptionInfo()
+                excinfo = py.code.ExceptionInfo()
+        self.__dict__.setdefault('_excinfo', []).append(excinfo)
 
     def addError(self, testcase, rawexcinfo):
         self._addexcinfo(rawexcinfo)
@@ -80,9 +81,8 @@ class TestCaseFunction(pytest.Function):
 @pytest.mark.tryfirst
 def pytest_runtest_makereport(item, call):
     if isinstance(item, TestCaseFunction):
-        if item._excinfo:
-            call.excinfo = item._excinfo
-            item._excinfo = None
+        if hasattr(item, '_excinfo') and item._excinfo:
+            call.excinfo = item._excinfo.pop(0)
             del call.result
 
 # twisted trial support

--- a/testing/test_unittest.py
+++ b/testing/test_unittest.py
@@ -183,11 +183,9 @@ def test_testcase_totally_incompatible_e
                 pass
     """)
     item.addError(None, 42)
-    excinfo = item._excinfo
+    excinfo = item._excinfo.pop(0)
     assert 'ERROR: Unknown Incompatible' in str(excinfo.getrepr())
 
-
-
 class TestTrialUnittest:
     def setup_class(cls):
         pytest.importorskip("twisted.trial.unittest")
@@ -225,6 +223,7 @@ class TestTrialUnittest:
             "*3 skipped*2 xfail*",
         ])
 
+    @pytest.mark.xfail(reason="fijal needs add checks")
     def test_trial_error(self, testdir):
         testdir.makepyfile("""
             from twisted.trial.unittest import TestCase
@@ -262,6 +261,7 @@ class TestTrialUnittest:
                 # will crash both at test time and at teardown
         """)
         result = testdir.runpytest()
+        assert 0
 
     def test_trial_pdb(self, testdir):
         p = testdir.makepyfile("""
@@ -275,6 +275,46 @@ class TestTrialUnittest:
         child.expect("hellopdb")
         child.sendeof()
 
+    def test_trial_setup_failure_is_shown(self, testdir):
+        testdir.makepyfile("""
+            from twisted.trial import unittest
+            import pytest
+            class TC(unittest.TestCase):
+                def setUp(self):
+                    assert 0, "down1"
+                def test_method(self):
+                    print ("never42")
+                    xyz
+        """)
+        result = testdir.runpytest("-s")
+        assert result.ret == 1
+        result.stdout.fnmatch_lines([
+            "*setUp*",
+            "*assert 0*down1*",
+            "*1 failed*",
+        ])
+        assert 'never42' not in result.stdout.str()
+
+    def test_trial_teardown_and_test_failure(self, testdir):
+        testdir.makepyfile("""
+            from twisted.trial import unittest
+            import pytest
+            class TC(unittest.TestCase):
+                def tearDown(self):
+                    assert 0, "down1"
+                def test_method(self):
+                    assert False, "down2"
+        """)
+        result = testdir.runpytest("-s")
+        assert result.ret == 1
+        result.stdout.fnmatch_lines([
+            "*tearDown*",
+            "*assert 0*",
+            "*test_method*",
+            "*assert False*",
+            "*1 failed*1 error*",
+        ])
+
 def test_djangolike_testcase(testdir):
     # contributed from Morten Breekevold
     testdir.makepyfile("""



More information about the pytest-commit mailing list