问答 pytest 读取的结果为什么不对

江南 · 2024年11月15日 · 最后由 江南 回复于 2024年11月18日 · 4048 次阅读

collect_yaml.yaml

公共参数

case_common:
allureEpic: 开发平台接口
allureFeature: 收藏模块
allureStory: 删除收藏网站接口

def read_cases_by_path_name(yaml_name, file_path=None):
    """
    读取测试用例
    :param file_path: 文件路径
    :param yaml_name: 文件名
    :return: 返回获取结果
    """
    INFO.logger.info("加载{}/{}文件...........".format(file_path, yaml_name))

    full_path = os.path.join(file_path or os.getcwd(), yaml_name)

    with open(full_path, mode='r', encoding='utf-8') as f:
        value = yaml.safe_load(f)

    INFO.logger.info("读取到的数据===》{}".format(value))
    return value

@user1ize('case_info', read_cases_by_path_name('collect_yaml.yaml'))
def test_yaml_file(self, case_info):
    print(f'case_info内容{case_info}')

为什么运行 test_yaml_file 时,打印的结果是 case_common,而不是 case_common:
allureEpic: 开发平台接口
allureFeature: 收藏模块
allureStory: 删除收藏网站接口。 read_cases_by_path_name('collect_yaml.yaml')) 这里调用的时候,read_cases_by_path_name 打印的结果是 case_common:
allureEpic: 开发平台接口
allureFeature: 收藏模块
allureStory: 删除收藏网站接口。

共收到 8 条回复 时间 点赞


testhome 有 BUG,此段代码解析错误,不要考虑我贴错了


collect_yaml.yaml 内容

3楼 已删除

转变一下是这样的

@pytest.mark.parametrize('case_info', {'case_common': {'allureEpic': '开发平台接口', 'allureFeature': '收藏模块', 'allureStory': '删除收藏网站接口'}})
    def test_yaml_file(self, case_info):
        print(case_info)

结果:

官方文档是这样的

你想要的结果是这样的

@pytest.mark.parametrize('case_info',  [{'case_common': {'allureEpic': '开发平台接口', 'allureFeature': '收藏模块', 'allureStory': '删除收藏网站接口'}}])
    def test_yaml_file(self, case_info):
        print(case_info)

结果:

value = yaml.safe_load(f)

改为

value = yaml.load(yaml_data, Loader=yaml.FullLoader)

试试,我是这样写的没遇到问题

yaml 文件里应该加入一个"-"代表列表,不加代表字典,pytest 的 parametrize 可以理解成跟 for 语句一样,只会遍历字典的键,所以不加"-"只会读取 case_common。以下是效果图:

yaml 文件:

难以怀瑾 回复

试过,看着没有改变,还是不对

Eric Chan 回复

感谢讲解,如果不改变 yaml 文件内容的情况下,如何读取到 allureEpic: 开发平台接口
allureFeature: 收藏模块
allureStory: 收藏网址接口

@pytest.mark.parametrize('case_info', read_cases_by_path_name('collect_yaml.yaml', '/test_case/dsw'))
def test_yaml_file(self, case_info):
print(f'case_info 内容{case_info}')

zhanghg 回复

感谢,提供了先把 yaml 转换为 JSON 读取的思路

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册