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

cfi*_*cfi 6 python unit-testing nested data-comparison python-3.x

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

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

self.assertEqual(os.walk('some_path'),
                 my.walk('some_path'),
                 "compare os.walk with my own implementation")
Run Code Online (Sandbox Code Playgroud)

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

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

我检查了Python自己的unittest文档,查看了pyUnit,以及它的鼻子和它的插件.主动维护也是使用的一个重要方面.

对我来说,最终的目标是将有一组描述性的类型,如UnorderedIterable,SubsetOf,SupersetOf,等这才叫来形容一个嵌套的数据结构,然后用这样的描述比较两个实际的数据集.

在os.walk示例中我喜欢以下内容:

comparison = OrderedIterable(
               OrderedIterable(
                 str,
                 UnorderedIterable(),
                 UnorderedIterable()
               )
             )
Run Code Online (Sandbox Code Playgroud)

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

self.assertDeep(A, B, comparison, msg)
Run Code Online (Sandbox Code Playgroud)

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

cfi*_*cfi 5

Python Deep似乎是一个重新实现 perl 的 Test::Deep 的项目。它是 Test::Deep 的作者自己写的。最后一次开发发生在 2016 年初。

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

我在github上做了一些P3k移植工作


cfi*_*cfi 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")
Run Code Online (Sandbox Code Playgroud)

正如我们从这个示例实现中看到的,代码量相当大。我们还可以看到,Python 的单元测试拥有大部分所需的成分。