我正在尝试编写一种测试某些XML文件的方法。 XML文件描述了科学分析程序的输入,其中可以定义各种参数。我想为我的XML文件编写单元测试,所以我知道程序配置正确。
我目前正在将此作为一个包含基本测试类的库,其中包含各种测试和一些子组件的mixin。但子组件重复了很多次,所以我希望测试对每个mixin运行一次,例如:
myField.$error
...现在,对于每个分析,可以使用不同的参数定义许多组件。我希望能做到这样的事情 -
class BaseTest(object):
xmlfile = '...'
...
class ComponentMixin(object):
xmlid = None #
var = None #
def test_var(self):
assert self.var == "whatever_the_value_is_in self.xmlfile"
# ... and a number of other tests and variables.
...但问题是test_var只会为component2而不是component2调用。有没有办法绕过这个或更好的解决方案?
答案 0 :(得分:2)
正如评论中所建议的那样:对于你的问题而言,组合是比继承更好的解决方案。我们的想法是为XML文件的各个部分定义多个独立的TestCase
(部分),然后将它们组合成单个TestSuite
(复合)。
<强>库强>
它是部分的基类。
class BaseTestCase(unittest.TestCase):
xmlfile = None # will be set by containing test suite
这是一个抽象的组件测试用例实现。
class ComponentTestCase(BaseTestCase):
xmlid = None
var = None
def test_var(self):
assert self.var == "whatever_the_value_is_in self.xmlfile"
它是我们复合材料的基础。它定义了xmlfile
从复合材料到其各部分的方便复制。
class BaseTestSuite(unittest.TestSuite):
xmlfile = None
def addTest(self, test):
if isinstance(test, BaseTestCase):
test.xmlfile = self.xmlfile
super(BaseTestSuite, self).addTest(test)
<强>用法强>
它是特定部分,它测试XML的某些特定方面:
class MySpecificTestCase(BaseTestCase):
def test_something_specific(self):
self.assertEqual(4, 2 + 2)
这些是测试特定组件的部分:
class MyFirstComponentTestCase(ComponentTestCase):
xmlid = 'component1'
var = 'one'
class MySecondComponentTestCase(ComponentTestCase):
xmlid = 'component2'
var = 'two'
这是一个包含您要测试的XML的合成。
class MyTest(BaseTestSuite):
xmlfile = '<some_xml></some_xml>'
我们定义load_tests以返回包含所有TestSuite
的{{1}}。
TestCase
这种方法有一个限制:您无法从单个Python文件中测试少量XML文件。基本上你可以,但输出不会帮助你识别哪个XML文件坏了。
你的案子有点棘手。 def load_tests(loader, standard_tests, pattern):
return MyTest((
loader.loadTestsFromTestCase(MySpecificTestCase),
loader.loadTestsFromTestCase(MyFirstComponentTestCase),
loader.loadTestsFromTestCase(MySecondComponentTestCase)
))
旨在测试代码,而不是数据。也许validation against XML schema就是你所需要的。