如何在中间终止python 2 doctest文件?

时间:2012-03-19 13:37:29

标签: python doctest scenarios

有时仅运行大型doctests文件的第一部分会很有用。

在代码更改后第一部分断开的情况很多,我想只运行第一部分,直到它通过,然后再次运行整个文件。

我还没找到一个简单的方法来做到这一点。

假设我用这个文件开始我的doctests:

#!/usr/bin/env python
import doctest
doctest.testfile("scenario.rst")

而scenario.rst看起来像这样:

>>> 'hello world'
'hello world'

>>> exit()

>>> 'this should not be processed anymore'

... lots of lines

>>> 'this should also not be processed'

在这个例子中,我使用exit()函数来演示我的意思,当然它不起作用,因为它被视为一个例外,doctest愉快地将其视为可以测试的事物的一部分:

**********************************************************************
File "_scenario.rst", line 10, in _scenario.rst
Failed example:
    exit()
Exception raised:
    Traceback (most recent call last):
      File "c:\Python27\lib\doctest.py", line 1254, in __run
        compileflags, 1) in test.globs
      File "<doctest _scenario.rst[1]>", line 1, in <module>
        exit()
      File "c:\Python27\lib\site.py", line 372, in __call__
        raise SystemExit(code)
    SystemExit: None
**********************************************************************
File "_scenario.rst", line 12, in _scenario.rst
Failed example:
    'this should not be processed anymore'
Expected nothing
Got:
    'this should not be processed anymore'
**********************************************************************
1 items had failures:
   2 of   3 in _scenario.rst
***Test Failed*** 2 failures.

那么这样的doctest文件怎么能在中间终止呢?

编辑:有+ SKIP指令,但它只跳过一行。我需要一些能够跳过文件其余部分的内容。

3 个答案:

答案 0 :(得分:4)

这就是我的所作所为:我插入

>>> 'ERROR'

在我要停止doctest文件的位置,然后我要求我的测试运行器启用doctest.REPORT_ONLY_FIRST_FAILURE标志(zope.testrunner是bin/test -1)。

也许这就足够了

>>> 'ERROR'  # doctest: +REPORT_ONLY_FIRST_FAILURE
在doctest文件中。

就个人而言,我不喜欢doctest.testfile。我更喜欢创建一个doctest.DocFileSuite(),将一堆这些组合成一个unittest.TestSuite(),然后使用unittest.TextTestRunner()或类似的东西运行它们。我通常在创建DocFileSuite对象时添加optionflags=doctest.REPORT_ONLY_FIRST_FAILURE,因为我真的很喜欢这个选项。

答案 1 :(得分:3)

>>> raise KeyboardInterrupt

will stop一个Doctest,与其他所有例外不同

就个人而言,我认为KeyboardInterrupt异常是针对doctest的,因为SystemExit异常属于Python的其余部分。

答案 2 :(得分:0)

根据this bug report,目前有2种解决方法:

  • Replace >>> with >>
  • 拆分文档字符串,并在第二部分前添加“ dont_test =”之类的内容;字符串成为语句的一部分,不会被解析。