Python:Does';单元测试&x27;有一些';博士测试';没有';T

Python:Does';单元测试&x27;有一些';博士测试';没有';T,python,unit-testing,doctest,Python,Unit Testing,Doctest,问题很清楚。。。但是请注意,我不是在问功能比较(已经有很多了),也不是在问你更喜欢哪一个 我自己对doctest有一个明确的偏好,我在任何事情上都使用doctest,即使它们不用于文档。但我想知道的是:有什么可以用UnitTest做而不能用DoctTest做的吗?DoctTest仅限于每个函数(或每个类)的测试。你不能做诸如获取一个函数的输出并用另一个函数进行尝试等事情。它最好用于“示例”类型测试(即如何使用此函数?) 单元测试可能比doctest更大、更复杂。有一种普遍的误解,认为doctes

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


我自己对doctest有一个明确的偏好,我在任何事情上都使用doctest,即使它们不用于文档。但我想知道的是:有什么可以用UnitTest做而不能用DoctTest做的吗?

DoctTest仅限于每个函数(或每个类)的测试。你不能做诸如获取一个函数的输出并用另一个函数进行尝试等事情。它最好用于“示例”类型测试(即如何使用此函数?)


单元测试可能比doctest更大、更复杂。

有一种普遍的误解,认为doctest是用来测试代码的。doctest用于测试您的文档。doctest旨在测试您的文档是否与函数/类/模块实际执行的操作相匹配,并在文档中的示例代码随着模块的发展而过时时向您发出警告

虽然doctest可能会揭示代码中的bug,但这并不是它的主要目的(例如,代码的更改可能会揭示unittest的testcase代码中的bug,但测试testcase代码不是unittest的主要目的)

即使这些不用于文件编制

docstring由help()函数自动提取出来,成为您的文档
功能/类别/模块;不能使文档字符串不是文档。您的模块/函数/类的用户(或几天后您)可能会尝试对您的函数/类/模块执行help(),并惊讶地发现文档是一堆代码。

有些测试需要设置和初始化数据库之类的东西

这可能会使医生们:

  • 非常冗长(因此不好 文件);及
  • 可能效率低下,因为在doctests中通常会设置 为每个函数或类更新数据库。相比之下, 单元测试更容易使用 同一个数据库可以测试许多功能 或者上课

    • 有些测试场景DOCTEST不能很好地涵盖。这没关系,因为正如Lie指出的,doctest并不意味着是一个全面的测试解决方案——它们旨在确保文档中简单的交互式提示样式示例(包括docstring)不会过时

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

      doctest可能是其中的一部分,但它们不是一个完整的测试解决方案(除了小的、相对独立的操作)


      可能值得浏览Python自己的测试套件(test包)并查看其中的一些测试。虽然doctest扮演着他们的角色,但大部分都是使用
      unittest

      编写的。事实并非如此,您可以控制doctest的执行上下文。。。例如,创建一些在同一模块中的所有测试之间共享的变量。因此,无需对所有函数重复相同的操作。事实上,甚至有一种简单的方法可以对一个模块中的所有可调用项使用共享执行上下文:事实并非如此,您还可以将所有doctest写入单独的文件中,并做任何您想做的事情。您也可以。+1“允许您取消对Python在决定如何编写测试套件方面的全部功能的记忆“这是真的。。。我从未想过这一点。一旦您开始进行涉及多个模块之间交互的场景测试,
      unittest
      提供的额外功能的好处肯定会更加明显
      doctest
      可以处理底层模块的简单单元测试,而不需要太多依赖项,但它很难处理需要更多依赖项的测试(例如,stdlib中的许多网络测试实际上是在另一个线程中启动测试服务器。创建和销毁服务器的代码可以在
      unittest
      中的测试之间轻松共享,但在
      doctest
      中更难)这很难,但不是很难…您基本上可以编写一个包含共享测试实用程序代码的模块testutils.py。在我正在做的项目中,我实际上就是这样做的(“在另一个线程中启动测试服务器”)。您所说的是一个非常好的观点,但忘记了所有这些(老实说)你不认为编写doctest更酷、更好、更自然吗?我认为
      doctest
      是一个很酷的模块,是更全面的测试套件中有用的一部分,但我认为在测试套件中使用
      unittest
      而不使用
      doctest
      比其他方式更可行。但实际上,整个谈话,这让我想到,有时我也会在没有太多意义的地方使用Doctest……也许我应该在某些情况下再次开始使用unitest。这种误解显然非常普遍,以至于它延伸到了官方文档中,其中指出,“Doctest也是回归测试的一个优秀工具。”