我正在使用unittest进行编码,我有问题。我想跳过依赖于全局变量的测试用例。
import unittest
_SKIP_TEST = False
all_suites = unittest.TestSuite()
class Test1(unittest.TestCase):
@unittest.skipIf(_SKIP_TEST, 'Test should be run')
def runTest(self):
global _SKIP_TEST
_SKIP_TEST = True
print('Test1 executed')
all_suites.addTest(Test1())
class Test2(unittest.TestCase):
@unittest.skipIf(_SKIP_TEST, 'Test should skipped')
def runTest(self):
print('Test2 executed')
all_suites.addTest(Test2())
if __name__ == '__main__':
unittest.TextTestRunner(verbosity=2).run(all_suites
我原以为在执行test1之后会跳过test2(全局变量_SKIP_TEST设置为True),但两个测试都执行了。
$ python test.py
runTest (__main__.Test1) ... Test1 executed
ok
runTest (__main__.Test2) ... Test2 executed
ok
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
它可能来自可变范围或评估时间问题,或者我不知道的事情。。。。如何使此代码按预期工作?
谢谢。
装饰器在模块导入时应用;当您将_SKIP_TEST
设置为True
时,decorator早已应用。
您可以在测试中调用TestCase.skipTest()
方法:
class Test1(unittest.TestCase):
def runTest(self):
if _SKIP_TEST:
self.skipTest(_SKIP_TEST, 'Test should be run')
global _SKIP_TEST
_SKIP_TEST = True
print('Test1 executed')
class Test2(unittest.TestCase):
def runTest(self):
if _SKIP_TEST:
self.skipTest(_SKIP_TEST, 'Test should be skipped')
print('Test2 executed')
或者编写您自己的decorator,该decorator使用基于可调用:引发unittest.SkipTest()
异常
from functools import wraps
from unittest import SkipTest
def dynamicSkipIf(callable, reason):
def decorator(f):
@wraps(f)
def wrapper(*args, **kw):
if callable():
raise SkipTest(reason)
return f(*args, **kw)
return wrapper
return decorator
然后将其用作:
class Test1(unittest.TestCase):
@dynamicSkipIf(lambda: _SKIP_TEST, 'Test should be run')
def runTest(self):
global _SKIP_TEST
_SKIP_TEST = True
print('Test1 executed')
all_suites.addTest(Test1())
class Test2(unittest.TestCase):
@dynamicSkipIf(lambda: _SKIP_TEST, 'Test should skipped')
def runTest(self):
print('Test2 executed')
在执行测试时,而不是在模块导入时测试_SKIP_TEST
。