Python doctest中的多行语句

21

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

例如,以下内容在doctest中无法正常工作:

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

我需要从doctest中执行上述三个语句。
2个回答

34
您可能做错了什么。以下是正确的示例。
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

-3

编辑:我的答案是错误的;请参考下面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不适用于多行语句。感谢您提供的信息。 - Rajesh Kumar
好的,你并不一定非要使用 doctest 进行所有测试。 - kindall
此外,您可以将测试编写为一个函数,然后从“doctest”中调用该函数。 - kindall
1
这不是真的。Doctest实际上测试返回值和输出。 - raacer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接