2012-02-13 53 views
3

我有从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)) 

事情是,我想“变种”的值传递给每个测试,但我不能使用类变量,因为它们是在类的每个实例之间共享,并且我无法访问实际执行对象实例化的代码。完成这个的最好方法是什么?

+0

难道你不能编辑测试吗? – Marcin 2012-02-13 15:02:17

+0

你能创建另一个包含这个数组共享值的文件吗? – CppLearner 2012-02-13 15:02:19

+0

我可以编辑测试。我的意思是“我无法访问实际执行对象实例化的代码”,因为这些对象是在调用loadTestsFromTestCase()的某个位置创建的。如果我重写了测试加载器,我可以将该变量传递给init(),但这看起来很愚蠢。 – denaje 2012-02-13 17:53:17

回答

2

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

+0

我当然可以将我想要的任何东西添加到'setUp'方法中。这将如何帮助我将变量传递给创建的对象? – denaje 2012-02-13 17:53:57

+0

@denaje我的理解是,你需要每个测试用例都有自己的属性(否则你会使用类属性)。由于'setUp'是在每个测试用例之前执行的,因此您可以使用工厂方法创建您需要的变量并将它们分配给'self'。 – jcollado 2012-02-13 18:34:18

+0

问题是,当通过'loadTestsFromTestCase(...)'创建对象本身时,如何将属性导入到我的测试对象中? – denaje 2012-02-13 19:00:34

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) 
+1

这实际上并不奏效,因为我需要将每个值放在单独的测试用例中,而不是全部放在一个测试用例中。另外,我需要能够动态指定要使用的值,而不是每次迭代静态数组。如果这就是我所需要的,那么我可以在我的测试类中对数组进行硬编码。 – denaje 2012-02-13 17:55:58

0

UPDATE:

,因为你需要:

  1. 喂一些变量价值MyTestCase
  2. 使用此值运行MyTestCase
  3. 更改值
  4. 如果MyTestCase仍在运行 - 使用更新的值。

考虑一下:

  1. 保持值映射文件中(.CSV/.TXT/.XML /等)
  2. 读值从文件映射在setUp()
  3. 寻找价值为您的MyTestCase从值映射使用TestCase.id()方法(如下面的示例所示)。
  4. 在测试用例中使用它。

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) 
$ 
+0

但我想用不同的值多次运行每个测试用例。所以,我用'bar'测试'foo'和'test_01','test_01'测试'test_01','test_02'测试等等...使用这个解决方案,每个测试方法都会绑定到一个变量上。 – denaje 2012-02-13 18:57:45

相关问题