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

StackOverflow https://stackoverflow.com/questions/1024411

  •  06-07-2019
  •  | 
  •  

Вопрос

Я бы хотел написать такой доктест, как этот:

"""
>>> 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"
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top