news 2026/5/28 10:02: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/5/21 16:10:08

5分钟掌握语音转文字神器:告别手敲字幕的时代

你是否曾经为了给视频配字幕而熬夜到凌晨?是否因为会议录音整理而心力交瘁?今天,让我们一起解锁一款真正改变工作方式的语音转文字工具,让这些烦恼从此成为历史。 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Too…

作者头像 李华
网站建设 2026/5/21 16:11:00

Modbus TCP调试实战:从通信异常到高效测试的终极指南

Modbus TCP调试实战:从通信异常到高效测试的终极指南 【免费下载链接】ModBusTcpTools 一个Modbus的C#开发示例,运用HslCommunication.dll组件库实现,包含了一个服务端的演示和一个客户端演示,客户端可用于进行Modbus测试&#xf…

作者头像 李华
网站建设 2026/5/21 16:09:56

Zwift离线骑行完整教程:简单快速搭建你的专属训练空间

Zwift离线骑行完整教程:简单快速搭建你的专属训练空间 【免费下载链接】zwift-offline Use Zwift offline 项目地址: https://gitcode.com/gh_mirrors/zw/zwift-offline 还在为网络不稳定而中断骑行训练烦恼吗?想随时随地享受Zwift的虚拟骑行乐趣…

作者头像 李华
网站建设 2026/5/20 9:49:43

通过Keil实现工控安全联锁逻辑的系统学习

从零开始掌握工控安全联锁:用Keil打造高可靠嵌入式系统在一次现场调试中,某自动化产线突然停机。排查发现,是操作员误触了防护门开关——但问题在于,按理说这个动作应该触发安全连锁、立即切断动力输出。然而系统延迟了近200ms才响…

作者头像 李华
网站建设 2026/5/22 12:41:13

炉石传说自动化脚本:新手5分钟快速上手终极指南

炉石传说自动化脚本:新手5分钟快速上手终极指南 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本)(2024.01.25停更至国服回归) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Scri…

作者头像 李华
网站建设 2026/5/20 10:50:10

10-1 tlm2:temporal decoupling(时间解耦) UVM-TLM2 读-改-写最小验证环境概述0

文章目录 原始代码及log 📌 UVM-TLM1最小可运行示例:APB读-改-写流程概述 🧩 核心组件与角色定位 🧠 代码级深度解析 1. APB事务对象:`apb_rw.sv`(封装操作细节) 2. TLM发起方:`initiator.sv`(发起读改写) 3. TLM目标方:`target.sv`(响应读写请求) 4. 测试环境…

作者头像 李华