可以蟒蛇文档测试忽略了一些输出线?(Can python doctest ignore some o

2019-06-23 19:29发布

我想编写一个文档测试:

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

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

谢谢!

Answer 1:

随着doctest.ELLIPSIS ,你可以使用...表示“在这里匹配任何字符串”。 您可以设置doctest选项与文档测试指令,以激活它只是一个测试案例:在一个例子在线文档是:

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

如果你想有一个文档测试选项,在被激活,你可以将它作为optionflags=参数无论您使用的文档测试功能,例如doctest.testfile 。 (您可以通过那里传递多个选项标志|运营商位或它们)。



Answer 2:

在回答有关问题:“我们怎么能忽略整条生产线”:是的,事实上,“......”看起来也像是像一个延续使得它很难忽略整个输出。 您可以使用“#doctest:+ SKIP”如果你只是想完全跳过的例子,但如果你是依靠其副作用,这是行不通的。 如果你真的需要做到这一点,我想你可以猴子补丁文档测试模块本身,但我不会特别推荐一下:

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

(此测试通过)。

或者你可以暂时抑制stdout和/或标准错误:

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

(该测试也通过。)



Answer 3:

忽略整条生产线是有点棘手,但。 这里:

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

三重点会被解释为续行,并导致一个语法错误。

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

"""
>>> sys.stdout.write('skip from here '); do_your_thing() #doctest:+ELLIPSIS
skip from here ...
"""


Answer 4:

我发现它很容易直接分配不需要返回值给一个变量:

>>> _ = do_something()
>>> check_something()
True


Answer 5:

你可以写之前和你的函数(马克霍瓦特的答案黑客的启发)后的元组:

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


Answer 6:

我能在一个Python文档测试该行的开头省略号? 介绍了如何创建一个使用一个额外的字符串作为一个省略号的自定义输出检查。 这将让你写的下面,同时仍然使用“...”在别处。

def foo():
  """
  >>> foo() # doctest: +ELLIPSIS
  [...] world
  """
  print "hello world"


文章来源: Can python doctest ignore some output lines?