Python - doctest与unittest

Sea*_*ean 154 python comparison doctest unit-testing

我正在尝试开始使用Python进行单元测试,我想知道是否有人可以解释doctest和unittest的优点和缺点.

你会用什么条件?

Bri*_*ian 170

两者都很有价值.我使用doctest和nose代替unittest.我将doctest用于测试提供实际用作文档的用法示例的情况.一般来说,我不会将这些测试全面,仅仅是为了提供信息.我实际上反过来使用doctest:不是根据我的doctest测试我的代码是否正确,而是根据代码检查我的文档是否正确.

原因是我发现全面的doctests会使你的文档混乱得太多,所以你最终会得到不可用的文档字符串或者不完整的测试.

对于实际测试代码,目标是彻底测试每个案例,而不是通过示例来说明是什么,这是一个不同的目标,我认为其他框架可以更好地满足这些目标.

  • 有更少的样板,我发现测试(和读取)更简单.编写测试的低启动成本(即只写一个"test_foo()"函数并继续)也有助于抵制在确定测试之前执行有趣代码位的诱惑. (28认同)
  • 我认为这是一个很棒的答案. (6认同)
  • 考虑到这个答案的时代,可能值得一提的是,旧版单元测试的大部分"样板"基本消失了.我仍然更喜欢Nose,但这几乎是一个折腾. (6认同)
  • 为什么要使用鼻子超过unittest? (5认同)
  • 仅供参考,鼻子在过去几年中一直处于“维护模式”,并且可能会停止所有开发(没有第三方干预)。它的维护者建议新项目使用替代方案。 (2认同)

S.L*_*ott 47

我几乎完全使用unittest.

有一段时间,我会把一些东西放在doctest可以使用的文档字符串中.

95%的测试用例是单元测试.

为什么?我喜欢让文档字符串更短,更重要.有时,测试用例有助于澄清文档字符串.大多数情况下,应用程序的测试用例对于文档字符串来说太长了.


Jas*_*ker 32

doctesting的另一个优点是,您可以确保您的代码完成文档所说的功能.一段时间后,软件更改可以使您的文档和代码执行不同的操作.:-)

  • 来自我的+1 - 优点 (6认同)

dal*_*ogm 25

我是一名生物信息学家,我编写的大部分代码都是"一次,一个任务"的脚本,代码只运行一次或两次,执行一个特定的任务.

在这种情况下,编写大型单元测试可能过度,而doctests是一种有用的折衷方案.它们编写速度更快,并且由于它们通常包含在代码中,因此它们可以始终关注代码的行为方式,而无需打开其他文件.这在编写小脚本时很有用.

此外,当您必须将脚本传递给非编程专家的研究人员时,doctests非常有用.有些人发现很难理解单元测试的结构; 另一方面,doctests是一个简单的使用示例,因此人们可以复制并粘贴它们以了解如何使用它们.

所以,要恢复我的答案:当您必须编写小脚本时,以及必须将它们传递给非计算机科学家的研究人员时,doctests非常有用.

  • "当你必须编写小脚本时,以及必须通过它们或将它们展示给非计算机科学家的研究人员时,doctests非常有用." 优点.我做同样的事情,非python程序员总是惊讶于文档可以执行. (6认同)

Gre*_*ill 13

如果您刚刚开始使用单元测试的想法,我会首先考虑doctest它,因为它使用起来非常简单.它自然也提供了一定程度的文档.对于更全面的测试doctest,您可以将测试放在外部文件中,这样就不会使文档混乱.

我建议unittest如果你来自使用JUnit或类似的东西的背景,你希望能够以与其他地方相同的方式编写单元测试.

  • 我受到了这方面的鼓励(`doctest`开头),但最终后悔了.对于非平凡的测试用例,我丢失了编辑器的语法高亮和自动完成功能.当测试在一个单独的文件中时,我无法再直接从编辑器中运行它 - 我每次都必须将上下文更改回相应的源文件. (3认同)

Ton*_*les 7

我只使用unittest; 我认为doctest过多地混淆了主模块.这可能与编写全面的测试有关.


dav*_*avr 7

使用两者是一个有效且相当简单的选项.该doctest模块提供了分别从模块或文件创建与单元测试兼容的测试套件的方法DoctTestSuiteDocFileSuite方法.

所以我使用两者并且通常使用doctest进行简单测试,其中的函数需要很少或不需要设置(参数的简单类型).我实际上认为一些doctest测试有助于记录功能,而不是减损它.

但是对于更复杂的情况,以及更全面的测试用例集,我使用unittest来提供更多的控制和灵活性.


rah*_*hmu 6

我不使用doctest作为unittest的替代品.虽然它们有点重叠,但这两个模块没有相同的功能:

  • unittest用作单元测试框架,这意味着它可以帮助我快速确定任何修改对其余代码的影响.

  • 我用来doctest保证评论(即docstrings)仍然与当前版本的代码相关.

我得到的测试驱动开发的广泛记录的好处unittest.doctest解决了过时评论误导维护代码的更微妙的危险.