Python单元测试SetupClass,包含来自配置文件

时间:2016-12-05 17:56:01

标签: python python-2.7 unit-testing python-unittest

我目前正在尝试修改我们对代码进行单元测试的方式。为此,我们决定在xml中使用中间格式的序列化测试描述。一般结构包括一个Base类(派生自unittest.Testcase),然后是每个配置的类(以前在它们自己的文件夹中的一堆python文件),它继承自这个Base类。

我们改变了调用方式并发现单元测试,但是我对单元测试的SetupClass方法有疑问。

以前,这个方法已经在Base Class中被覆盖了,需要使用一些不同的变量来调用每个测试用例,我们从派生类的SetupClass方法中调用它们(调用super(...))。 SetupClass(,乏...)。

既然我们正试图摆脱那些以相当冗长且难以跟踪/配置方式保存此配置的python文件,那我就遇到了问题。

xml配置文件的示例:

<TestConfig>
  <Cases>
    <TestCase>
      <Name>Run Time</Name>
      <GUID>1234-5678</GUID>
      <Comparison>LessThan</Comparison>
      <Value>22</Value>
    </TestCase>
    <TestCase>
      <Name>Memory Usage</Name>
      <GUID>5678-1234</GUID>
      <Comparison>Equal</Comparison>
      <Value>150</Value>
    </TestCase>
  </Cases>
</TestConfig>

我目前的基类实现:

class MyUnitTestBase(unittest.TestCase):
    @classmethod
    def SetupClass(self, var1, var2,...):
       some_internal_setup_stuff using var1 etc.

现在我正在搜索我的文件夹结构中的所有配置文件,并使用该列表尝试设置我想要运行的所有测试的测试套件。

def parseTestSuite(cfg_files):
    all_suites = unittest.TestSuite()
    for cfg_file in cfg_files:
        suite = unittest.TestSuite()
        class MyUnitTestDerived(MyUnitTestBase):
            pass
        try:
            tree  = eTree.parse(cfg_file)
            root = tree.getroot()
            for section in root[0]:
                for item in section:
                    test_item = TestItem() #parsing helper
                    test_item.parse_from_xml(item) #my parsing of the settings
                    test_name = 'test_%s' % (test_item.name).replace(" ","_")
                    setattr(MyUnitTestDerived, test_name, test_generator(test_item.comparison, test_item.exp_value,test_item.comp_value))
                suite.addTests(unittest.TestLoader().loadTestsFromTestCase(MyUnitTestDerived))
        except:
            raise
        all_suites.addTests(suite)
    return all_suites

并帮助生成测试方法:

def test_generator(comparison, exp_value, comp_value):
    if comparison=="LessThan":
        def test(self):
            self.assertLessEqual(exp_value, comp_value)
    elsif comparison=="Equal":
        def test(self):
            self.assertEqual(exp_value, comp_value)
    elif xxx:
        etc...
    return test

检测似乎有效,解析和使用正确测试填充套件似乎也可以正常工作。 然而,我挣扎的是我需要用变量调用setupClass方法,而在这里我不能。我还没想到我会在哪里添加它以及如何使用旧的BaseClass实现再次使用它。

我尝试过的一件事(而且我确定我为此而去了python-hell)正在将pass替换为:

@classmethod
def setUpClass(self, var1 = var1_from_conf, var2 = var2_from_conf, etc):
    return super(MyUnitTestDerived, self).setUpClass(var1 = var1_from_conf, var2 = var2_from_conf, etc)

为了强制默认设置使用配置中当时已知的变量,但它似乎甚至没有调用此setUpClass(尝试使用调试打印)。

我很感激你能给我的任何帮助。我知道这是一个非常复杂的问题,但我已经尝试将其分解为尽可能简单的案例。

0 个答案:

没有答案