如何比较两个嵌套数据结构以进行单元测试?

时间:2013-02-11 16:23:32

标签: python unit-testing python-3.x nested data-comparison

对于那些了解perl的人,我正在寻找类似于Python中Test::Deep::is_deeply()的东西。

Python's unittest中,如果我希望它们相等,我可以方便地比较嵌套数据结构:

self.assertEqual(os.walk('some_path'),
                 my.walk('some_path'),
                 "compare os.walk with my own implementation")

但是,在通缉测试中,os.walk元组的相应子列表中的文件顺序无关紧要。

如果只是这一个测试,可以编写一个简单的解决方案。但我设想对不同结构的嵌套数据进行多次测试。我希望得到一个普遍的解决方案。

我查看了Python自己的unittest documentation,查看了pyUnitnose and it's plugins。主动维护也是使用的一个重要方面。

我的最终目标是拥有一组描述性类型,例如UnorderedIterableSubsetOfSupersetOf等,可以调用它们来描述嵌套数据结构,然后使用该描述来比较两个实际的数据集。

在os.walk示例中,我想要像:

comparison = OrderedIterable(
               OrderedIterable(
                 str,
                 UnorderedIterable(),
                 UnorderedIterable()
               )
             )

以上描述了list(os.walk())将返回的数据结构的类型。为了比较单元测试中的数据A和数据B,当前路径名称将被转换为str(),并且将比较dir和文件列表而忽略订单:

self.assertDeep(A, B, comparison, msg)

那里有什么吗?或者人们自己编写这样一个微不足道的任务?我觉得这样做很舒服,但我不想重新发明,特别是不想编写完整的正交类型集,对它们进行测试等等。总之,我不会发布它,因此下一个有重写......

2 个答案:

答案 0 :(得分:4)

Python Deep似乎是重新实现perl的Test :: Deep的项目。它由Test :: Deep本人的作者撰写。最后的发展发生在2016年初。

更新(2018年/ 8月):最新版本(2016/2月)位于PyPi/Deep

我做了一些P3k porting work on github

答案 1 :(得分:1)

不是解决方案,而是当前实施的解决方法,以解决问题中列出的特定示例:

    os_walk = list(os.walk('some_path'))
    dt_walk = list(my.walk('some_path'))
    self.assertEqual(len(dt_walk), len(os_walk), "walk() same length")
    for ((osw, osw_dirs, osw_files), (dt, dt_dirs, dt_files)) in zip(os_walk, dt_walk):
        self.assertEqual(dt, osw, "walk() currentdir")
        self.assertSameElements(dt_dirs, osw_dirs, "walk() dirlist")
        self.assertSameElements(dt_files, osw_files, "walk() fileList")

我们可以从这个示例实现中看到相当多的代码。正如我们所看到的,Python的unittest 具有所需的大部分成分。