2012-03-19 4 views
4

Иногда бывает полезно запустить только первую часть большого файла доктрины.Как завершить файл-релиз python 2 в середине?

Существует много ситуаций, когда первая часть ломается после изменения кода, я хотел бы запустить только первую часть, пока она не пройдет, а затем снова запустите весь файл.

Я еще не нашел простой способ сделать это.

Скажем, я начинаю с 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' 

В этом примере я использую функцию выхода(), чтобы продемонстрировать, что Я имею в виду, что это не работает, потому что это рассматривается как исключение, которое доктрино счастливо видит как часть чего-то, что он может проверить:

********************************************************************** 
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. 

Итак, как можно завершить такой файл досье в середине?

EDIT: есть директива + SKIP, но она пропускает только одну строку. Мне нужно что-то, что пропускает остальную часть файла.

ответ

2
>>> raise KeyboardInterrupt 

Этого will stop Doctest в любой точке, в отличие от всех других исключений

Лично я считаю, что KeyboardInterrupt исключения к doctest как исключение SystemExit является остальным Python.

+0

спасибо. Итак, согласно исходному файлу по адресу http: //hg.python.org/cpython/file/ab05e7dd2788/Lib/doctest.py # l1286 это единственное исключение, которое останавливает доктрину. – mit

+0

Поведение может быть неопределенным при мигании – jalanb

0

Согласно this bug report в настоящее время существует 2 обходные пути:

  • Replace >>> with >>
  • расколоть строку документации, и добавить что-то вроде "dont_test =" перед второй части; строка становится частью инструкции и не будет анализироваться.
4

Вот что я делаю: я вставляю

>>> 'ERROR' 

в точке, где я хочу, чтобы остановить doctest файл, а затем я прошу мой тестовый бегуна, чтобы включить флаг doctest.REPORT_ONLY_FIRST_FAILURE (с синца. testrunner - bin/test -1).

Возможно, было бы достаточно, чтобы сделать

>>> 'ERROR' # doctest: +REPORT_ONLY_FIRST_FAILURE 

внутри doctest файла.

Лично я не люблю doctest.testfile. Я предпочитаю создать doctest.DocFileSuite(), объединить их в unittest.TestSuite(), а затем запустить их все с unittest.TextTestRunner() или что-то в этом роде. И я обычно добавляю optionflags=doctest.REPORT_ONLY_FIRST_FAILURE, когда создаю объекты DocFileSuite, так как мне действительно нравится этот параметр.

+0

блестящий ответ, спасибо – mit