Can python doctest ignore some output lines?
With doctest.ELLIPSIS
, you can use ...
to mean "match any string here". You can set doctest
options with a doctest directive, to make it active for just one test case: one example in the online docs is:
>>> print range(20) # doctest:+ELLIPSIS[0, 1, ..., 18, 19]
If you want a doctest option to be active throughout, you can pass it as the optionflags=
argument to whatever doctest functions you use, e.g. doctest.testfile
. (You can pass multiple option flags there by using the |
operator to bit-or them).
Responding to questions about "how can we ignore the whole line": yes, the fact that "..." also looks like a continuation like makes it hard to ignore the entire output. You can use "#doctest: +SKIP" if you just want to skip the example entirely, but that won't work if you are relying on its side-effects. If you really need to do this, I suppose you could monkey-patch the doctest module itself, though I wouldn't particularly recommend it:
>>> import doctest>>> doctest.ELLIPSIS_MARKER = '-etc-'>>> print 12 # doctest: +ELLIPSIS-etc-
(this test passes.)
Or you could temporarily suppress stdout and/or 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__
(this test also passes.)
Ignoring the whole line is bit tricky though. Here:
""">>> do_your_thing() #doctest:+ELLIPSIS..."""
The triple dot will be interpreted as line continuation, and cause a syntax error.
If you want to ignore the whole line, you'll need something like:
""">>> sys.stdout.write('skip from here '); do_your_thing() #doctest:+ELLIPSISskip from here ..."""