我的单元测试很复杂,要根据情况手动编程并不容易(或不可能)。有益的是能够动态添加测试数据,并且为了便于阅读,最好对每个数据都有自己的测试方法,最好是动态生成测试方法。
这是一个(不起作用的)示例:
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')
等已相当分散(测试数据和测试方法分为不同的文件)。
对此有何想法?我的方法错了吗?有可能做到吗?
对这种方法有任何想法吗?
答案 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 ()仅处理一个方法),但是可以使用。