将变量传递给我的unittest实例的最佳方法是什么?

时间:2012-02-13 14:57:48

标签: 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.loadTestsFromTestCase(test))

事实上,我想将'var'的值传递给每个测试,但我不能使用类变量,因为它们在类的每个实例之间共享,而且我无法访问实际执行的代码对象的实例化。实现这个目标的最佳方法是什么?

4 个答案:

答案 0 :(得分:2)

我认为,即使您无法访问实现测试用例的类,也可以对它们进行子类化并重载setUp方法。

答案 1 :(得分:0)

我认为你这是错误的做法。而不是做你正在尝试的东西,为什么你不这样做,说你在课堂上:

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)

答案 2 :(得分:0)


更新:

因为你需要:

  1. 将一些变量值提供给MyTestCase
  2. 使用此值运行MyTestCase
  3. 更改值
  4. 如果MyTestCase仍在运行 - 请使用更新后的值。
  5. 考虑一下:

    1. 将值映射保存在文件中(.csv / .txt / .xml / etc.)
    2. setUp()
    3. 中的文件中读取值映射
    4. 使用TestCase.id()方法从值地图中查找MyTestCase的值(如下例所示)。
    5. 在测试用例中使用它。

    6. unittest方便id() method,以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)
      $
      

答案 3 :(得分:0)

我发现Data-Driven Tests(滴滴涕 - 不是农药)包对此有帮助。

http://ddt.readthedocs.org/en/latest/example.html