防止自定义断言显示在 python unittest 的回溯中

sha*_*.lo 5 python-3.x python-unittest

我想向 TestCase 添加一些自定义断言方法。作为一个简单的例子,我只是在下面的测试类中放了一个。它按预期工作,但是当生成输出时,回溯在输出中包含自定义断言。

使它表现得像 assertEqual() 所必需的步骤是什么?assertEqual 的代码在 TestCase 中,但引发断言的实际行没有出现在回溯中。我需要做什么才能使 test_something2 的输出看起来更像 test_something1 的输出?

import unittest
class TestCustomAssert(unittest.TestCase):
    def assertSomething(self, s):
        self.assertEqual(s, 'something')
    def test_something1(self):
        self.assertEqual('foo', 'something')
    def test_something2(self):
        self.assertSomething('foo')

if __name__ == '__main__':
    unittest.main()
Run Code Online (Sandbox Code Playgroud)

输出

python3 custom_assert.py 
FF
======================================================================
FAIL: test_something1 (__main__.TestCustomAssert)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "custom_assert.py", line 8, in test_something1
    self.assertEqual('foo', 'something')
AssertionError: 'foo' != 'something'
- foo                                                                                                                    
+ something                                                                                                              


======================================================================                                                   
FAIL: test_something2 (__main__.TestCustomAssert)                                                                        
----------------------------------------------------------------------                                                   
Traceback (most recent call last):                                                                                       
  File "custom_assert.py", line 10, in test_something2                                                                   
    self.assertSomething('foo')                                                                                          
  File "custom_assert.py", line 6, in assertSomething                                                                    
    self.assertEqual(s, 'something')                                                                                     
AssertionError: 'foo' != 'something'                                                                                     
- foo                                                                                                                    
+ something                                                                                                              


----------------------------------------------------------------------                                                   
Ran 2 tests in 0.000s                                                                                                    

FAILED (failures=2)
Run Code Online (Sandbox Code Playgroud)

Yoa*_*ner 6

unittest不从具有帧打印回溯__unittest=True他们的全局

来自unittest.result

def _is_relevant_tb_level(self, tb):
    return '__unittest' in tb.tb_frame.f_globals
Run Code Online (Sandbox Code Playgroud)

所以,如果你制作一个辅助模块,你可以模拟这种行为:

助手.py :

__unittest = True
def assert_stuff(s):
    assert s == 'something', "%s is not something" % s
Run Code Online (Sandbox Code Playgroud)

现在您可以从您的测试用例中调用这个助手。

我想可以制作一个非常简洁的装饰器,在没有帮助模块的情况下使这种魔法更加自动化,但恕我直言,无论如何你都不应该努力减少回溯。