对于那些了解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,查看了pyUnit和nose and it's plugins。主动维护也是使用的一个重要方面。
我的最终目标是拥有一组描述性类型,例如UnorderedIterable
,SubsetOf
,SupersetOf
等,可以调用它们来描述嵌套数据结构,然后使用该描述来比较两个实际的数据集。
在os.walk示例中,我想要像:
comparison = OrderedIterable(
OrderedIterable(
str,
UnorderedIterable(),
UnorderedIterable()
)
)
以上描述了list(os.walk())
将返回的数据结构的类型。为了比较单元测试中的数据A
和数据B
,当前路径名称将被转换为str()
,并且将比较dir和文件列表而忽略订单:
self.assertDeep(A, B, comparison, msg)
那里有什么吗?或者人们自己编写这样一个微不足道的任务?我觉得这样做很舒服,但我不想重新发明,特别是不想编写完整的正交类型集,对它们进行测试等等。总之,我不会发布它,因此下一个有重写......
答案 0 :(得分:4)
Python Deep似乎是重新实现perl的Test :: Deep的项目。它由Test :: Deep本人的作者撰写。最后的发展发生在2016年初。
更新(2018年/ 8月):最新版本(2016/2月)位于PyPi/Deep
答案 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 具有所需的大部分成分。