python doctest可以忽略一些输出行吗?

cjb*_*cjb 31 python doctest

我想写一个像这样的doctest:

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

有没有办法做到这一点?我认为切换到unittest更有意义,但我很好奇是否有可能指定一个输出范围,这个输出不应该与doctest中的测试相匹配.

谢谢!

Ale*_*lli 39

有了doctest.ELLIPSIS,你可以...用来表示"匹配任何字符串".您可以doctest使用doctest指令设置选项,使其仅适用于一个测试用例:在线文档中的一个示例是:

>>> print range(20) # doctest:+ELLIPSIS
[0, 1, ..., 18, 19]
Run Code Online (Sandbox Code Playgroud)

如果您希望doctest选项始终处于活动状态,则可以将其作为optionflags=参数传递给您使用的任何doctest函数,例如doctest.testfile.(您可以通过使用|运算符来传递多个选项标志- 或者它们).

  • "忽略整行"如上所述不起作用,因为doctest将省略号与前一行的(python)延续混淆.我找不到任何方法来忽略整条线.实际上,我一直在寻找"忽略整个输出". (6认同)
  • 但是,我们怎么能忽略整条线呢? (2认同)
  • @ t0ster,只需在整个“预期输出”中放入“ ...”(当然要设置“ doctest.ELLIPSIS”),然后doctest将接受该输出行上的任何内容,即“忽略整个行”输出。 (2认同)
  • @RomanDolgiy 和 phaedrus:如果您不关心副作用,请使用 doctest.SKIP。如果您确实关心副作用,那么就没有很好的解决方案,但在下面的单独答案中,我写了一些方法,可以在您确实需要时使其发挥作用。 (2认同)

Edw*_*per 14

回答有关"我们怎样才能忽略整条线"的问题:是的,"......"看起来像是一个延续,这使得很难忽略整个输出.如果你只是想完全跳过这个例子,你可以使用"#doctest:+ SKIP",但是如果你依赖它的副作用那就不行.如果你真的需要这样做,我想你可以修补doctest模块本身,虽然我不会特别推荐它:

>>> import doctest
>>> doctest.ELLIPSIS_MARKER = '-etc-'
>>> print 12 # doctest: +ELLIPSIS
-etc-
Run Code Online (Sandbox Code Playgroud)

(此测试通过.)

或者你可以暂时压制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__
Run Code Online (Sandbox Code Playgroud)

(这个测试也通过了.)


Mar*_*ath 8

忽略整条线虽然有点棘手.这里:

"""
>>> do_your_thing() #doctest:+ELLIPSIS
...
"""
Run Code Online (Sandbox Code Playgroud)

三点将被解释为行继续,并导致语法错误.

如果你想忽略整行,你需要这样的东西:

"""
>>> sys.stdout.write('skip from here '); do_your_thing() #doctest:+ELLIPSIS
skip from here ...
"""
Run Code Online (Sandbox Code Playgroud)


Wil*_*yor 5

我发现简单地将不需要的返回值分配给变量更容易:

>>> _ = do_something()
>>> check_something()
True
Run Code Online (Sandbox Code Playgroud)


ada*_*tpl 5

您可以在函数之前和之后编写元组(受到 Mark Horvath 回答的启发):

def foo():
    """
    >>> ();foo();() # doctest: +ELLIPSIS
    (...)
    """
    print "Hello world"
    return "Hello world"
Run Code Online (Sandbox Code Playgroud)