Python unittest,只有在测试失败时才做某事

ska*_*sie 8 python unit-testing

当使用unittestpython 3中的库时,我只想在测试失败时做一些操作(但这应该在类级别,所以我不必为每个测试编写它).例如,当使用表现时,有类似的东西:

def after_step(context, step):
    if step.status == "failed":
        ...
Run Code Online (Sandbox Code Playgroud)

是否有类似的unittest库,如果没有,最简单的方法是做类似的事情?

WKP*_*lus 5

我最近正在尝试做类似的事情,但我找到了出路:

import unittest

class MyTestResult(unittest.TestResult):
    def addFailure(self, test, err):
        # here you can do what you want to do when a test case fails 
        print('test failed!')
        super(MyTestResult, self).addFailure(test, err)

    def addError(self, test, err):
        # here you can do what you want to do when a test case raises an error
        super(MyTestResult, self).addError(test, err)

class MyUT(unittest.TestCase):
    def test_fail(self):
        self.assertEqual(1, 2, '123')
        self.assertTrue("ABc".isupper())

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

如果你想根据不同的测试用例类做不同的工作,你可以这样实现:

import unittest

class MyUT(unittest.TestCase):
    class TestResult(unittest.TestResult):
        def addFailure(self, test, err):
            print('do something when test case failed')
            super(MyUT.TestResult, self).addFailure(test, err)
        def addError(self, test, err):
            print('test case error')
            super(MyUT.TestResult, self).addError(test, err)

    def test_fail(self):
        self.assertEqual(1, 2, "1=2")

class MyUT2(unittest.TestCase):
    class TestResult(unittest.TestResult):
        def addFailure(self, test, err):
            print('do something else when test case failed')
            super(MyUT2.TestResult, self).addFailure(test, err)
        def addError(self, test, err):
            print('test case error')
            super(MyUT2.TestResult, self).addError(test, err)

    def test_fail(self):
        self.assertEqual(1, 2, "1=2")

if __name__ == '__main__':
    classes = [MyUT, MyUT2]
    for c in classes:
        suite = unittest.TestLoader().loadTestsFromTestCase(c)
        unittest.TextTestRunner(resultclass=c.TestResult).run(suite)
Run Code Online (Sandbox Code Playgroud)


小智 1

你可以尝试用装饰器来做:

class ExceptionHandler(object):
def __init__(self, f):
    self.f = f

def __call__(self, *args, **kwargs):
    try:
        self.f(*args, **kwargs)
    except:
        print('do smth')
Run Code Online (Sandbox Code Playgroud)

在单元测试中:

@ExceptionHandler  
def test_fail(self):
    self.assert_false(True)
Run Code Online (Sandbox Code Playgroud)