Python:'unittest'是否有“doctest”没有的东西?

时间:2011-04-02 09:23:33

标签: python unit-testing doctest

问题很清楚,但是请注意,我并不是在询问功能比较(已经有很多功能),我也不会问你更喜欢哪一个!

我自己明确偏爱doctests,我将它们用于所有内容,即使这些不用于文档。但我想知道的是:你有什么可以用unitests做的,你不能用doctests做什么???

4 个答案:

答案 0 :(得分:5)

人们普遍存在一种误解,即doctest用于测试代码。 doctest用于测试您的文档。 doctest旨在测试您的文档是否与函数/类/模块实际执行的操作相匹配,并在文档演变过程中文档中的示例代码是否过时时提醒您。

虽然doctest可能会揭示代码中的错误,但它并不是它的主要目的(例如,代码中的更改可能会解决unittest的测试用例代码中的错误,但测试测试用例代码并不是unitetest的主要目的)

  

即使这些不是用于文档

docstring由help()函数自动提取出来,成为您的文档 函数/类/模块;你不能创建文档字符串而不是文档。您的模块/函数/类的用户(或者您在几天内)可能会尝试对您的函数/类/模块执行help(),并且会对文档是一堆代码感到惊讶。

答案 1 :(得分:2)

有一些测试场景,doctests根本不能很好地覆盖。这没关系,因为正如Lie指出的那样,doctests并不是一个全面的测试解决方案 - 它们的目的是确保文档(包括文档字符串)中的简单交互式提示样式示例不会过时。< / p>

另一方面,编写实际的单元测试可以让您在决定如何编写测试套件时无法充分利用Python的全部功能(例如,使用继承不仅可以共享测试设置和拆除操作,还可以实际测试方法)。

doctests可能是其中的一部分,但它们不是一个完整的测试解决方案(除了小的,相对自包含的操作)。

可能值得浏览Python自己的测试套件(test包)并查看其中的一些测试。虽然doctests发挥了作用,但大多数是使用unittest编写的。

答案 2 :(得分:0)

Doctests仅限于每个功能(或每个类)测试。你不能做一些事情,比如获取一个函数的输出并尝试用另一个函数等。它最好用于“示例”类型测试(即我如何使用这个函数?)

单元测试可能比doctests更大,更复杂。

答案 3 :(得分:0)

某些测试需要设置和初始化数据库。

这可以使doctests:

  • 非常详细(因此不太好 文档);和
  • 可能效率低下,因为在您通常设置的doctests中 每个函数或类的数据库。相比下, 单位测试更容易使用 相同的数据库来测试许多功能 或类。