python单元测试多个混合

标签 python xml unit-testing

我正在尝试编写一种测试某些 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返回包含所有 TestCaseTestSuite

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正是您所需要的。

关于python单元测试多个混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31421138/

相关文章:

python - 在python中并行化for循环

python - 我什么时候应该(不)想在我的代码中使用 pandas apply() ?

xml - XSLT Concat 字段在一起

ajax - Elm 中的模拟依赖

c# - 如何对这个 C# 扩展方法进行单元测试?

c++ - 如何验证传递给模拟函数的参数的派生类型

python - 为什么我的当前目录没有出现在 Windows 上使用 pytest 的路径中?

python - Keras:使用 flow_from _directory() 函数为两个输入模型创建自定义生成器

c# - 从 C# 调用 web 服务并发送未转义的 xml

java - 我已将 Android API 更新为 23,并且在任何 xml 文件中都没有错误,但是当我尝试构建项目时,这显示 R 无法解析