gpt4 book ai didi

python - 在 python 中编写类似单元测试的 DRY 方法

转载 作者:太空宇宙 更新时间:2023-11-04 01:02:23 25 4
gpt4 key购买 nike

我在 python 中有一些类似的单元测试。相似之处只有一个论点在改变。

class TestFoo(TestCase):
def test_typeA(self):
self.assertTrue(foo(bar=TYPE_A))

def test_typeB(self):
self.assertTrue(foo(bar=TYPE_B))

def test_typeC(self):
self.assertTrue(foo(bar=TYPE_C))

...

显然这不是很 DRY,即使您有 4-5 个不同的选项,代码也会非常重复

现在我可以做这样的事情了

class TestFoo(TestCase):
BAR_TYPES = (
TYPE_A,
TYPE_B,
TYPE_C,
...
)

def _foo_test(self, bar_type):
self.assertTrue(foo(bar=bar_type))

def test_foo_bar_type(self):
for bar_type in BAR_TYPES:
_foo_test(bar=bar_type))

这行得通,但是当引发异常时,我如何知道 _foo_test 是否因参数 TYPE_A、TYPE_B 或 TYPE_C 而失败?

也许有更好的方法来构建这些非常相似的测试?

最佳答案

你想做的本质上是一个参数化测试。此功能不包含在标准的 django 或 python unittest 模块中,但许多库提供了它:nose-parameterized , py.test , ddt

到目前为止,我最喜欢的是 ddt:它最类似于 NUnit-JUnit 风格的参数化测试,非常轻量级,不会妨碍您,也不需要专门的测试运行器(比如 nose-parameterized ).它可以帮助您的方式是修改测试名称以包含所有参数,因此您可以通过查看测试名称清楚地看到哪个测试用例失败了。

使用 ddt,您的示例将如下所示:

import ddt

@ddt.ddt
class TestProcessCreateAgencyOfferAndDispatch(TestCase):

@ddt.data(TYPE_A, TYPE_B, TYPE_C)
def test_foo_bar_type(self, type):
self.assertTrue(foo(bar=type))

在这种情况下,名称将类似于 test_foo_bar_type__TYPE_A(从技术上讲,它的构造类似于 [test_name]__[repr(parameter_1)]__[repr(parameter_2)] ).

作为奖励,它更加简洁(没有辅助方法),并且您获得了三个方法而不是一个。这里的好处是你可以在一个方法中测试各种代码路径,并且每个路径得到一个测试用例(但是需要一定的思考,有时最好对某些代码路径进行专门的测试)

关于python - 在 python 中编写类似单元测试的 DRY 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32199077/

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