gpt4 book ai didi

python - unittest库如何确定是否运行装饰方法?

转载 作者:行者123 更新时间:2023-11-30 22:44:58 25 4
gpt4 key购买 nike

在 Linux 上使用 Python 2.7.12 进行测试。

我正在尝试编写一个简单的函数来装饰 unittest.TestCase 中的 test_* 方法。我知道不以 test_ 开头的方法不被视为实际测试,并且在测试运行时不会直接调用。然后我想知道如果您采用 test_ 方法并向其应用一个不尝试保留名称的朴素装饰器,会发生什么。我期望我的测试被忽略,并且必须修改我的装饰器以确保该函数的名称以 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 是一个包含装饰器的库,该装饰器打印函数的 args 和 kwargs 作为副作用。它的编写尽可能简单,并且没有尝试保留函数的名称。

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

现在我们将装饰器应用到 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 装饰器工作正常,我们可以看到数组中的 args 和 kwargs,以及一个测试成功运行的指示。

.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
[(I am a unittest.TestCase! Fear me!,), {}]

所以,我的问题是......unittest 库如何确定它应该运行我的装饰方法?

最佳答案

包装函数的__name__可能是wrapper,但它仍然是TestAdd.test_add。例如,如果您查看 TestAdd 类的 __dict__,您会发现绑定(bind)到键 'test_add' 的包装函数,并且如果您想要调用该方法,您可以使用名称 test_add,而不是 wrapper

unittest使用方法名称来确定方法是否是测试时,它不会查看__name__。它查看与该方法关联的属性名称,装饰器不会影响它。

关于python - unittest库如何确定是否运行装饰方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41325469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com