最后几天我在python中测试了一些技术来自动化单元测试,比如C#中的TestCase。
我知道有些框架支持这种技术,但我会更详细地学习python,所以我想了解这一点。
对我来说,以下帖子有一个很好的答案(来自Xavier Decoret),所以我试了一下,结果非常好,但我不能毫无例外地堆叠装饰器。
Python unittest: Generate multiple tests programmatically?
简而言之,我的两段代码,结果异常和环境:
@
//sample code for which regex needs to be used
121,321,0,0,0,0,0,0 it should return false
121,321,1,0,0,0,0,0 it should return true
121,321,0,0,0,0,1,0 it should return true
public static void main(String[] args) {
String text = "1234,1102,0,0,0,0";
String regex = "";
System.out.println(Pattern.matches(regex, text));
}
import sys
def for_examples(*parameters):
def tuplify(x):
if not isinstance(x, tuple):
return (x,)
return x
def decorator(method, parameters=parameters):
for parameter in (tuplify(x) for x in parameters):
def method_for_parameter(self, method=method, parameter=parameter):
method(self, *parameter)
args_for_parameter = ",".join(repr(v) for v in parameter)
name_for_parameter = method.__name__ + "(" + args_for_parameter + ")"
frame = sys._getframe(1) # pylint: disable-msg=W0212
frame.f_locals[name_for_parameter] = method_for_parameter
return None
return decorator
import unittest
# some magic code will be added here later
from params import for_examples
class DummyTest(unittest.TestCase):
@for_examples(1, 2)
@for_examples(3, 4)
def test_is_smaller_than_four(self, value):
self.assertTrue(value < 4)
@for_examples((1,2),(2,4),(3,7))
def test_double_of_X_is_Y(self, x, y):
self.assertEqual(2 * x, y)
if __name__ == "__main__":
unittest.main()
希望有人可以帮助我理解我的问题,我们可以找到一个可堆叠的解决方案。
答案 0 :(得分:0)
您复制的装饰器并非设计为可以像这样使用。
原因是这一行:
return None
通常,装饰者应该返回装饰函数,而不是None
。然而,在这种情况下,装饰器故意不返回函数,因此单元测试不会将其视为测试用例。
好处是,这根本不是问题,因为
@for_examples(1, 2)
@for_examples(3, 4)
相当于
@for_examples(1, 2, 3, 4)