Python - doctest与unittest

时间:2008-12-12 01:50:19

标签: python unit-testing comparison doctest

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

您将使用哪些条件?

11 个答案:

答案 0 :(得分:164)

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

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

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

答案 1 :(得分:45)

我几乎完全使用unittest。

有一段时间,我会把一些东西放在doctest可以使用的docstring中。

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

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

答案 2 :(得分:30)

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

答案 3 :(得分:25)

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

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

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

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

答案 4 :(得分:13)

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

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

答案 5 :(得分:7)

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

答案 6 :(得分:7)

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

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

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

答案 7 :(得分:6)

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

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

  • 我使用doctest作为保证,评论(即文档字符串)仍然与当前版本的代码相关。

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

答案 8 :(得分:4)

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

答案 9 :(得分:3)

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不会区分。

答案 10 :(得分:2)

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

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