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

from random import choice

def hello():
    print(f"Hello {choice(('Guido', 'Raymond'))}!")

请注意,我的实际功能比这复杂得多.随机部分是对数据库的请求,可以成功,也可以失败.这意味着我不能将种子初始化为具有恒定的结果.

我try 使用省略号,但我还需要添加一个难看的注释,以便doctest识别它.

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

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

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

推荐答案

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

然而,capturing the stdout和运行正则表达式对于文档测试来说是一个很大的噪音.因此,最好在文档字符串BUT skip testing it中给出一个例子,并使用不同的测试系统,如拥有a builtin way to capture stdout的PYTEST.例如:

from random import choice

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

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

Python相关问答推荐

FastAPI:使用APIRouter路由子模块功能

脚注在Python中使用regex导致错误匹配

如何使用关键参数按列对Pandas rame进行排序

Django文件上传不起作用:文件未出现在媒体目录或数据库中

如何编写一个正规表达式来查找序列中具有2个或更多相同辅音的所有单词

有条件地采样我的大型DF的最有效方法

在Python中对分层父/子列表进行排序

Python daskValue错误:无法识别的区块管理器dask -必须是以下之一:[]

SQLGory-file包FilField不允许提供自定义文件名,自动将文件保存为未命名

追溯(最近最后一次调用):文件C:\Users\Diplom/PycharmProject\Yolo01\Roboflow-4.py,第4行,在模块导入roboflow中

Polars:用氨纶的其他部分替换氨纶的部分

无法使用DBFS File API路径附加到CSV In Datricks(OSError Errno 95操作不支持)

如何创建一个缓冲区周围的一行与manim?

使用Python更新字典中的值

Python列表不会在条件while循环中正确随机化'

如何启动下载并在不击中磁盘的情况下呈现响应?

Pandas Data Wrangling/Dataframe Assignment

pandas:对多级列框架的列进行排序/重新排序

导入错误:无法导入名称';操作';

Django Table—如果项目是唯一的,则单行