具有随机输出的函数的文档测试

edd*_*313 5 python doctest

我有一个函数可以将一些随机字符串打印到控制台,例如:

from random import choice

def hello():
    print(f"Hello {choice(('Guido', 'Raymond'))}!")
Run Code Online (Sandbox Code Playgroud)

请注意,我的实际功能比这更复杂。随机部分是对数据库的请求,可能成功也可能失败。这意味着我无法初始化种子以获得恒定的结果。

我尝试的是使用省略号,但我还需要添加一个丑陋的注释,以便 doctest 识别它。

def hello():
    """
    >>> hello()  # doctest: +ELLIPSIS
    Hello ...!
    """
    print(f"Hello {choice(('Guido', 'Raymond'))}!")
Run Code Online (Sandbox Code Playgroud)

在这种情况下有更好的策略吗?

例如,如果我可以测试答案是否为Hello Guido!和之间的一个,而不是省略号,那就太好了Hello Raymond!

wja*_*rea 3

您可以使用 regex:Hello 后跟GuidoRaymond后跟感叹号和换行符:Hello (Guido|Raymond)!\n

然而,捕获标准输出并运行正则表达式对于文档测试来说是很多噪音。因此,最好在文档字符串中给出一个示例,但跳过对其进行测试,并使用不同的测试系统,例如 pytest,它具有捕获 stdout 的内置方法。例如:

from random import choice

def hello():
    """
    >>> hello()  # doctest: +SKIP
    Hello Raymond!
    """
    print(f"Hello {choice(('Guido', 'Raymond'))}!")
Run Code Online (Sandbox Code Playgroud)
import re

def test_hello(capsys):
    hello()
    captured = capsys.readouterr()
    assert re.fullmatch(r'Hello (Guido|Raymond)!\n', captured.out)
Run Code Online (Sandbox Code Playgroud)