我想写一个像这样的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:+ SKIP”。如果你只是想完全跳过这个例子,但是如果你依赖它的副作用那就行不通。如果真的需要这样做,我想你可以修补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

你可以在你的功能之前和之后写元组(黑客的灵感来自Mark Horvath的答案):

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

我可以在Python doctest的行尾添加省略号吗?解释了如何创建使用附加字符串作为省略号的自定义输出检查器。这可以让你写下面的内容,同时在其他地方仍然使用'...'。

def foo():
  """
  >>> foo() # doctest: +ELLIPSIS
  [...] world
  """
  print "hello world"
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top