首选的Pythonunit testing框架
到目前为止,我一直在使用内置的unittest模块(pyUnit)来进行Python代码的unit testing。 但是,对于简单的情况,这似乎是矫枉过正。 作为xUnit的一个衍生物,对于Python的dynamic特性来说,看起来有点沉重,在这种情况下,我希望减less写入以达到相同的效果。 另一方面,它是内置的,它使你以有组织的方式编写你的testing,而且是按时间testing的。
我在网上看到的主要select是:
- py.test
- 鼻子
你喜欢哪个框架?为什么?
更新10.12.2011:最近增加了testing自动发现和unit testing(Python 2.7和3.2)中的许多新function,恕我直言,使用外部库的意义不大。
关于doctest:我不认为它是一个unit testing框架本身。 我绝对不会使用它来编写大型应用程序的大套testing。 doctest更适合确保您在文档工作中提供的示例。 它有这个需求的地方,但它不是unit testing,py.test和其他框架的竞争对手。
nose
并不是真正的unit testing框架。 这是一个testing赛跑者,也是一个伟大的赛跑者。 它可以运行使用unittest
, py.test
或doctest
创build的testing。
我最喜欢的unit testing框架是标准的unit testing模块(也称为pyUnit
)。 它类似于其他的xUnit框架,很容易与没有python背景的人联系。 在Eclipse / PyDev中也有很好的支持
在py.test
,我发现多个设置/拆卸级别非常混乱。 我也发现它导致高度的非结构化和难于阅读的unit testing。
对于简单的事情, doctest
是可以的,但是我发现它是非常有限的,并且不能真正扩展到复杂和高度交互的代码。
有趣的是,还没有人回答捍卫py.test 。 在pythontesting邮件列表中,它非常stream行,例如最近的这个线程“你为什么使用py.test? 。 最常见的答复包括:
- 轻松支持分布式testing
- 好的插件架构
- 更简单的断言(只是
assert x == 42
,没有assertEqual()
) - funcargs (自2.3或2.4称为fixtures,有点不同于其他testing框架称为夹具)
我们最初使用unittest和nosetest开始我们的自动化框架。 我们将所有的testing类从unittest中分类出来,因为unittest为断言提供了很好的语法。 对于testing的实际运行,我们使用了在报告方面相当不错的鼻子,并指定了需要运行的testing。 testing生成逻辑也相当不错 – 使用yield方法很容易使用。 testing生成的唯一问题是testing类不能从unittestinheritance – testing生成失败。 只有鼻子断言可以在这里使用。
当我们想要平行testing运行时,我们碰到了鼻子的重大问题 。 当testing平行运行时,报告极其糟糕。 另外,如果您在设置方法中创build了某些资源,那么并行化也会失败,出现奇怪的错误。 使用鼻子平行testing运行似乎非常复杂 – 我们尝试了几乎所有的东西。 最后我们的一个团队成员碰到了py.test。 在很短的时间内,他能够对一套30个testing进行必要的修改,以便并行运行。 他开始奔跑,令他惊讶的是,从过去的75分钟的logging中,以15分钟的成绩获得胜利。 他能够以最less的努力和麻烦顺利地运行所有30个testing。 这个语法也很简单,报道非常棒 – 远远超出了鼻框架的报告。
所以我想说赢得的组合是unit testingpy.test。
我只是使用标准的unit testing。 不知道你会如何有效地用另一种风格编写testing – 也许每个testing都在一个函数中,但是如何处理setup / teardown?
nose2已经取代了鼻子,并支持参数化testing ,这意味着你可以用不同的参数运行相同的断言。 这使您可以用更less的代码覆盖更多的场景。
unittest.TestCase
是一个类。 随意使用您自己的附加function对其进行分类,使您可以“less写入以达到相同的效果”。
我同意,鼻子的一个最好的特点是它的插件系统。 例如,当Google App Engine启动时,我开始学习Python,并且几乎立即就有一个Nose插件来支持GAE。 所以,插件的鼻子帮助我从一开始就用GAE这样的新平台开始testing驱动的开发。 覆盖插件在我准备好的时候也在那里。
鼻子最好的function之一是它的插件系统:例如,覆盖率插件显示你的代码被unit testing覆盖了多less。 在写了大量的unittests之后,看看你的代码有多less不被覆盖….
如果你想保持你的unit testing接近代码,总会有doctest 。
HTH
我认为这是一个真正的select问题。 我已经使用了所有主要的testing框架,归结到哪一个你认为用较less的代码来完成这项工作。 也就是说,我更喜欢doctest。