Python unittest:unterstand装饰器问题

时间:2017-04-23 13:49:54

标签: python unit-testing decorator

最后几天我在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()

希望有人可以帮助我理解我的问题,我们可以找到一个可堆叠的解决方案。

1 个答案:

答案 0 :(得分:0)

您复制的装饰器并非设计为可以像这样使用。

原因是这一行:

return None

通常,装饰者应该返回装饰函数,而不是None。然而,在这种情况下,装饰器故意不返回函数,因此单元测试不会将其视为测试用例。

好处是,这根本不是问题,因为

@for_examples(1, 2)
@for_examples(3, 4)

相当于

@for_examples(1, 2, 3, 4)