【问题标题】:Multiline statements using Python doctest使用 Python doctest 的多行语句
【发布时间】:2015-05-26 03:00:10
【问题描述】:

是否可以使用 python doctest 处理多行语句?

例如,以下在 doctest 中不起作用:

>>> for s in [1,2,3]:
...     for t in [4,5,6]:
...         print(s*t)

我需要从doctest中执行以上三个语句。

【问题讨论】:

    标签: python doctest


    【解决方案1】:

    你可能做错了什么。下面是正确的例子。

    test.py:

    """
    >>> for s in [1,2,3]:
    ...     for t in [4,5,6]:
    ...         print s*t
    4
    5
    6
    8
    10
    12
    12
    15
    18
    """
    

    效果很好:

    $ python -m doctest -v test.py
    Trying:
        for s in [1,2,3]:
            for t in [4,5,6]:
                print s*t
    Expecting:
        4
        5
        6
        8
        10
        12
        12
        15
        18
    ok
    1 items had no tests:
        test.print_and_return
    1 items passed all tests:
       1 tests in test
    1 tests in 2 items.
    1 passed and 0 failed.
    Test passed.
    

    另外请注意doctest 捕获返回值和输出:

    def print_and_return():
        """
        >>> print_and_return()
        1
        2
        """
        print(1)
        return 2
    

    任何预期的输出必须紧跟最后的'>>>'或'...' 包含代码的行,并且预期的输出(如果有)扩展到 下一个 '>>> ' 或全空白行。

    https://docs.python.org/2/library/doctest.html#how-it-works

    【讨论】:

      【解决方案2】:

      编辑:我的回答是错误的;请参阅下面raacer 的评论。我无法删除它,因为它是公认的答案。

      doctest 不是这样工作的。它测试一个计算为一个值的表达式;它不捕获和测试输出。因此,您要做的是创建一个可以测试的列表,您可以使用列表推导式在一行中轻松完成:

      >>> [s * t for s in [1, 2, 3] for t in [4, 5, 6]]
      [4, 5, 6, 8, 10, 12, 12, 15, 18]
      

      【讨论】:

      • 但是在我的项目中,如果 doctest 出现问题,那么它会显示 HTTP 401 错误,所以我只需要使用 doctest 模块来工作。如果它不起作用,那么我需要在单个语句中提出所有内容,这变得非常复杂。对我来说,doctest 不适用于多行语句。感谢您提供信息。
      • 好吧,您没有理由必须使用doctest 进行所有测试。
      • 另外,你可以把你的测试写成一个函数,然后从doctest调用它。
      • 这不是真的。 Doctest 实际上测试了返回值和输出。
      猜你喜欢
      • 2011-06-23
      • 2015-09-11
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多