Python-doctest与unittest [关闭]


Answers:


177

两者都很有价值。我用doctest和鼻子代替了unittest。我将doctest用于测试给出了实际用作文档的用法示例的情况。通常,我不会对这些测试进行全面的测试,仅是为了提供信息。我实际上是在反向使用doctest:不是根据doctest来测试我的代码是否正确,而是根据代码来检查我的文档是否正确。

原因是我发现全面的doctest会使您的文档过于混乱,因此您要么会得到不可用的文档字符串,要么会得到不完整的测试。

对于实际测试代码,目标是彻底测试每种情况,而不是通过示例来说明这样做是什么,我认为这是一个不同的目标,我认为其他框架可以更好地实现。


29
样板要少得多,我发现编写(和读取)的测试要简单得多。编写测试的启动成本较低(即只需编写一个“ test_foo()”函数然后执行),还有助于消除在确定测试之前进行有趣的代码位的诱惑。
布赖恩

6
我认为这是一个很棒的答案。
James Brady

您还使用其他哪些测试框架?还是仅仅是鼻子?

6
鉴于这个答案的年代久远,可能值得一提的是,旧版本的单元测试的许多“样板”已基本消失。我仍然也更喜欢Nose,但这几乎是值得一提的。
亚当·帕金

1
过去几年,FYI的鼻子一直处于“维护模式”,并且很可能会停止所有发展(没有第三方的干预)。维护者建议新项目使用替代方案。

48

我几乎只使用unittest。

偶尔,我会在doctest中使用一些东西。

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

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


看到一个例子,您认为适合的docstring东西,不适合的例子,会很酷。我实际上很喜欢docstring,因为它明确显示了如何使用接口,但是同时使用它和单元测试可能不太合适。
user1767754

33

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


6
从我+1到优点

28

我是一名生物信息学家,我编写的大多数代码都是“一次,一项任务”脚本,这些代码将只运行一次或两次,并执行一个特定的任务。

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

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

因此,请恢复我的答案:doctest在必须编写小型脚本以及必须将其传递或展示给非计算机科学家的研究人员时很有用。


6
“当您必须编写小型脚本,以及必须将它们传递或展示给非计算机科学家的研究人员时,doctest很有用。” 好点。我做同样的事情,非Python程序员总是对文档可以执行感到惊讶。
丹尼尔·卡纳斯

14

如果您刚开始使用单元测试的想法,那么我将以doctest它为起点,因为它非常易于使用。它自然也提供了一定程度的文档。并进行更全面的测试doctest,您可以将测试放在一个外部文件中,以免使文档混乱。

我建议unittest如果您来自使用过JUnit或类似工具的背景,那么您希望能够以与其他地方相同的方式编写单元测试。


4
我朝这个方向感到鼓舞(doctest首先),但最终感到遗憾。对于非平凡的测试用例,我失去了编辑器的语法高亮显示和自动完成功能。当测试位于单独的文件中时,我将无法再直接从编辑器中运行它-我将不得不每次将上下文更改回对应的源文件。
2010年

7

我专门使用unittest;我认为doctest会使主模块过于混乱。这可能与编写全面的测试有关。


7

同时使用这是一个有效且相当简单的选择。该doctest模块提供了DoctTestSuiteDocFileSuite方法,分别从模块或文件创建与unittest兼容的测试套件。

因此,我会同时使用doctest和通常使用doctest的简单测试,这些测试需要的功能很少或不需要设置(参数的简单类型)。实际上,我认为一些doctest测试有助于记录功能,而不是削弱功能。

但是对于更复杂的案例和更全面的测试案例,我使用unittest来提供更多的控制和灵活性。


7

我不使用doctest代替unittest。尽管它们有些重叠,但这两个模块却没有相同的功能:

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

  • doctest保证注释(即文档字符串)仍然与当前代码版本相关。

我从中获得了广泛记录的测试驱动开发的好处unittestdoctest解决了过时的注释误导了代码维护的更为微妙的危险。


4

我几乎从不使用doctests。我希望我的代码能够自我记录,并且文档字符串将文档提供给用户。IMO向模块添加了数百行测试,使文档字符串的可读性大大降低。我还发现单元测试更容易在需要时进行修改。


4

Doctest有时会导致错误的结果。特别是当输出包含转义序列时。例如

def convert():
    """
    >>> convert()
    '\xe0\xa4\x95'
    """
    a = '\xe0\xa4\x95'
    return a
import doctest
doctest.testmod()

**********************************************************************
File "hindi.py", line 3, in __main__.convert
Failed example:
    convert()
Expected:
    'क'
Got:
    '\xe0\xa4\x95'
**********************************************************************
1 items had failures:
   1 of   1 in __main__.convert
***Test Failed*** 1 failures. 

也不会检查输出的类型。它只是比较输出字符串。例如,它已经使某种类型的有理数,如果它是一个整数,则它的打印效果类似于整数。然后假设您具有返回有理数的函数。因此,doctest不会区分输出是有理整数还是整数。


5
您可以使用原始文档字符串(r""" ... """)来解决第一个问题。
icktoofay 2013年

在Python 3.4中工作正常。要使其在Python 2.7中也能正常工作,请'\\xe0\\xa4\\x95'在您的文档字符串中使用。
Cees Timmerman 2015年

我还发现unicode字面量也不适用于doctest(即使文件顶部有正确的'coding utf-8'注释行。通常,doctest不如unittest测试得到很好的支持,因此存在一些错误不拿不动。
RichVel

2

我更喜欢基于发现的系统(“ nose”和“ py.test”,目前使用前者)。

当测试也可以作为文档时,doctest很好,否则它们会使代码过于混乱。


鼻子看起来非常有用;我还没有使用它的机会,但是我寄予了厚望:)
Tony Arkles

鼻子是IMO最容易使用的测试框架。它使编写和运行测试用例几乎毫不费力。
卡米尔·基西尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.