Python 向unittest实例传递变量的最佳方法是什么?

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

我有从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.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
    有handy
    id()
    ,它以
    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
    也一样,等等。。。使用此解决方案,每个测试方法将绑定到单个变量。