unittest库如何确定是否运行修饰方法?

2024-04-19 17:48:11 发布

您现在位置:Python中文网/ 问答频道 /正文

在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 = 9TestAdd__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库是如何发现它应该运行我的修饰方法的?你知道吗


Tags: 方法函数pytestimportself名称add
1条回答
网友
1楼 · 发布于 2024-04-19 17:48:11

包装函数的__name__可能是wrapper,但仍然是TestAdd.test_add。如中所示,如果您查看TestAdd类的__dict__,您将发现绑定到键'test_add'的包装器函数,如果您想调用该方法,您将使用名称test_add,而不是wrapper。你知道吗

unittest使用方法名来确定方法是否是测试时,它不会查看__name__。它查看与方法关联的属性名,而decorator不影响它。你知道吗

相关问题 更多 >