Two tracebacks on test failure in PyCharm 2018
我在
1 2 3 4 5 6 7 8 9 10 | import unittest class SiteTests(unittest.TestCase): def test(self): self.assertEqual('a', 'b') if __name__ == '__main__': unittest.main() |
当我使用默认的pycharm配置运行"unittest in test_site.py"时,我得到:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | Testing started at 23:45 ... C:\Users\testSite\AppData\Local\Programs\Python\Python36-32\python.exe"C:\Program Files\JetBrains\PyCharm Community Edition 2018.1.3\helpers\pycharm\_jb_unittest_runner.py" --path C:/testSiteDemoTests/site_tests.py Launching unittests with arguments python -m unittest C:/testSiteDemoTests/site_tests.py in C:\testSiteDemoTests b != a Expected :a Actual :b <Click to see difference> Traceback (most recent call last): File"C:\Program Files\JetBrains\PyCharm Community Edition 2018.1.3\helpers\pycharm\teamcity\diff_tools.py", line 32, in _patched_equals old(self, first, second, msg) File"C:\Users\testSite\AppData\Local\Programs\Python\Python36-32\lib\unittest\case.py", line 829, in assertEqual assertion_func(first, second, msg=msg) File"C:\Users\testSite\AppData\Local\Programs\Python\Python36-32\lib\unittest\case.py", line 1202, in assertMultiLineEqual self.fail(self._formatMessage(msg, standardMsg)) File"C:\Users\testSite\AppData\Local\Programs\Python\Python36-32\lib\unittest\case.py", line 670, in fail raise self.failureException(msg) AssertionError: 'a' != 'b' - a + b During handling of the above exception, another exception occurred: Traceback (most recent call last): File"C:\Users\testSite\AppData\Local\Programs\Python\Python36-32\lib\unittest\case.py", line 59, in testPartExecutor yield File"C:\Users\testSite\AppData\Local\Programs\Python\Python36-32\lib\unittest\case.py", line 605, in run testMethod() File"C:\testSiteDemoTests\site_tests.py", line 7, in test self.assertEqual('a', 'b') Ran 1 test in 0.000s FAILED (failures=1) Process finished with exit code 1 |
最后一部分非常有趣,因为运行这个文件时不使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | F ====================================================================== FAIL: test (__main__.SiteTests) ---------------------------------------------------------------------- Traceback (most recent call last): File"lost_hat_tests.py", line 7, in test self.assertEqual('a', 'b') AssertionError: 'a' != 'b' - a + b ---------------------------------------------------------------------- Ran 1 test in 0.000s FAILED (failures=1) |
有简单的答案为什么第二条信息出现在Pycharm Runner中吗?
我还使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | C:\testSiteDemoTests>python"C:\Program Files\JetBrains\PyCharm Community Edition 2018.1.3\helpers\pycharm\_jb_unittest_runner.py" --path C:/testSiteDemoTests/site_tests.py ##teamcity[enteredTheMatrix timestamp='2018-05-20T23:59:59.931'] Launching unittests with arguments python -m unittest C:/testSiteDemoTests/site_tests.py in C:\testSiteDemoTests ##teamcity[testCount timestamp='2018-05-20T23:59:59.946' count='1'] ##teamcity[testSuiteStarted timestamp='2018-05-20T23:59:59.946' locationHint='python<C:\testSiteDemoTests>://site_tests' name='site_tests' nodeId='1' parentNodeId='0'] ##teamcity[testSuiteStarted timestamp='2018-05-20T23:59:59.946' locationHint='python<C:\testSiteDemoTests>://site_tests.SiteTests' name='SiteTests' nodeId='2' parentNodeId='1'] ##teamcity[testStarted timestamp='2018-05-20T23:59:59.962' captureStandardOutput='true' locationHint='python<C:\testSiteDemoTests>://site_tests.SiteTests.test' name='test' nodeId='3' parentNodeId='2'] ##teamcity[testFailed timestamp='2018-05-20T23:59:59.977' actual='b' details='Traceback (most recent call last):|n File"C:\Program Files\JetBrains\PyCharm Community Edition 2018.1.3\helpers\pycharm\teamcity\diff_tools.py", line 32, in _patched_equals|n old( self, first, second, msg)|n File"C:\Users\testSite\AppData\Local\Programs\Python\Python36-32\lib\unittest\case.py", line 829, in assertEqual|n assertion_func(first, second, msg=msg)|n File"C:\Users\testSite\AppData\Local\Programs\Python\Python36-32\ lib\unittest\case.py", line 1202, in assertMultiLineEqual|n self.fail(self._formatMessage(msg, standardMsg))|n File"C:\Users\testSite\AppData\Local\Programs\Python\Python36-32\lib\unittest\case.py", line 670, in fail|n raise self.failureException(msg) |nAssertionError: |'a|' != |'b|'|n- a|n+ b|n|n|nDuring handling of the above exception, another exception occurred:|n|nTraceback (most recent call last):|n File"C:\Users\testSite\AppData\Local\Programs\Python\Python36-32\lib\unittest\case.py", line 59, in t estPartExecutor|n yield|n File"C:\Users\testSite\AppData\Local\Programs\Python\Python36-32\lib\unittest\case.py", line 605, in run|n testMethod()|n File"C:\testSiteDemoTests\site_tests.py", line 7, in test|n self.assertEqual(|'a|', |'b|')|n' e xpected='a' locationHint='python<C:\testSiteDemoTests>://site_tests.SiteTests.test' message='|nb != a|n' name='test' nodeId='3' parentNodeId='2' type='comparisonFailure'] ##teamcity[testFinished timestamp='2018-05-20T23:59:59.977' duration='30' locationHint='python<C:\testSiteDemoTests>://site_tests.SiteTests.test' name='test' nodeId='3' parentNodeId='2'] Ran 1 test in 0.031s FAILED (failures=1) ##teamcity[testSuiteFinished timestamp='2018-05-20T23:59:59.977' locationHint='python<C:\testSiteDemoTests>://site_tests.SiteTests' name='SiteTests' nodeId='2' parentNodeId='1'] ##teamcity[testSuiteFinished timestamp='2018-05-20T23:59:59.977' locationHint='python<C:\testSiteDemoTests>://site_tests' name='site_tests' nodeId='1' parentNodeId='0'] |
如果在第一个异常处理程序或
A similar mechanism works implicitly if an exception is raised inside an exception handler or a
finally clause: the previous exception is then attached as the new exception’s__context__ attribute
在pycharm中的测试上设置一个断点,然后进一步进入机器显示在哪里抛出了第二个异常。
1 | from teamcity import unittestpy |
1 2 3 4 | def run(self, test): <...> patch_unittest_diff(subtest_filter) <...> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def patch_unittest_diff(<...>): old = unittest.TestCase.assertEqual def _patched_equals(self, first, second, msg=None): try: old(self, first, second, msg) return except AssertionError as native_error: if not test_filter or test_filter(self): error = EqualsAssertionError(first, second, msg) if error.can_be_serialized(): raise error raise native_error unittest.TestCase.assertEqual = _patched_equals |