我目前正在尝试修改我们对代码进行单元测试的方式。为此,我们决定在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(尝试使用调试打印)。
我很感激你能给我的任何帮助。我知道这是一个非常复杂的问题,但我已经尝试将其分解为尽可能简单的案例。