Python – doctest与unittest
我试图开始在Pythonunit testing,我想知道是否有人可以解释doctest和unittest的优点和缺点。
你会用什么条件呢?
两者都很有价值。 我使用doctest和nose来代替unittest。 我使用doctest的情况下,testing是提供一个实际上有用的文件作为例子。 一般来说,我不做这些testing的综合性,目的仅仅是为了提供信息。 我有效地使用doctest反向:不要根据我的doctesttesting我的代码是正确的,但要检查我的文档是正确的基于代码。
原因是我发现全面的文档testing会使你的文档杂乱得太多,所以你最终会得到无法使用的文档或者不完整的testing。
为了实际testing代码 ,我们的目标是对每个案例进行彻底的testing,而不是通过例子来说明这是什么,这是我认为其他框架更好地满足的一个不同的目标。
我几乎全部使用unittest。
有一段时间,我会把一些东西放在一个可以被doctest使用的文档string中。
95%的testing用例是unit testing。
为什么? 我喜欢让文档更短,更重要。 有时testing用例有助于澄清文档string。 大多数情况下,应用程序的testing用例对于文档string来说太长了。
文档testing的另一个好处是,你可以确保你的代码完成你的文档所说的工作。 过了一段时间,软件更改可以使您的文档和代码做不同的事情。 🙂
我是一名生物信息学家,我写的大部分代码是“一次一个任务”脚本,只运行一次或两次,执行一个特定任务的代码。
在这种情况下,编写大型的unit testing可能是过度的,文档testing是一个有用的折衷。 它们更快写入,因为它们通常包含在代码中,所以它们允许始终关注代码的行为,而不必打开另一个文件。 编写小脚本时非常有用。
另外,当你不得不把脚本传给一个不擅长编程的研究人员时,doctests是很有用的。 有些人很难理解单位testing是如何组织的; 另一方面,doctests是简单的使用例子,所以人们可以复制和粘贴它们,看看如何使用它们。
所以,要恢复我的答案:当您必须编写小脚本,以及必须将其传递给非计算机科学家的研究人员时,doctests非常有用。
如果你刚刚开始使用unit testing的想法,我会从doctest
开始,因为它非常简单易用。 它自然也提供了一定程度的文档。 而为了使用doctest
进行更全面的testing,您可以将testing放在外部文件中,以免混乱文档。
如果你是来自使用JUnit或类似的背景的话,我会build议你使用unittest
,在那里你可以像在别处一样编写unit testing。
使用这两个是一个有效而相当简单的select。 doctest
模块提供了DoctTestSuite
和DocFileSuite
方法,它们分别从一个模块或文件创build一个unit testing兼容的testing套件。
所以我使用两者,通常使用doctest来进行简单的testing,而function只需要很less的设置或不需要设置(参数的简单types)。 我实际上认为几个doctesttesting帮助loggingfunction,而不是减损它。
但是对于更复杂的情况,对于更全面的testing用例,我使用unittest提供更多的控制和灵活性。
我专门用unit testing; 我认为doctest太多地混淆了主模块。 这可能与编写彻底的testing有关。
我不使用doctest作为unit testing的替代品。 尽pipe它们重叠了一点,但是这两个模块并没有相同的function:
-
我使用
unittest
作为unit testing框架,这意味着它可以帮助我快速确定任何修改对其余代码的影响。 -
我使用
doctest
作为保证评论(即docstrings)仍然与当前版本的代码相关。
testing驱动开发的广泛logging的好处,我从unittest
得到。 doctest
解决了过时的评论误导维护代码的更微妙的危险。
我几乎从来没有使用doctests。 我想我的代码是自我logging,文档string提供文档给用户。 IMO将数百行testing添加到模块使得文档string的可读性差得多。 我也发现unit testing在需要的时候更容易修改。
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.
也不检查输出的types。 它只是比较输出string。 例如,如果它是一个整数,它使得某些types的有理性打印就像整数一样。 那么假设你有一个合理的function。 所以,如果输出是合理的整数或整数,文档testing不会区分。
我更喜欢基于发现的系统(“nose”和“py.test”,使用前者)。
当testing作为一个文档也是很好的时候,doctest是很好的,否则他们往往会混淆代码太多。