gpt4 book ai didi

python - 单元测试 : same test class with mutliple datasets

转载 作者:行者123 更新时间:2023-11-28 18:56:54 24 4
gpt4 key购买 nike

设置

我正在尝试运行相同的 unittest.TestCase在多个数据集上。我的设置如下(尽可能简化):

from unittest import TestCase, TestSuite

class MyTest(TestCase):
def __init__(self, a, *args, **kwargs):
super().__init__(methodName="runTest", *args, **kwargs)
self.a = a

def setUp(self):
# something stateful that depends on self.a in the real use case
self.count = 0

def tearDown(self):
del self.count

def runTest(self):
self.test_a()

def test_a(self):
self.count += 1
self.assertGreaterEqual(self.a, 0)

test_data = tuple(range(5))
test_cases = tuple(MyTest(a) for a in test_data)

def suite():
test_suite = TestSuite()
test_suite.addTests(test_cases)
return test_suite

这行得通

我可以使用 TextTestRunner 运行这 5 个测试

from unittest import TextTestRunner

TextTestRunner().run(suite())

很好用。

失败的尝试 1

我想使用 unittests.main 运行它:

from unittest import main

main(verbosity=3)

一开始运行良好(数字 0, 1, .., 4 通过了测试)但随后将第 6 个参数传递给函数:str ing 'test_a';这里测试当然失败了。

失败的尝试 2

但最终目标是使用 unittest.TestLoader().discover() 运行它(这将从不同的 python 模块运行):

from unittest import TestLoader
from pathlib import Path


FILE = Path(__file__)
HERE_DIR = Path(FILE).parent
loader = TestLoader()
discovered_suite = loader.discover(start_dir=str(HERE_DIR), pattern=FILE.name)
TextTestRunner().run(discovered_suite)

如果我这样做,loader.discover(...) 行再次初始化 MyTest 六次而不是五次;最后一次使用 string 'test_a'

问题

我如何使用一个 TestCase 和多个参数设置此测试,以便我可以使用 unittest.TestLoader().discover() 运行它?


我终于找到了可能有用的方法:添加 load_tests模块的方法:

def load_tests(loader, standard_tests, pattern):
return suite()

小警告:如上所述,测试仍然是第 6 次初始化......如何避免这种情况?

因为如果 MyTest 有多个参数:

class MyTest(TestCase):
def __init__(self, a, b, *args, **kwargs):
....

test_cases = tuple(MyTest(a, a) for a in test_data)

当加载程序试图将 'test_a' 作为唯一参数传递时,这会使测试崩溃:

TypeError: __init__() missing 1 required positional argument: 'b'

最佳答案

最后我放弃了,转而采用混合类型的方法(这里有一个有 2 个成员的例子:ab):

class MyTest:
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

def setUp(self):
# something stateful in the real use case
self.count = 0

def tearDown(self):
del self.count

def runTest(self):
self.test_a()

def test_a(self):
self.count += 1
self.assertGreaterEqual(self.a, 0)


class Test0(MyTest, TestCase):
a = 0
b = 0


class Test1(MyTest, TestCase):
a = 1
b = 1


if __name__ == "__main__":

main(verbosity=3)

关于python - 单元测试 : same test class with mutliple datasets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57287658/

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