我正在尝试开始使用Python进行单元测试,我想知道是否有人可以解释doctest和unittest的优点和缺点。
您将使用哪些条件?
答案 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
模块提供DoctTestSuite
和DocFileSuite
方法,分别从模块或文件创建与单元测试兼容的测试套件。
所以我使用两者并且通常使用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很好,否则它们会使代码混乱太多。