【问题标题】:Can python doctest ignore some output lines?python doctest 可以忽略一些输出行吗?
【发布时间】:2009-06-21 17:54:11
【问题描述】:

我想写一个这样的文档测试:

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

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

谢谢!

【问题讨论】:

    标签: python doctest


    【解决方案1】:

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

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

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

    【讨论】:

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

    回答有关“我们如何忽略整行”的问题:是的,事实上,“...”也看起来像一个延续,因此很难忽略整个输出。如果您只想完全跳过该示例,则可以使用“#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__
    

    (这个测试也通过了。)

    【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

    • 谢谢,这是一个有用的技巧!
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 我最喜欢这个。使用 Mark 的技巧,无需仅为 doctest 导入另一个模块。好主意!
      【解决方案6】:

      Can I have an ellipsis at the beginning of the line in a Python doctest? 解释了如何创建使用附加字符串作为省略号的自定义输出检查器。这将使您可以编写以下内容,同时在其他地方仍使用“...”。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-06
        • 1970-01-01
        • 1970-01-01
        • 2021-05-24
        • 2020-12-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多