6

对于那些了解 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")

但是,在想要的测试中,元组的各个子列表中的文件顺序无关紧要os.walk

如果只是这个测试,那么编写一个简单的解决方案就可以了。但我设想对不同结构的嵌套数据进行几个测试。我希望有一个通用的解决方案。

我检查了 Python 自己的unittest 文档,查看了pyUnit,并查看了nose 和它的 plugins。主动维护也是使用的一个重要方面。

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

在 os.walk 示例中,我想要类似的内容:

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

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

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

外面有什么吗?还是人们自己编写的一项微不足道的任务?我觉得这样做很舒服,但我不想重新发明,特别是不想编写完整的正交类型集、对这些类型的测试等。简而言之,我不会发布它,因此下一个有再次重写...

4

2 回答 2

4

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

更新(2018/Aug):最新版本(2016/Feb)位于PyPi/Deep

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

于 2013-02-12T11:17:45.480 回答
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具有大部分所需的成分。

于 2013-02-11T19:08:55.797 回答