跳过没有装饰器语法的unittest测试

Lee*_*ton 18 python unit-testing

我有一套测试,我使用TestLoader(来自unittest模块)loadTestsFromModule()方法加载,即,

suite = loader.loadTestsFromModule(module)
Run Code Online (Sandbox Code Playgroud)

这给了我一个完美的测试列表,工作正常.我的问题是,我正在使用的测试工具有时需要根据各种标准跳过某些测试.我想做的是这样的:

for test in suite:
    mark the test as 'to-skip' if it meets certain criteria
Run Code Online (Sandbox Code Playgroud)

请注意,我不能只从测试列表中删除测试,因为我希望unittest测试运行器实际上跳过测试,将它们添加到跳过的计数,以及所有的爵士乐.

unittest文档建议在测试方法或类周围使用装饰器.因为我从模块加载这些测试并根据测试本身未包含的标准确定跳过,所以我不能真正使用装饰器.有没有办法可以迭代每个单独的测试,有些人如何将其标记为"跳过"测试,而无需直接访问类中的测试类或方法?

fal*_*tru 9

使用unittest.TestCase.skipTest:

import unittest

class TestFoo(unittest.TestCase):
    def setUp(self): print('setup')
    def tearDown(self): print('teardown')
    def test_spam(self): pass
    def test_egg(self): pass
    def test_ham(self): pass

if __name__ == '__main__':
    import sys
    loader = unittest.loader.defaultTestLoader
    runner = unittest.TextTestRunner(verbosity=2)
    suite = loader.loadTestsFromModule(sys.modules['__main__'])
    for ts in suite:
        for t in ts:
            if t.id().endswith('am'): # To skip `test_spam` and `test_ham`
                setattr(t, 'setUp', lambda: t.skipTest('criteria'))
    runner.run(suite)
Run Code Online (Sandbox Code Playgroud)

版画

test_egg (__main__.TestFoo) ... setup
teardown
ok
test_ham (__main__.TestFoo) ... skipped 'criteria'
test_spam (__main__.TestFoo) ... skipped 'criteria'

----------------------------------------------------------------------
Ran 3 tests in 0.001s

OK (skipped=2)


----------------------------------------------------------------------
Ran 3 tests in 0.002s

OK (skipped=2)
Run Code Online (Sandbox Code Playgroud)

UPDATE

将代码更新为修补程序setUp而不是测试方法.否则,将执行setUp/ tearDown方法以便跳过测试.

注意

unittest.TestCase.skipTest(测试跳过)是在Python 2.7,3.1中引入的.因此,此方法仅适用于Python 2.7 +,3.1 +.


gir*_*uid 6

这有点像黑客,但是因为你只需要提高unittest.SkipTest你就可以通过你的套件并修改每个测试来为你提高它而不是运行实际的测试代码:

import unittest
from unittest import SkipTest

class MyTestCase(unittest.TestCase):
    def test_this_should_skip(self):
        pass

    def test_this_should_get_skipped_too(self):
        pass

def _skip_test(reason):
    raise SkipTest(reason)

if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(MyTestCase)
    for test in suite:
        skipped_test_method = lambda: _skip_test("reason")
        setattr(test, test._testMethodName, skipped_test_method)
    unittest.TextTestRunner(verbosity=2).run(suite)
Run Code Online (Sandbox Code Playgroud)

当我运行它时,这是我得到的输出:

test_this_should_get_skipped_too (__main__.MyTestCase) ... skipped 'reason'
test_this_should_skip (__main__.MyTestCase) ... skipped 'reason'

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

OK (skipped=2)
Run Code Online (Sandbox Code Playgroud)


Thi*_*ara 5

谷歌把我带到了这里。

我发现最简单的方法SkipTest是在满足跳过条件时引发异常。

from unittest.case import SkipTest

def test_this_foo(self):
    if <skip conditsion>:
        raise SkipTest
Run Code Online (Sandbox Code Playgroud)

该测试将被标记为已跳过。