Python单元测试:动态添加测试方法?

时间:2018-12-13 21:14:36

标签: python unit-testing

我的单元测试很复杂,要根据情况手动编程并不容易(或不可能)。有益的是能够动态添加测试数据,并且为了便于阅读,最好对每个数据都有自己的测试方法,最好是动态生成测试方法。

这是一个(不起作用的)示例:

class TestParam(unittest.TestCase):
    def __init__(self, _):
        dir = 'test_param_items'
        for f in os.listdir(dir):
            if os.path.isfile(dir + "\\" + f) and f[0] != '_':
                print f
                func = self.TestCaseFactory(f, dir)
                setattr(TestParam, func.__name__, func)
                super(TestParam, self).__init__(func.__name__)


    def TestCaseFactory(self, inFileName, inDir):
        def func(inObj):
            print inFileName
            with open(inDir + "\\" + inFileName, "r") as testFile:
                testNode = testFile.read()
                par = Param(inETree=etree.XML(testNode))
                self.assertEqual(testNode, etree.tostring(par.eTree))
        func.__name__ = "test_" + inFileName[:-4]
        return func

这里的测试文件是普通的XML。 但是Python 2.7的测试运行程序从类而不是实例中获取测试方法,并按实例运行它们:

loaded_suite = self.suiteClass(map(testCaseClass, testCaseNames))

所以我无法运行我生成的测试功能。 我的错误显然是,通常一个测试方法可以覆盖许多测试用例,但是我认为编写这些方法的10和100非常浪费时间。对于每个方法都有一堆测试用例,而当测试(方法)无法搜索具有大量数据的实际AssertEquals方法输出时,这对于我来说是很混乱的。 我会找到一种方法

def testMethod1(self):
    load('testFile1')

def testMethod2(self):
    load('testFile2')

等已相当分散(测试数据和测试方法分为不同的文件)。

对此有何想法?我的方法错了吗?有可能做到吗?

对这种方法有任何想法吗?

1 个答案:

答案 0 :(得分:0)

最后,我通过调用TestSuites设法完全基于Python 2.7的基础结构解决了这个问题:

#modules of the tested objects not included here
from TemplateMaker import Param
from lxml import etree
#/

import unittest
import os
import os.path


class TestSuiteParam(unittest.TestSuite):
    def __init__(self):
        self._tests = []
        dir = 'test_param_items'
        for f in os.listdir(dir):
            if os.path.isfile(dir + "\\" + f) and f[0] != '_':
                # "_test_filename" is for inactive/switched off tests 
                tp = TestParam(f, dir)
                self.addTest(tp)
        super(TestSuiteParam, self).__init__(self._tests)


class TestParam(unittest.TestCase):
    def __init__(self, inFile, inDir):
        func = self.TestCaseFactory(inFile, inDir)
        setattr(TestParam, func.__name__, func)
        super(TestParam, self).__init__(func.__name__)

    @staticmethod
    def TestCaseFactory(inFileName, inDir):
        def func(inObj):
            with open(inDir + "\\" + inFileName, "r") as testFile:
                testNode = testFile.read()
                par = Param(inETree=etree.XML(testNode))
                inObj.assertEqual(testNode, etree.tostring(par.eTree))
        func.__name__ = "test_" + inFileName[:-4]
        return func

请注意,该解决方案仍然不够完美(由于某种原因,TestCase实例只能具有一个测试方法,因为其父级的 init ()仅处理一个方法),但是可以使用。