Python 向unittest实例传递变量的最佳方法是什么?
我有从unittest.TestCase继承的测试类。我多次加载这些类,如下所示:Python 向unittest实例传递变量的最佳方法是什么?,python,unit-testing,Python,Unit Testing,我有从unittest.TestCase继承的测试类。我多次加载这些类,如下所示: tests = [TestClass1, TestClass2] for test in tests: for var in array: # somehow indicate that this test should have the value of 'var' suite.addTest(unittest.defaultTestLoader.loadTestsFro
tests = [TestClass1, TestClass2]
for test in tests:
for var in array:
# somehow indicate that this test should have the value of 'var'
suite.addTest(unittest.defaultTestLoader.loadTestsFromTestCase(test))
问题是,我想将'var'的值传递给每个测试,但我不能使用类变量,因为它们在类的每个实例之间共享,并且我没有访问实际执行对象实例化的代码的权限。实现这一点的最佳方法是什么?我认为,即使您没有访问实现测试用例的类的权限,您也可以对它们进行子类化,并重载
设置方法。我认为您的做法是错误的。与其做你正在尝试的事情,不如说你在课堂上有:
from my_tests.variables import my_array
class TestClass1(unittest.TestCase):
def setUp():
....initializations...
def tearDown():
....clean up after...
def my_test_that_should_use_value_from_array(self):
for value in my_array:
test_stuff(value)
更新:
因为您需要:
向MyTestCase提供一些变量值
使用此值运行MyTestCase
更改值
如果MyTestCase仍在运行,请使用更新的值
考虑这一点:
在文件(.csv/.txt/.xml/等)中保留值映射
从setUp()中的文件读取值映射
使用TestCase.id()
在测试用例中使用它
unittest
有handyid()
,它以filename.testclassname.methodname
格式返回测试用例名称
所以你可以这样使用它:
import unittest
my_variables_map = {
'test_01': 'foo',
'test_02': 'bar',
}
class MyTest(unittest.TestCase):
def setUp(self):
test_method_name = self.id() # filename.testclassname.methodname
test_method_name = test_method_name.split('.')[-1] # method name
self.variable_value = my_variables_map.get(test_method_name)
self.error_message = 'No values found for "%s" method.' % test_method_name
def test_01(self):
self.assertTrue(self.variable_value is not None, self.error_message)
def test_02(self):
self.assertTrue(self.variable_value is not None, self.error_message)
def test_03(self):
self.assertTrue(self.variable_value is not None, self.error_message)
if __name__ == '__main__':
unittest.main()
这将为您提供:
$ python /tmp/ut.py
..F
======================================================================
FAIL: test_03 (__main__.MyTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/ut.py", line 25, in test_03
self.assertTrue(self.variable_value is not None, self.error_message)
AssertionError: No values found for "test_03" method.
----------------------------------------------------------------------
Ran 3 tests in 0.000s
FAILED (failures=1)
$
我发现(滴滴涕,而不是杀虫剂)的包装对此很有帮助
能否创建另一个包含此数组共享值的文件?我可以编辑测试。我所说的“我没有访问实际执行对象实例化的代码”的意思是,对象是在调用loadTestsFromTestCase()的过程中创建的。如果我重写了测试加载器,我可以将变量传递给init(),但这似乎很愚蠢。我当然可以向设置
方法添加任何我想要的内容。这将如何帮助我将变量传递给创建的对象?@denaje我的理解是,您需要每个测试用例都有自己的属性(否则您将使用类属性)。由于setUp
是在每个测试用例之前执行的,因此您可以使用工厂方法来创建所需的变量,并将它们分配给self
。例如,问题是,当对象本身由loadTestsFromTestCase(…)创建时,如何将属性放入测试对象中
?这实际上不起作用,因为我需要将每个值放在单独的测试用例中,而不是放在一个测试用例中。此外,我需要能够动态地指定要使用的值,而不是每次只在静态数组上迭代。如果这就是我所需要的,我可以在我的测试类中硬编码数组。但是我想用不同的值多次运行每个测试用例。所以,我用'foo'运行test\u 01
,用'bar'运行test\u 01
,对test\u 02
也一样,等等。。。使用此解决方案,每个测试方法将绑定到单个变量。