繁体   English   中英

Python doctest是否消除了对单元测试的需求?

[英]Does Python doctest remove the need for unit-tests?

我所参与的项目的开发人员认为,doctests与单元测试一样好,并且如果一段代码被证明,则不需要进行单元测试。 我不相信这是事实。 任何人都可以提供一些可靠的,理想上引用的例子来支持或反对doctests取代单元测试需求的论点吗?

谢谢-Daniel

编辑:任何人都可以提供一个参考,表明doctesting不应该取代单元测试?

我(ab)使用doctest代替unittest ,当我多年前开始我的gmpy项目时 - 你可以浏览它的源代码并看到所有功能都经过doctests的彻底测试(功能由C编码的Python扩展提供) ,上次我为覆盖测量进行了检测,我的覆盖率超过了95%)。 我为什么这样做? 因为doctest是全新的,就像gmpy ,我gmpy知道我能推动多远。

答:确实非常 - 但绝对不值得(新奇感消失,但你不想重写所有的测试,这就是为什么gmpy的测试仍然是全文测试的原因)。 医生的极端脆弱性,即使在信息中最微小的拼写错误也会破坏测试,当他们被这种方式滥用时,真的很麻烦。 这有点像传统的集成测试,基于比较输出和“黄金”(已知良好)的预期输出:第一次容易写,但在几年修复无偿测试中断后你会悠闲地忏悔; - )。

如果您发现unittest的风格繁重,但是也有一些仍然意味着用于单元测试等优良替代品,如py.test鼻子 - doctest的真正含义用于不同的目的(支持文档,而不是普通的单元测试)虽然它当然值得为你的测试电池添加你为文档目的编写的任何doctests,但是用它替换单元测试的测试维护难题是值得的。

确实没有支持或反对doc测试的论据。 它们只是测试。 事实上,从python 2.4开始,有一种方法可以从你的doctests创建单元测试服: http ://docs.python.org/library/doctest.html#unittest-api

从某种意义上说,你可以将doc-tests视为单元测试的一个子集,至少从功能的角度来看。

但是python文档建议使用doctests来实现以下目的:

  • 文档中的示例
  • 回归测试
  • 编写教程文档

他们的论点是,如果你在文档中编写测试,你将被迫编写更好的文档和测试。 与单独编写单元测试相反 - 您很少添加足够的文档,并且它们往往会停滞不前并且过时。

请参阅: http//docs.python.org/library/doctest.html#soapbox

我认为doctests更难为集成测试这样的事情写作。 但是,正如您在python和Django上看到的那样 - 他们广泛使用doctests,从而产生更易理解的文档和教程。

这一切都取决于你的项目。 没有“正确”的方法来测试。

另外,我建议您查看Code Complete 2本书,因为您可能会发现单元测试不是确保您的软件无故障的最佳方法。

Python标准库中有一个具体的例子,说服我单独的doctests并不总是足够的,即decimal模块。 它有超过60000个单独的测试用例(在Lib / test / decimaltestdata中); 如果所有这些都被重写为doctests,十进制模块确实会变得非常笨拙。 测试数量可能会减少,同时仍能提供良好的覆盖率,但许多数值算法都非常复杂, 需要大量的单独测试才能涵盖所有可能的分支组合。

doctests非常适合某些用途

  • 工作和最新的文件
  • 样本测试嵌入在docstrings中
  • 当类API不是很清楚时,峰值或设计阶段

不同情况下的单元测试更好:

  • 当你需要清晰而有些复杂的设置/拆卸时
  • 当试图更好地覆盖所有案例时,包括角落案件
  • 保持测试彼此独立

换句话说,至少对我自己来说,当你专注于解释你正在做的事情(文档,还有设计阶段)时,doctests很棒,但当你打算将测试用作重构或代码的安全带时,更多的负担覆盖。

我认为这是考虑doctests的错误方式。 Doctests是文档。 它们补充了常规单元测试。 将doctests视为恰好经过测试的文档示例。 应该在那里用doctests来说明人类用户的功能。 单元测试应该测试所有代码,甚至是极端情况。 如果您为角落案例或几十个doctests添加doctests,那么这将使您的文档字符串难以阅读。

可以使用doctests实现完整的单元测试套件。 但是,doctests有点受限,通常最好保留简单的文档示例,并使用更强大的单元测试框架(例如unittest )进行真实详细的单元测试。

unittest另一个优点是测试框架对于来自使用JUnit,NUnit或类似的不同开发环境的人来说是熟悉的。 doctest模块略有不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM