12

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

谢谢-丹尼尔

编辑:任何人都可以提供参考说明文档测试不应该取代单元测试吗?

4

6 回答 6

21

当我多年前开始我的gmpy项目时,我 (ab) 使用doctest了 .上次我用它来测量覆盖率时,我的覆盖率超过了 95%)。我为什么这样做?因为是全新的,就像以前一样,我很想知道我能把它推到多远。unittestdoctestgmpy

答:确实很远——但绝对不值得(新奇感消失了,但你不想重写所有测试,这就是为什么 gmpy 的测试仍然是全文档测试的原因)。doctest 的极端脆弱性,即使是消息中最微小的错字修复也会破坏测试,当它们以这种方式被滥用时真的很麻烦。这有点像基于将输出与“黄金”(已知良好)预期输出进行比较的传统集成测试:第一次编写很容易,但在修复无偿测试损坏几年后,您会在闲暇时后悔;- )。

如果你觉得unittest's 的风格很繁琐,还有其他优秀的替代品仍然适用于单元测试,例如py.testnose——实际上是为了不同的目的(支持文档,而不是通用单元测试),而当然值得将您为文档目的编写的任何文档测试添加到您的测试电池中,用它替换单元测试的测试维护头痛是不值得的。doctest

于 2010-04-15T04:33:42.080 回答
6

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

从某种意义上说,您可以将文档测试视为单元测试的一个子集,至少从功能的角度来看是这样。

然而,python 文档建议使用 doctests 来完成以下操作:

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

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

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

我想像集成测试这样的文档测试会更难编写。但是,正如您在 python 和 Django 上看到的那样——它们广泛使用了 doctest,从而产生了更易于理解的文档和教程。

这完全取决于您的项目。没有“正确”的测试方法。

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

于 2010-04-15T02:11:46.603 回答
5

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

于 2010-04-15T07:33:42.980 回答
4

doctests 非常适合某些用途

  • 工作和最新的文档
  • 嵌入在文档字符串中的示例测试
  • 当类 API 不是很清楚时的峰值或设计阶段

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

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

换句话说,至少对于我自己而言,当您专注于解释您正在做什么(文档,还有设计阶段)时,文档测试非常有用,但当您打算将测试用作重构或代码的安全带时,它会增加负担覆盖范围。

于 2010-04-15T07:53:40.383 回答
0

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

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

于 2010-04-15T02:07:55.433 回答
0

我认为这是思考文档测试的错误方式。Doctests 是文档。它们补充了常规的单元测试。将 doctests 视为碰巧被测试的文档示例。文档测试应该在那里向人类用户说明该功能。单元测试应该测试所有代码,甚至是极端情况。如果您为极端案例或数十个 doctest 添加 doctest,那只会使您的 docstring 难以阅读。

于 2013-05-09T01:44:33.523 回答