[英]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非常适合某些用途
不同情况下的单元测试更好:
换句话说,至少对我自己来说,当你专注于解释你正在做的事情(文档,还有设计阶段)时,doctests很棒,但当你打算将测试用作重构或代码的安全带时,更多的负担覆盖。
我认为这是考虑doctests的错误方式。 Doctests是文档。 它们补充了常规单元测试。 将doctests视为恰好经过测试的文档示例。 应该在那里用doctests来说明人类用户的功能。 单元测试应该测试所有代码,甚至是极端情况。 如果您为角落案例或几十个doctests添加doctests,那么这将使您的文档字符串难以阅读。
可以使用doctests实现完整的单元测试套件。 但是,doctests有点受限,通常最好保留简单的文档示例,并使用更强大的单元测试框架(例如unittest
)进行真实详细的单元测试。
unittest
另一个优点是测试框架对于来自使用JUnit,NUnit或类似的不同开发环境的人来说是熟悉的。 doctest
模块略有不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.