news 2026/3/6 4:09:48

Pytest——》pytest+allure+excel(V2.0)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Pytest——》pytest+allure+excel(V2.0)

1、层级结构

2、/datas/files/test_case.xlsx sheet:student

3、/common/readcases.py

import openpyxl class ReadCase(object): def __init__(self, filename): self.filename = filename # 加载excel self.wb = openpyxl.load_workbook(self.filename) def read_sheetname(self, sheetname): # 获取工作表 sheet = self.wb[sheetname] # 将生成器转换为列表 sheetdatas = list(sheet.values) # 获取第一行标题作为key keys = sheetdatas[0] # 从第二行开始获取value values = sheetdatas[1:] # 定义一个空的列表 case_list = [] # 遍历获取到的用例参数值 for value in values: case_list.append(zip(keys, value)) return case_list if __name__ == '__main__': ReadCase("../datas/files/test_case.xlsx").read_sheetname("student") #可在当前页面执行验证

4、/config/config.py

import os.path class Config(object): project_path = os.path.split(os.path.split(__file__)[0])[0] # __file__获取当前文件的绝对路径 if __name__ == '__main__': print(os.path.split(os.path.split(__file__)[0])[0]) print(os.path.join(Config.project_path, "datas/files/test_case.xlsx"))

5、/case/test_student.py

import pytest import requests, allure from PytestApiExcel.config.config import Config from PytestApiExcel.common.readcases import ReadCase class TestStudent(object): # 调用文件读取的方法,获取excel文件中,sheet页名为login的文件用例数据 case_data = ReadCase(Config.project_path + "/datas/files/test_case.xlsx").read_sheetname("student") # 减少登录次数 def setup_class(self): self.r = requests.session() login_r = self.r.request("POST", url="http://localhost/login", data={"username": "test", "password": "123456"}) assert login_r.json().get("msg") == "login-pass" # 通过数据参数化的方式,用“case”进行接收 @pytest.mark.parametrize("case", case_data) def test_student(self, case): allure.dynamic.epic(case.get("板块")) # 动态获取一级目录 allure.dynamic.feature(case.get("模块")) # 动态获取二级目录 allure.dynamic.story(case.get("客户管理")) # 动态获取三级目录 allure.dynamic.title(f'{case.get("用例编号")}_{case.get("用例标题")}') # 动态获取标题 if case.get("是否执行") != "是": pytest.skip("用例跳过执行!") search_r = self.r.request(case.get("请求方法"), case.get("请求地址"), **eval(case.get("请求参数"))) # 请求参数是字典套字典形式,利用eval进行解包——》数据形式(data={},{},{}) # 美化alluer报告获取详细的请求响应日志 allure.attach(str(search_r.request.url), "请求地址", attachment_type=allure.attachment_type.TEXT) allure.attach(str(search_r.request.method), "请求方法", attachment_type=allure.attachment_type.TEXT) allure.attach(str(search_r.request.headers), "请求header", attachment_type=allure.attachment_type.TEXT) allure.attach(str(search_r.request.body), "请求body", attachment_type=allure.attachment_type.TEXT) allure.attach(str(search_r.status_code), "响应状态码", attachment_type=allure.attachment_type.TEXT) allure.attach(str(search_r.headers), "响应header", attachment_type=allure.attachment_type.TEXT) allure.attach(str(search_r.text), "响应body", attachment_type=allure.attachment_type.TEXT) # 从case中获取响应的body,用冒号分割,最大分割一次 # 分割的两部分分别赋值给how、what how, what = case.get("预期响应body").split(":", maxsplit=1) # 判断是否为json if how == "json": # 如果是,就将what的数据通过eval转化为字典形式 expect = eval(what) # 将字典形式的数据进行遍历,取出对应的key、value for key, value in expect.items(): # 根据响应结果中的key获取value,断言响应的value与预期的value值是否相等 assert search_r.json().get(key) == value elif how == "contains": assert what in search_r.text elif how == "json_len": expect = eval(what) for key, value in expect.items(): if key == "gt": assert len(search_r.json()) > int(value) elif key == "eql": assert len(search_r.json()) == int(value) else: raise TypeError(f"你传入的json长度判断方法[{key}]不支持!") else: raise TypeError(f"你填写的断言方法[{how}不支持!]")

6、runner

import pytest import subprocess allure_result=r"D:\Study\pythonProject\PytestApiExcel\report\allure_result" #存放结果数据的 allure_html=r"D:\Study\pythonProject\PytestApiExcel\report\allure_html"#存放html报告的 pytest.main(["-k case","-v","-s",f"--alluredir={allure_result}","--clean-alluredir"]) #2.调用命令生成报告 subprocess.run(f"allure generate {allure_result} -o {allure_html} --clean",shell=True,universal_newlines=True) #阻塞式的,等待报告生成
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/4 7:27:39

Fast-GitHub浏览器插件:一键解决GitHub访问难题的终极方案

Fast-GitHub浏览器插件:一键解决GitHub访问难题的终极方案 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 国内开发者在…

作者头像 李华
网站建设 2026/3/3 20:02:28

ncmdumpGUI:终极ncm格式处理方案,让加密音乐重获自由

你是否曾经为网易云音乐的ncm加密格式而烦恼?无法在其他设备上播放心爱的音乐?ncmdumpGUI正是为解决这一痛点而生的Windows图形界面工具,它能快速处理ncm文件并将其转换为通用音频格式,真正实现音乐的自由跨平台播放。 【免费下载…

作者头像 李华
网站建设 2026/3/5 15:53:48

手把手教你挑选适合的COB封装LED灯珠品牌方案

如何科学挑选COB封装LED灯珠?从技术本质到品牌实战选型全解析为什么越来越多的高端照明项目都在用COB?如果你最近参与过商业空间、工业厂房或博物馆级别的照明设计,可能已经注意到一个趋势:传统的SMD LED正在被一种更紧凑、更高亮…

作者头像 李华
网站建设 2026/3/4 4:41:10

轻松解锁WeMod Pro:完全免费获取游戏会员功能的替代方案 [特殊字符]

想要体验WeMod Pro的全部高级功能吗?WeMod修改工具让你无需付费即可畅享游戏辅助工具的所有特权。无论你是新手玩家还是资深游戏爱好者,这款开源解决方案都能帮助你安全高效地实现游戏功能增强。 【免费下载链接】Wemod-Patcher WeMod patcher allows yo…

作者头像 李华
网站建设 2026/2/22 2:27:45

抖音批量下载实用技巧:零基础小白也能掌握的下载方法

还在为手动保存抖音视频而烦恼吗?想要一键批量下载喜欢的创作者所有作品?今天我要为你介绍一款抖音批量下载工具的详细使用指南!无论你是内容创作者、研究者还是普通用户,这款工具都能让你的视频收集工作变得轻松高效。 【免费下载…

作者头像 李华
网站建设 2026/3/5 3:07:22

终极网易云音乐美化插件:打造沉浸式播放体验

终极网易云音乐美化插件:打造沉浸式播放体验 【免费下载链接】refined-now-playing-netease 🎵 网易云音乐沉浸式播放界面、歌词动画 - BetterNCM 插件 项目地址: https://gitcode.com/gh_mirrors/re/refined-now-playing-netease 想要让你的网易…

作者头像 李华