我有一个函数可以将一些随机字符串打印到控制台,例如:
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!。
您可以使用 regex:Hello 后跟Guido或Raymond后跟感叹号和换行符: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)