微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python unittest多个mixins

我正在尝试编写一种测试某些XML文件方法. XML文件描述了科学分析程序的输入,其中可以定义各种参数.我想为我的XML文件编写单元测试,所以我知道程序配置正确.

我目前正在将其作为一个带有基本测试类的库,其中包含各种测试和一些子组件的mixin.但子组件重复了很多次,所以我希望测试对每个组合运行一次,例如:

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.

…现在,对于每个分析,可以使用不同的参数定义许多组件.我希望能做到这样的事情 –

 class MyFirstComponentMixin(ComponentMixin):
      xmlid = 'component1'
      var = 'one'

 class MySecondComponentMixin(ComponentMixin):
      xmlid = 'component2'
      var = 'two'

 class MyTest(BaseTest, MyFirstComponentMixin, MySecondComponentMixin, unittest.TestCase):
      xmlfile = '...'

…但问题是test_var只会为component2而不是component2调用.有没有办法绕过这个或更好的解决方案?

解决方法:

正如你在评论中所建议的那样:组合是你的问题比继承更好的解决方案.我们的想法是为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以返回包含所有TestCase的TestSuite.

def load_tests(loader, standard_tests, pattern):
    return MyTest((
        loader.loadTestsFromTestCase(MySpecificTestCase),
        loader.loadTestsFromTestCase(MyFirstComponentTestCase),
        loader.loadTestsFromTestCase(MySecondComponentTestCase)
    ))

这种方法一个限制:您无法从单个Python文件中测试少量XML文件.基本上你可以,但输出不会帮助你识别哪个XML文件被破坏.

你的情况有点棘手. unittest旨在测试代码,而不是数据.也许validation against XML schema就是你所需要的.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。