Kei*_*ith 5 python python-2.7 python-decorators python-unittest
需要一些帮助来纠正装饰器的单元测试。我不确定如何满足单元测试的要求。 此装饰器的想法是,如果传入True,则将测试标记为ExpectedFailure。否则,允许测试简单运行。 此装饰器适用于测试功能,但不适用于类定义
import unittest
def expectedFailureIf(expFailure):
if expFailure:
return unittest.expectedFailure
return lambda func: func
@expectedFailureIf(GetCurrentOS() == kPlatMac) # Fails on Class
class someClass(unittest.TestCase):
#@expectedFailureIf(GetCurrentOS() == kPlatMac) # Works on Function
def test_sometestA(self):
assert True
def test_sometestB(self):
assert False
Run Code Online (Sandbox Code Playgroud)
我得到的错误是test_sometest()正好有1个参数。卸下装饰器即可运行测试。将装饰器移到功能顶部可以运行测试。
历史记录...我的一个平台运行正常,而另一个平台运行不正常。我想允许一个平台运行所有测试,而另一个平台将被标记为预期的故障。当然,我不想使用跳过或跳过。因为那将不允许有效的平台运行。将它们标记为预期的失败也将不起作用,因为一个平台将返回意外的成功。安装了ExpectedFailureIf()后,每个平台都将正确报告,并且一旦问题解决,这些测试将报告为意外成功。修复后,它将通知我。对我来说,这似乎是更好的结果。
在 Python 3 上,您的代码运行良好。那里的实现unittest.expectedFailure更好,并且在类或函数上进行装饰时它可以正常工作。
在 Python 2 上,unittest.expectedFailure仅设计用于处理函数。
这是一个适用于 Python 2 的替代品。
import inspect
import types
import unittest
def expectedFailureIf(condition):
if callable(condition):
condition = condition()
if not condition:
# return identity function for no-op
return lambda x: x
def patch(func_or_class):
if isinstance(func_or_class, types.FunctionType):
return unittest.expectedFailure(func_or_class)
for name, member in inspect.getmembers(func_or_class):
if name.startswith('test') and isinstance(member, types.MethodType):
setattr(func_or_class, name, unittest.expectedFailure(member))
return func_or_class
return patch
@expectedFailureIf(True)
class MyTest(unittest.TestCase):
def test_that_passes(self):
assert 2 + 2 == 4
def test_that_fails(self):
assert 2 + 2 == 5
if __name__ == "__main__":
unittest.main(verbosity=2)
Run Code Online (Sandbox Code Playgroud)
结果:
test_that_fails (__main__.MyTest) ... expected failure
test_that_passes (__main__.MyTest) ... unexpected success
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK (expected failures=1, unexpected successes=1)
Run Code Online (Sandbox Code Playgroud)
事实上,意外的成功不会导致测试运行失败,这是 Python 中的一个错误!该问题已于 2014 年 1 月 (Python 3.4) 得到解决,但由于向后兼容性问题,此错误修复并未合并到 2.7 的分支中(请参阅issues20165的评论)。所以,不幸的是,这现在是 Python 2 的一个“功能”。
如果这对您来说是一个大问题,请考虑升级到更新的Python 版本和/或使用更好的测试运行程序。