gpt4 book ai didi

python - 使用 Python 的单元测试子测试时避免重复测试?

转载 作者:行者123 更新时间:2023-12-02 14:52:18 26 4
gpt4 key购买 nike

我无法为这种情况想出一个优雅的解决方案。

假设我有一个 Python 单元测试,它将测试可迭代对象中的多个元素。由于这个迭代器在内存中构建的成本很高,我只想通过 setUpClass 构建它一次。方法。然后,在每个测试中,我想按顺序将 iterable 中的每个元素传递给测试,我可以使用 context manager and the subTest method .这一切都很好。

下面的代码是一个模拟测试用例的例子,它完全按照我所描述的进行:

import unittest

class NumberTest(unittest.TestCase):

@classmethod
def setUpClass(cls):
cls.numbers = []
for x in range(1000):
cls.numbers.append(x)

@classmethod
def tearDownClass(cls):
del cls.numbers

def test_number_is_even(self):
for n in self.numbers:
with self.subTest(current_number=n):
self.assertEqual(n % 2, 0)

def test_number_is_odd(self):
for n in self.numbers:
with self.subTest(current_number=n):
self.assertEqual(n % 2, 1)

def test_number_is_positive(self):
for n in self.numbers:
with self.subTest(current_number=n):
self.assertTrue(n > 0)

def test_number_is_negative(self):
for n in self.numbers:
with self.subTest(current_number=n):
self.assertTrue(n < 0)


if __name__ == '__main__':
unittest.main()

让我感到困扰的是行 for n in self.numbers: with self.subTest(current_number=n): 。 . . 为每个测试方法重复。有什么办法可以避免这种情况吗?我知道我可以简单地将所有 self.assert 语句集中在一个方法中,但这首先违背了对不同方面进行不同测试的目的。

在我看来,“理想”的解决方案是以某种方式yield 可迭代对象的值(也许通过setUp 方法?没有线索)并传递这些在产生下一个之前,每个测试方法的值。但我不知道如何实际执行此操作,特别是因为它涉及上下文管理器......有没有人有任何其他解决方案,或者根本没有解决方法?

最佳答案

一个简单的解决方案是将 forwith 语句外包给装饰器。但是每个测试用例仍然需要一行:

from functools import wraps
from unittest import TestCase


def for_each_number():
def decorator(test_func):
@wraps(test_func)
def wrapper(self: TestCase):
for n in self.numbers:
with self.subTest(current_number=n):
test_func(self, n)

return wrapper
return decorator


class NumberTest(TestCase):
# ...

@for_each_number()
def test_number_is_even(self, n):
self.assertEqual(n % 2, 0)

@for_each_number()
def test_number_is_odd(self, n):
self.assertEqual(n % 2, 1)
# ...

当然,这不会像您的理想解决方案那样只在您的可迭代对象上运行一次。为此,您需要装饰整个类(class)。这似乎可以通过 parameterized 中的 @parameterized_class 装饰器实现。图书馆。我自己从来没有使用过这个装饰器。

关于python - 使用 Python 的单元测试子测试时避免重复测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55030112/

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