问题很清楚,...但是请注意,我不是在询问功能比较(已经有很多),也不是在询问您更喜欢哪一个!
我对文档测试有明确的偏好,我将它们用于所有事情,即使这些不用于文档。但我想知道的是:有没有什么你可以用 unitests 做而你不能用 doctests 做的?
问题很清楚,...但是请注意,我不是在询问功能比较(已经有很多),也不是在询问您更喜欢哪一个!
我对文档测试有明确的偏好,我将它们用于所有事情,即使这些不用于文档。但我想知道的是:有没有什么你可以用 unitests 做而你不能用 doctests 做的?
人们普遍认为 doctest 是为了测试你的代码。doctest 旨在测试您的文档。doctest 旨在测试您的文档是否与函数/类/模块实际执行的操作相匹配,并在文档中的示例代码随着模块的发展而过时时提醒您。
虽然 doctest 可能会揭示代码中的错误,但这不是它的主要目的(例如,代码中的更改可能会揭示 unittest 的测试用例代码中的错误,但测试测试用例代码不是 unitetest 的主要目的)
即使这些不用于文档
文档字符串由 help() 函数自动提取,成为您的函数/类/模块的文档;您不能将文档字符串制作成文档。您的模块/函数/类的用户(或几天后的您)可能会尝试对您的函数/类/模块执行 help() 并惊讶于文档是一堆代码。
有一些测试场景 doctests 根本没有很好地涵盖。没关系,因为正如 Lie 所指出的,文档测试并不是一个全面的测试解决方案——它们旨在确保您的文档(包括文档字符串)中的简单交互式提示样式示例不会过时。
另一方面,编写实际的单元测试允许您在决定如何编写测试套件时释放 Python 的全部功能(例如,使用继承不仅可以共享测试设置和拆除操作,还可以共享实际的测试方法)。
doctests 可能是其中的一部分,但它们不是一个完整的测试解决方案(除了小型的、相对独立的操作)。
可能值得浏览 Python 自己的测试套件(test
包)并查看其中的一些测试。虽然 doctest 发挥了作用,但其中大部分是使用unittest
.
一些测试将需要设置和初始化数据库之类的东西。
这可以进行 doctests:
Doctests 仅限于每个功能(或每个类)测试。你不能做一些事情,比如获取一个函数的输出并用另一个函数尝试它等等。它最好用于“示例”类型测试(即我如何使用这个函数?)
单元测试可以比文档测试更大、更复杂。