38

我想写一个这样的doctest:

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

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

谢谢!

4

6 回答 6

47

使用doctest.ELLIPSIS,您可以...用来表示“匹配此处的任何字符串”。您可以doctest使用 doctest 指令设置选项,使其仅对一个测试用例有效:在线文档中的一个示例是:

>>> print range(20) # doctest:+ELLIPSIS
[0, 1, ..., 18, 19]

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

于 2009-06-21T18:03:19.713 回答
17

回答有关“我们如何忽略整行”的问题:是的,事实上,“...”也看起来像一个延续,因此很难忽略整个输出。如果您只想完全跳过该示例,则可以使用“#doctest: +SKIP”,但如果您依赖它的副作用,那将不起作用。如果你真的需要这样做,我想你可以对 doctest 模块本身进行猴子补丁,但我不会特别推荐它:

>>> import doctest
>>> doctest.ELLIPSIS_MARKER = '-etc-'
>>> print 12 # doctest: +ELLIPSIS
-etc-

(此测试通过。)

或者您可以暂时抑制标准输出和/或标准错误:

>>> # 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__

(这个测试也通过了。)

于 2012-02-22T18:33:27.373 回答
11

不过,忽略整行有点棘手。这里:

"""
>>> do_your_thing() #doctest:+ELLIPSIS
...
"""

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

如果你想忽略整行,你需要类似的东西:

"""
>>> sys.stdout.write('skip from here '); do_your_thing() #doctest:+ELLIPSIS
skip from here ...
"""
于 2012-02-22T17:27:29.660 回答
10

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

>>> _ = do_something()
>>> check_something()
True
于 2014-03-20T15:29:32.253 回答
6

您可以在函数之前和之后编写元组(灵感来自 Mark Horvath 的回答):

def foo():
    """
    >>> ();foo();() # doctest: +ELLIPSIS
    (...)
    """
    print "Hello world"
    return "Hello world"
于 2015-10-28T20:27:08.923 回答
0

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

def foo():
  """
  >>> foo() # doctest: +ELLIPSIS
  [...] world
  """
  print "hello world"
于 2012-09-01T10:39:45.197 回答