2009-06-21 7 views
22

Я хотел бы написать doctest так:Может ли python doctest игнорировать некоторые выходные строки?

""" 
>>> print a.string() 
      foo : a 
      bar : b 
     date : <I don't care about the date output> 
      baz : c 
""" 

Есть ли способ сделать это? Я думаю, что было бы разумнее переключиться на unittest, но мне любопытно, можно ли указать диапазон вывода, который не должен быть сопоставлен для теста в doctest.

Спасибо!

ответ

31

С doctest.ELLIPSIS, вы можете использовать ..., чтобы означать «соответствовать любой строке здесь». Вы можете установить doctest варианты с директивой doctest, чтобы сделать его активным только один тестовый пример: один из примеров в online docs является:

>>> print range(20) # doctest:+ELLIPSIS 
[0, 1, ..., 18, 19] 

Если вы хотите вариант doctest быть активным в течение, вы можете передать его в качестве аргумент optionflags= о любых функциях доктрины, которые вы используете, например doctest.testfile. (Вы можете передать несколько флажков параметров там, используя оператор | для бит или их).

+1

Но как мы можем игнорировать всю строку? –

+1

@ t0ster, просто поставьте '...' как весь «ожидаемый результат» (с учетом, конечно, 'doctest.ELLIPSIS'), и doctest примет любой контент на этой выходной строке, т. Е.«игнорировать всю строку» вывода. –

+5

«игнорировать всю строку», как указано выше, не работает, так как doctest смущает многоточие с продолжением (python) предыдущей строки. Я не мог найти никакого способа игнорировать всю линию. Фактически, я искал «игнорировать весь результат». –

4

Игнорирование всей строки немного сложнее. Здесь:

""" 
>>> do_your_thing() #doctest:+ELLIPSIS 
... 
""" 

Тройная точка будет интерпретироваться как продолжение строки и вызвать синтаксическую ошибку.

Если вы хотите игнорировать всю строку, вам нужно что-то вроде:

""" 
>>> sys.stdout.write('skip from here '); do_your_thing() #doctest:+ELLIPSIS 
skip from here ... 
""" 
+0

Спасибо, это полезный взлом! –

8

Отвечая на вопросы о том, «как мы можем игнорировать всю строку»: да, тот факт, что»... »также выглядит как продолжение, так как трудно игнорировать весь вывод. Вы можете использовать «#doctest: + SKIP», если вы просто хотите полностью пропустить этот пример, но это не сработает, если вы полагаетесь на его побочные эффекты. Если вы действительно нужно сделать это, я полагаю, вы могли бы обезьяна патч doctest сам модуль, хотя я бы не особенно рекомендую: (. Этот тест проходит)

>>> import doctest 
>>> doctest.ELLIPSIS_MARKER = '-etc-' 
>>> print 12 # doctest: +ELLIPSIS 
-etc- 

Или вы может временно подавить стандартный вывод и/или STDERR: (. этот тест также проходит)

>>> # Suppress stdout 
>>> import sys 
>>> class DevNull: 
...  def noop(*args, **kwargs): pass 
...  close = write = flush = writelines = noop 
>>> sys.stdout = DevNull() 
>>> # Run a test and ignore output (but we need its side effects) 
>>> print 12 # NOTE: stdout is suppressed! 
>>> # Restore stdout 
>>> sys.stdout = sys.__stdout__ 

0
Can I have an ellipsis at the beginning of the line in a Python doctest?

ехр как создать настраиваемую проверку вывода, которая использует дополнительную строку как многоточие. Это позволит вам написать следующее, в то время как все еще используется «...» в другом месте.

def foo(): 
    """ 
    >>> foo() # doctest: +ELLIPSIS 
    [...] world 
    """ 
    print "hello world" 
5

Я нашел, что это проще просто назначить ненужные возвращаемые значения переменный:

>>> _ = do_something() 
>>> check_something() 
True 
+0

простейший, браво – michaelsnowden

1

Вы можете написать кортежи до и после функции (хак вдохновленного ответа Марка Хорвата):

def foo(): 
    """ 
    >>>();foo();() # doctest: +ELLIPSIS 
    (...) 
    """ 
    print "Hello world" 
    return "Hello world"