Может ли python doctest игнорировать некоторые выходные строки?
Вопрос
Я бы хотел написать такой доктест, как этот:
"""
>>> print a.string()
foo : a
bar : b
date : <I don't care about the date output>
baz : c
"""
Есть ли какой-нибудь способ сделать это?Я думаю, было бы разумнее переключиться на unittest, но мне любопытно, возможно ли указать диапазон выходных данных, который не должен быть сопоставлен для теста в doctest.
Спасибо!
Решение
С doctest.ELLIPSIS
, вы можете использовать ...
чтобы означать "сопоставьте любую строку здесь".Вы можете установить doctest
опции с директивой doctest, чтобы сделать ее активной только для одного тестового примера:один из примеров в онлайн - документы является:
>>> print range(20) # doctest:+ELLIPSIS
[0, 1, ..., 18, 19]
Если вы хотите, чтобы параметр doctest был активен повсюду, вы можете передать его как optionflags=
аргумент для любых функций doctest, которые вы используете, например doctest.testfile
.(Вы можете передать туда несколько флагов опций, используя |
оператора к биту-или к ним).
Другие советы
Отвечая на вопросы о том, "как мы можем игнорировать всю строку":да, тот факт, что "..." также выглядит как продолжение, затрудняет игнорирование всего вывода.Вы можете использовать "#doctest:+ПРОПУСТИТЬ", если вы просто хотите полностью пропустить пример, но это не сработает, если вы полагаетесь на его побочные эффекты.Если вы действительно если вам нужно это сделать, я полагаю, вы могли бы вручную исправить сам модуль doctest, хотя я бы не особенно рекомендовал это:
>>> import doctest
>>> doctest.ELLIPSIS_MARKER = '-etc-'
>>> print 12 # doctest: +ELLIPSIS
-etc-
(этот тест пройден.)
Или вы могли бы временно подавить stdout и / или 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__
(этот тест тоже проходит.)
Однако игнорировать всю строку немного сложнее.Здесь:
"""
>>> do_your_thing() #doctest:+ELLIPSIS
...
"""
Тройная точка будет интерпретирована как продолжение строки и вызовет синтаксическую ошибку.
Если вы хотите игнорировать всю строку целиком, вам понадобится что-то вроде:
"""
>>> sys.stdout.write('skip from here '); do_your_thing() #doctest:+ELLIPSIS
skip from here ...
"""
Мне было проще просто присвоить переменной ненужные возвращаемые значения:
>>> _ = do_something()
>>> check_something()
True
Вы можете писать кортежи до и после вашей функции (взлом, вдохновленный ответом Марка Хорвата):
def foo():
"""
>>> ();foo();() # doctest: +ELLIPSIS
(...)
"""
print "Hello world"
return "Hello world"
Могу ли я поставить многоточие в начале строки в доктесте Python? объясняет, как создать пользовательскую программу проверки выходных данных, которая использует дополнительную строку в качестве многоточия.Это позволило бы вам написать следующее, все еще используя '...' в другом месте.
def foo():
"""
>>> foo() # doctest: +ELLIPSIS
[...] world
"""
print "hello world"