Pytest+Allure+Excel接口自动化测试框架实战
1. Allure 简介
简介
Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具,它不仅以 Web 的方式展示了简介的测试结果,而且允许参与开发过程的每个人可以从日常执行的测试中,最大限度地提取有用信息。
Allure 是由 Java 语言开发的,支持 Pytest,JaveScript、PHP、Ruby 等。
- 从 DEV/QA 的角度来看,Allure 提供了详尽的测试报告,比如简化了常见缺陷的统计;失败的测试可以分为 bug 和被中断的测试;还可以配置日志、步骤、fixture、附件、计时、执行历史;以及与 TMS、BUG 管理系统、Jenkins 集成等。所以,通过以上配置,所有负责的开发人员和测试人员可以尽可能地掌握测试信息。
- 从管理者的角度来看,Allure 提供了一个清晰的“大图”,即 High Level 的统计报告,其中包括已覆盖的特性、缺陷聚集的位置、执行时间轴的外观以及许多其他方便的事情。Allure 的模块化和可扩展性保证了你总是能够对某些东西进行微调,使得 Allure 更适合你。
那么下面就来说说如何使报告更加详细的显示我们需要的信息,以及 Allure 与 Jenkins 的集成。
安装
(Windows/Mac 通用安装方法)
下载地址:https://github.com/allure-framework/allure2/releases,下载所需版本的 zip 包。
安装:
- 解压 —> 进入 bin 目录 —> 运行 allure.bat
- 把 bin 目录加入 Path 环境变量
- 配合 pytest,使用 allure2 生成更加精美的测试报告:pip install allure-pytest
运行方法
在测试执行期间收集结果
pytest [测试文件] -s -q --alluredir=./result/ --clean-alluredir
- -s:表示将执行成功的案例日志打印出来
- -q:若跟文件执行路径则代表只需要执行的文件
- --alluredir:指定存储测试结果的路径(若目录不存在则会新建)
- --clean-alluredir:清除历史结果数据
查看测试报告
方式一:用于在本地渲染后对外展示结果
allure serve ./result/
方式二:用于在本地渲染和查看结果
# 生成报告 allure generate ./result/ -o ./report/ --clean # 注意:覆盖路径加 --clean# 打开报告 allure open -h 127.0.0.1 -p 8883 ./report/
注意:/report/ 目录中的 index.html 就是最终的结果页面,但直接通过浏览器打开这个文件是看不到实际报告内容的,这是因为实际报告内容需要 allure 进行渲染后才能看到
这可能是B站最详细的pytest自动化测试框架教程,整整100小时,全程实战!!!
2. Allure 常用特性
场景:
- 希望在报告中看到测试功能,子功能或场景,测试步骤,包括测试附加信息。
解决:
- import allure
- @allure.feature('功能名称')
- @allure.story('子功能名称')
- @allure.title('测试用例名称')
- @allure.step('步骤细节')
- @allure.description('测试用例描述')
- @allure.attach('具体文本信息'):需要附加的信息,可以是数据,文本,图片,视频,网页
- 如果只测试登录功能运行的时候可以加限制过滤,如:pytest 文件名 --allure_features '购物车功能' --allure_stories '加入购物车'
@alllure.feature() 与 @allure.store() 的关系
feature 相当于一个大的功能或模块。将 case 分类到某个 feature 中,并在报告中的 behaviors 中显示,相当于 testsuite。
story 相当于分支功能/模块,属于 feature 之下的结构,并在报告中的 features 中显示,相当于 testcase。
feature 与 story 类似于父子关系。
@allure.step() 与 with allure.step() 的区别
- 测试过程中每个步骤,一般放在具体逻辑方法中。
- 可以放在关键步骤中,在报告中显示。
- 在 App、Web 自动化测试当中,建议每切换到一个新的页面当做一个 step。
- 用法:
- @allure.step():只能以装饰器的形式放在类或者方法上。
- with allure.step():可以放在测试用例方法里面,但测试步骤的代码需要被该语句包含。
给测试用例划分优先级
场景:
通常测试有冒烟测试、回归测试、线上验证测试等,那么就需要按照重要性级别来分别执行,比如上线时要把主流程和重要模块都跑一遍。
解决:
- 通过附加 pytest.mark 标记描述
- 通过 allure.feature、allure.story 标记描述
- 通过 allure.severity 直接标记用例级别
根据测试用例的重要性划分测试用例等级,如果没指定等级,默认为 NORMAL 级别:
- BLOCKER:阻塞缺陷(功能未实现,无法下一步)
- CRITICAL:严重缺陷(功能点缺失)
- NORMAL:一般缺陷(边界情况,格式错误)
- MINOR:次要缺陷(界面错误与ui需求不符)
- TRIVIAL:轻微缺陷(必须项无提示,或者提示不规范)
步骤:
- 在方法、函数和类上面加:@allure.severity(allure.severity_level.TRIVIAL)
- 指定执行对应级别的用例:pytest -s -v 文件名 --allure-severities normal, critical
给 Allure 测试报告添加内容(图片、附件、文本、截图、HTML 等)
场景:
- 前端自动化测试经常需要附加图片或 html,比如在适当的地方、适当的时机截图等。
解决:
- @allure.attach() 显示许多不同类型的提供的附件,可以补充测试、步骤或测试结果。
步骤:
- 在测试报告里附加网页:
- 格式:allure.attach(body(内容), name, attachment_typeextension)
- 示例:allure.attach('<head>/head><body>首页</body>', '这是错误页的结果信息', allure.attachment_type.HTML)
- 在测试报告里附加图片:
- 格式:allure.attach.file(source, name, attachment_type, extension)
- 示例:allure.attach.file("./result/b.png", attachment_type=allure.attachment_type.PNG)
集成测试管理系统
@allure.link()、@allure.issue()、@allure.testcase() 主要是为了将 Allure 报告和测试管理系统集成,可以更快速地跳转到公司内部地址。
先看看三个装饰器的源码:
def link(url, link_type=LinkType.LINK, name=None):return safely(plugin_manager.hook.decorate_as_link(url=url, link_type=link_type, name=name))def issue(url, name=None):return link(url, link_type=LinkType.ISSUE, name=name)def testcase(url, name=None):return link(url, link_type=LinkType.TEST_CASE, name=name)
小结
- issue() 和 testcase() 其实调用的也是 link(),只是 link_type 不一样。
- 必传参数 url:跳转的链接。
- 可选参数 name:显示在 Allure 报告的名字,如果不传就是显示完整的链接(建议传,不然可读性不高)。
- 可以理解成:三个方法是一样的,我们都提供跳转链接和名字,只是链接的 type 不一样,最终显示出来的样式不一样而已(type 不一样,样式不一样)。
- 如果你喜欢,只用 @allure.link() 也可以。
- 而出现三个装饰器的原因是为了更好地将链接进行分类(访问链接、Bug 链接、测试用例链接)。
代码示例
import allureTEST_CASE_LINK = 'https://github.com/qameta/allure-integrations/issues/8#issuecomment-268313637'@allure.link('https://www.youtube.com/watch?v=4YYzUTYZRMU')
def test_with_link():pass@allure.link('https://www.youtube.com/watch?v=Su5p2TqZxKU', name='点击我看一看youtube吧')
def test_with_named_link():pass@allure.issue('140', 'bug issue链接')
def test_with_issue_link():pass@allure.testcase(TEST_CASE_LINK, '测试用例地址')
def test_with_testcase_link():pass
运行结果,查看 Allure 报告
3. 接口自动化测试框架示例
完整工程:https://github.com/juno3550/InterfaceAutoTestWithPytest
测试方法示例
1 import pytest2 import allure3 import logging4 from util.assert_util import assert_keyword5 from util.request_util import api_request6 from util.global_var import *7 from util.excel_util import excel_util8 9
10 register_test_data = excel_util.get_sheet_data("注册")
11 login_test_data = excel_util.get_sheet_data("登录")
12
13
14 @allure.feature("登录模块")
15 @pytest.mark.dependency(name="TestLoginModule")
16 class TestLoginModule:
17
18 @allure.story("注册功能")
19 @allure.title('用户注册') # 指定测试用例标题,默认是函数名
20 @allure.description('通过接口进行用户注册') # 添加测试用例描述
21 @allure.severity(allure.severity_level.BLOCKER) # 阻塞级别
22 @pytest.mark.run(order=1)
23 @pytest.mark.parametrize('case_data', register_test_data)
24 def test_register(self, case_data):
25 with allure.step("读取请求数据,调用接口"):
26 logging.info("接口用例数据:%s" % case_data)
27 response = api_request(case_data[API_IP], case_data[API_URI], case_data[REQUEST_METHOD],
28 case_data[API_REQUEST_DATA], case_data[RESPONSE_EXTRACT_VAR],
29 case_data[REQUEST_HEADER], case_data[REQUEST_COOKIE])
30 with allure.step("获取响应数据,进行断言"):
31 assert_keyword(response, case_data[RESPONSE_ASSERT_KEYWORD])
32
33 @allure.story("登录功能")
34 @allure.title('用户登录') # 指定测试用例标题,默认是函数名
35 @allure.description('通过接口进行用户登录') # 添加测试用例描述
36 @allure.severity(allure.severity_level.BLOCKER) # 阻塞级别
37 @pytest.mark.run(order=2)
38 @pytest.mark.parametrize('case_data', login_test_data)
39 def test_login(self, case_data):
40 with allure.step("读取请求数据,调用接口"):
41 logging.info("接口用例数据:%s" % case_data)
42 response = api_request(case_data[API_IP], case_data[API_URI], case_data[REQUEST_METHOD],
43 case_data[API_REQUEST_DATA], case_data[RESPONSE_EXTRACT_VAR],
44 case_data[REQUEST_HEADER], case_data[REQUEST_COOKIE])
45 with allure.step("获取响应数据,进行断言"):
46 assert_keyword(response, case_data[RESPONSE_ASSERT_KEYWORD])
47
48
49 if __name__ == "__main__":
50 test_dir = os.path.dirname(__file__)
51 pytest.main(['-s', '-q', test_dir, '--alluredir', '../test_result/', "--clean-alluredir"])
52 os.system('allure generate ../test_result/ -o ../test_report/ --clean')
53 os.system('allure open -h 127.0.0.1 -p 8881 ../test_report/')
测试数据示例
Allure 报告结果示例
相关文章:

Pytest+Allure+Excel接口自动化测试框架实战
1. Allure 简介 简介 Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具,它不仅以 Web 的方式展示了简介的测试结果,而且允许参与开发过程的每个人可以从日常执行的测试中,最大限度地提取有用信息。 Allure 是由 Java 语言开发…...
阿里云国际版账号注册常见问题汇总
公司现与阿里云国际站达成战略合作,为客户提供高品质、高性能、高可用的阿里云产品与服务,助力客户用云服务创造更多价值,达成业务转型、加速和创新,全面提升业务竞争力。助企业在各种业务场景中充分利用混合云基础设施进行优化。…...

Flowable基础
简介 Flowable 是 BPMN 的一个基于 java 的软件实现,不过 Flowable 不仅仅包括 BPMN ,还有 DMN 决策表和 CMMN Case 管理引擎,并且有自己的用户管理、微服务 API 等一系列功能, 是一个服务平台。 官方手册: https://…...

力扣热门100题之合并区间【中等】
题目描述 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入:interv…...
机会成本:隐形的手,驱动你的选择
机会成本这个词不知道你有没有听说过。 机会成本是指在面临多方案择一决策时,被舍弃的选项中的最高价值者。换句话说,机会成本是一种失去的收益,不是实际支付的成本。 机会成本是经济学中一个非常重要的概念,它可以帮助我们更好地…...

win10日程怎么同步到安卓手机?电脑日程同步到手机方法
在如今快节奏的生活中,高效地管理时间变得至关重要。而对于那些经常在电脑上安排日程的人来说,将这些重要的事务同步到手机上成为了一个迫切的需求。因为目前国内使用win10系统电脑、安卓手机的用户较多,所以越来越多的职场人士想要知道&…...

7月31日每日两题
第一题:再解炸弹人 小哼最近爱上了“炸弹人”游戏。你还记得在小霸王游戏机上的炸弹人吗?用放置炸弹的方法来消灭敌人。需将画面上的敌人全部消灭后,并找到隐藏在墙里的暗门才能过关。 现在有一个特殊的关卡如下。你只有一枚炸弹,但是这枚炸弹威力超强(杀伤距离超长,可…...

首期华为云ROMA Connect《企业集成战略与华为数字化之道》高研班在东莞圆满举办
7月25日,首期华为云ROMA Connect《企业集成战略与华为数字化之道》高研班在东莞华为制造业数字化转型中心圆满举办。 20多家东莞精密机械、电子、环保等领域的先进企业董事长、总经理、CIO、总监等高管参加培训。 本次高研班邀请到华为数字化转型专家陈劲、马兵东…...
JS语法知识点
变量声明: 使用 var 关键字声明的变量具有函数作用域,可以在函数内部访问。使用 let 或 const 关键字声明的变量具有块级作用域,只在声明的块内有效。 数据类型: 字符串(String):表示文本数据&a…...
【设计模式】 策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,将每个算法封装起来,使它们可以相互替换,让客户端代码和算法的具体实现解耦。这样,客户端可以根据不同的需求选择不同的算…...

Redis优惠券秒杀超卖问题
Redis秒杀超卖问题 前言一、出现秒杀超卖的原因二、超卖解决方案使用乐观锁解决超卖问题程序中进行解决 前言 这是我认为b站上最好的redis教程,各方面讲解透彻,知识点覆盖比较全。 黑马redis视频链接:B站黑马redis教学视频 本文参考黑马redi…...

14个最强大的建筑设计AI工具
在整个行业中,建筑师在他们的创造性追求中正在拥抱一个新的合作伙伴:AI。 一旦受到重复和单调的困扰,建筑工人发现自己正处于数字革命的风口浪尖,其中比特和字节掌握着自动化和曾经难以想象的可能性的关键。 推荐:用 …...

Ueditor 百度强大富文本Springboot 项目集成使用(包含上传文件和上传图片的功能使用)简单易懂,举一反三
Ueditor 百度强大富文本Springboot 项目集成使用 首先如果大家的富文本中不考虑图片或者附件的情况下,只考虑纯文本且排版的情况下我们可以直接让前端的vue来继承UEditor就可以啦。但是要让前端将那几个上传图片和附件的哪些功能给阉割掉! 然后就是说如…...
【NLP】一个使用PyTorch实现图像分类的迁移学习实例
一个使用PyTorch实现图像分类的迁移学习实例 1. 导入模块2. 加载数据3. 模型处理4. 训练及验证模型5. 微调6. 其他代码 在特征提取中,可以在预先训练好的网络结构后修改或添加一个简单的分类器,然后将源任务上预先训练好的网络作为另一个目标任务的特征提…...

【wsl-windows子系统】安装、启用、禁用以及同时支持docker-desktop和vmware方案
如果你要用docker桌面版,很可能会用到wsl,如果没配置好,很可能wsl镜像会占用C盘很多空间。 前提用管理员身份执行 wsl-windows子系统安装和启用 pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper…...

使用docker部署springboot微服务项目
文章目录 1. 环境准备1. 准备好所用jar包项目2.编写相应的Dockerfile文件3.构建镜像4. 运行镜像5. 测试服务是否OK6.端口说明7.进入容器内8. 操作容器的常用命令 1. 环境准备 检查docker是否已安装 [rootlocalhost /]# docker -v Docker version 1.13.1, build 7d71120/1.13.…...

uniapp兼容微信小程序和支付宝小程序遇到的坑
1、支付宝不支持v-show 改为v-if。 2、v-html App端和H5端支持 v-html ,微信小程序会被转为 rich-text,其他端不支持 v-html。 解决方法:去插件市场找一个支持跨端的富文本组件。 3、导航栏处有背景色延伸至导航栏外 兼容微信小程序和支…...

LeetCode208.Implement-Trie-Prefix-Tree<实现 Trie (前缀树)>
题目: 思路: tire树,学过,模板题。一种数据结构与算法的结合吧。 代码是: //codeclass Trie { private:bool isEnd;Trie* next[26]; public:Trie() {isEnd false;memset(next, 0, sizeof(next));}void insert(strin…...

第1章 JavaScript简史
JavaScript的起源 JavaScript是Netscape公司与Sun公司合作开发的在JavaScript诞生之前游览器就是显示超文本文档的简单的软件,JavaScript为此增加了交互行为ECMAScript是JavaScript的标准化,本质上是同一个语言JavaScript是一门脚本语言通常只能运行在游…...

DevOps-GitHub/GitLab
DevOps-GitHub/GitLab GitHub是一个开源代码托管平台。基于web的Git仓库,提供共有仓库和私有仓库(私有仓库收费)。 GitLab可以创建免费私有仓库。 GitHub 为了快速操作,这里对创建仓库以及注册不做说明。 首先再GitHub上创建一…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...