在Linux上用Python2.7.12测试。你知道吗
我试图编写一个简单的函数来装饰unittest.TestCase
中的test_*
方法。我知道不以test_
开头的方法不被认为是实际的测试,在测试运行时也不会直接调用。然后,我想知道如果采用test_
方法并对其应用一个未尝试保留名称的朴素修饰符,会发生什么。我希望我的测试被忽略,并且必须修改我的decorator以确保函数的名称以test_
开头。不管怎样,当测试开始的时候,我非常非常惊讶。你知道吗
下面是示例的目录布局
.
|-- add.py
|-- print_args.py
|-- test_add.py
`-- test_add_decorated.py
0 directories, 4 files
add.py
是我们正在测试的库。它增加了两件事。你知道吗
def add(x, y):
return x + y
print_args.py
是一个库,它包含一个装饰器,作为副作用打印函数的arg和kwarg。它的编写尽可能简单,并且没有试图保留函数的名称。你知道吗
def print_args(wrapped):
def wrapper(*args, **kwargs):
print [args, kwargs]
return apply(wrapped, args, kwargs)
return wrapper
这里是test_add.py
,它导入add.py
并测试4 + 5 = 9
。TestAdd
的__repr__
方法与本例没有直接关系,但将在下一个示例中介绍。你知道吗
import unittest
import add
class TestAdd(unittest.TestCase):
def __repr__(self):
return "I am a unittest.TestCase! Fear me!"
def test_add(self):
self.assertEqual(add.add(4, 5), 9)
if __name__ == "__main__":
unittest.main()
当我们运行test_add.py
时,我们可以看到运行了一个测试并且它通过了。你知道吗
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
现在我们将decorator应用于test_add_decorated.py
中的test_add
方法。你知道吗
import unittest
import print_args
import add
class TestAdd(unittest.TestCase):
def __repr__(self):
return "I am a unittest.TestCase! Fear me!"
@print_args.print_args
def test_add(self):
self.assertEqual(add.add(4, 5), 9)
if __name__ == "__main__":
unittest.main()
在运行之前,我希望没有看到任何错误,但是有一个迹象表明已经运行了零个测试,因为test_add
方法的名称现在应该是wrapper
。你知道吗
事情不是这样的。print_args
修饰符工作正常,我们可以看到数组中的arg和kwarg,以及一个测试成功运行的指示。你知道吗
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
[(I am a unittest.TestCase! Fear me!,), {}]
所以,我的问题是。。。unittest
库是如何发现它应该运行我的修饰方法的?你知道吗
包装函数的
__name__
可能是wrapper
,但仍然是TestAdd.test_add
。如中所示,如果您查看TestAdd
类的__dict__
,您将发现绑定到键'test_add'
的包装器函数,如果您想调用该方法,您将使用名称test_add
,而不是wrapper
。你知道吗当
unittest
使用方法名来确定方法是否是测试时,它不会查看__name__
。它查看与方法关联的属性名,而decorator不影响它。你知道吗相关问题 更多 >
编程相关推荐