pytest测试框架+allure插件自定义测试报告
zhezhongyun 2024-12-15 17:54 36 浏览
之前文章我们学习了pytest-html插件生成html测试报告,本章介绍另一个好用的插件。allure-pytest 是pytest的一个插件,帮助我们再pytest测试框架中集成Allure框架来生成详细的测试报告。
Allure 是一个灵活的轻量级多语言测试报告工具,支持包括 pytest /testng在内的多种测试框架,能够生成易于理解和丰富的测试报告。
allure-pytest能够生成包含测试步骤、日志、标题、优先级、附件等详细信息的测试报告,有助于更好地理解测试用例的执行情况。
自定义功能:支持通过装饰器(比如@allure.epic、@allure.feature、@allure.story、@allure.title、@allure.description 等)来添加额外的测试信息,如功能模块、用例标题、严重程度等,从而生成更加详细和有用的报告。
官方文档:https://allurereport.org/docs/pytest/
allure-pytest插件安装
使用pip命令安装: pip install allure-pytest
(安装在pytest工程所运行的python环境,python的安装目录或者虚拟环境目录,可以参考之前文章查看运行环境pycharm配置pytest运行环境)
安装和配置allure命令行工具(mac系统)
以下以mac电脑举例:
1)下载和配置jdk
下载地址:Java Downloads | Oracle,选择适用于Mac OS的JDK版本,点击下载即可。
下载完之后,双击安装包按照如下页面指导直接安装即可
默认安装目录:/Library/Java/JavaVirtualMachines,打开终端,进入目录可以看到jdk程序。
配置环境变量:使用open ~/.bash_profile打开变量文件,不存在先创建一个该文件。
vi命令打开后,添加如下信息保存退出
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-22.jdk/Contents/Home
执行source ~/.bash_profile使配置生效,然后执行java --version可以看到java版本了。
2)下载命令行工具
进入以下地址下载allure工具
https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/
最新的版本是2.9.0
3)配置allure命令行工具
将下载的allure包解压,打开终端,配置环境变量执行vi ~/.bash_profile然后添加export PATH="/Users/aaa/Downloads/allure-2.9.0/bin:$PATH",填写的是allure的目录信息。
执行source ~/.bash_profile使配置生效,然后在任意目录执行allure --version可以看到allure执行成功了。
生成测试报告
测试用例执行后,生成最简易的测试报告,步骤如下:
1)使用时无需导入,直接在用例执行命令中添加参数
执行带上参数--alluredir=./allure-results,参数后面跟着用例结果的目录。
执行后在目标目录中生成的是一堆json文件。
2)将测试结果生成html测试报告
- 可以生成在线测试报告并自动通过浏览器打开
命令:allure serve allure-results
执行后自动打开浏览器,展示测试报告内容。生成的报告位置见日志打印
- 自定义生成测试报告的目录,手动在浏览器打开
命令:allure generate allure-results -o allure-report --clean
-o后面跟着报告的目录
--clean表示先清楚该目录内容再生成测试报告,否则会提示目录已被使用。
测试报告如下,比插件pytest-html生成的报告内容更丰富,页面更好看。
Allure报告提供了丰富的信息和功能,展示测试用例执行结果,用例的层级结构,附件和截图,测试指标和趋势图,还有其他的标记、过滤、定制等,让测试结果更加直观和易于理解。
allure的装饰器功能
使用前先导入 import allure
官方文档:https://allurereport.org/docs/pytest-reference/#metadata
装饰器和方法 | 参数说明 |
@allure.epic(*epics: str) @allure.feature(*features: str) @allure.story(*stories: str) allure.dynamic.epic(*epics: str) allure.dynamic.feature(*features: str) allure.dynamic.story(*stories: str) | 定义用例的层级结构,对应敏捷中的需求/特性/故事,每个用例都可以定义多个装饰器或者方法。 |
@allure.parent_suite(parent_suite_name) @allure.suite(suite_name) @allure.sub_suite(sub_suite_name) allure.dynamic.parent_suite(parent_suite_name) allure.dynamic.suite(suite_name) allure.dynamic.sub_suite(sub_suite_name) | 定义用例的套件结构:为测试分配父套件、套件或子套件的名称 |
@allure.title(test_title: str) allure.dynamic.title(test_title: str) | 定义测试用例或者fixture方法的标题 如果测试函数有参数,也支持将参数传入标题中。 |
@allure.step(title: str) with allure.step(title: str)--上下文管理器 | 定义测试用例的步骤 |
@allure.description(test_description: str) allure.dynamic.description(test_description: str) | 定义测试用例的描述信息。如果没有提供,Allure将使用测试函数的描述。 |
@allure.tag(*tags: str) allure.dynamic.tag(*tags: str) | 设置测试用例的标记,一次可以接受多个标记。 |
@allure.severity(severity_level: str) allure.dynamic.severity(severity_level: str) | 设置测试用例的严重性,枚举值:“trivial”···, “minor”, “normal”, “critical”, and “blocker”. |
@allure.label(label_type: str, *labels: str) allure.dynamic.label(label_type: str, *labels: str) | 设置测试用例的标签。 该函数的第一个参数是标签名称。它可以是来自LabelType类或任何其他字符串的常量。 第二个和所有剩余的参数都是要添加的值。对于每个值,该函数将添加一个带有给定名称和给定值的标签。 |
@allure.link(url:str,link_type:str=LinkType.LINK, name: str = None) @allure.issue(url: str, name: str = None) @allure.testcase(url: str, name: str = None) allure.dynamic.link(url: str, link_type: str = LinkType.LINK, name: str = None) allure.dynamic.issue(url:str,name:str= None) allure.dynamic.testcase(url: str, name: str = None) | 添加与测试用例相关的链接。 |
allure.attach(body,name=None,attachment_type="text/plain", extension="attach") allure.attach.file(source,name=None, attachment_type=None, extension=None) | 将附件添加到测试报告 |
@allure.id(id: str) allure.dynamic.id(id: str) | 设置测试用例的id |
allure.dynamic.parameter(name,value,excluded=None, mode=None) | 显示测试期间使用的参数的name和value。 |
示例1 添加需求层次结构
@allure.epic("epic")
@allure.feature("features")
@allure.story("assert")
def test_1():
assert 1 == 1
def test_2():
allure.dynamic.epic("epic")
allure.dynamic.feature("features")
allure.dynamic.story("assert")
assert 1 == 1
测试用例执行后,生成测试报告如下:点击下面的红框地方可以看到定义的层次结构
示例2 定义套件结构
@allure.parent_suite("ParentSuite")
@allure.suite("Suite")
@allure.sub_suite("Suite-1")
def test_3():
assert 1 == 1
def test_4():
allure.dynamic.parent_suite("ParentSuite")
allure.dynamic.suite("Suite")
allure.dynamic.sub_suite("Suite-1")
assert 1 == 1
测试用例执行后,生成测试报告如下:点击下面的红框地方可以看到定义的套件结构
示例 3 定义测试用例标题
class Testcase():
def test_1(self):
allure.dynamic.title('测试类中的用例1')
assert 1 == 1
@allure.title('测试类中的用例2')
def test_2(self):
assert 1 == 1
测试用例执行后,生成测试报告如下:点击下面的红框地方可以看到用例的标题(没有定义标题显示的是测试函数名)
示例 4 定义测试用例的步骤
class Testcase():
def test_1(self):
allure.dynamic.title('测试类中的用例1')
with allure.step('先定义变量'):
value = 1
with allure.step('开始断言'):
assert value == 1
@allure.step('先定义变量')
def set_value(self):
return 1
@allure.step('开始断言')
def assert_value(self,value):
assert value ==1
@allure.title('测试类中的用例2')
def test_2(self):
value = self.set_value()
self.assert_value(value)
分别使用装饰器和上下文管理器的方式设置测试用例的步骤,测试用例执行后,生成测试报告如下:点击下面的红框地方可以看到用例的步骤
示例 5 设置用例的的描述信息
@allure.description('用例断言')
def test_3():
assert 1 == 1
def test_4():
allure.dynamic.description('用例断言')
assert 1 == 1
def test_5():
"""
断言
:return: None
"""
assert 1 == 1
测试用例执行后,生成测试报告如下:点击下面的红框地方可以看到用例的描述
示例 6 设置用例的标记
@allure.tag('tag1','tag2','tag3')
def test_6():
assert 1 == 1
def test_7():
allure.dynamic.tag('tag1','tag2','tag3')
assert 1 == 1
测试用例执行后,生成测试报告如下:点击下面的红框地方可以看到用例的标记信息
示例7 设置用例的严重级别
@allure.severity('critical')
def test_7():
assert 1 == 1
def test_8():
allure.dynamic.severity('normal')
assert 1 == 1
测试用例执行后,生成测试报告如下:下面的红框地方可以看到用例的级别
示例 8 设置用例的链接
@allure.link("https://dev.example.com/", name="Website")
@allure.issue("AUTH-123")
@allure.testcase("TMS-456")
def test_11():
assert 1 == 1
def test_12():
allure.dynamic.link("https://dev.example.com/", name="Website")
allure.dynamic.issue("AUTH-123")
allure.dynamic.testcase("TMS-456")
assert 1 == 1
测试用例执行后,生成测试报告如下:下面的红框地方可以看到用例的链接,可以点击跳转。
示例 9 展示用例的参数
def test_15():
allure.dynamic.parameter('name', 'wang', excluded=None, mode=None)
@pytest.mark.parametrize('name',['wang','li'])
def test_16(name):
print(name)
用例15使用allure的参数功能,用例16使用pytest的参数功能,测试用例执行后,生成测试报告如下:下面的红框地方可以看到用例的参数信息
示例10 展示用例的附件
从变量中附加内容
allure.attach(body,name=None,attachment_type="text/plain", extension="attach")
在给定的name下添加body作为测试结果的附件(默认为唯一的伪随机字符串)。body必须是bytes或str类型。
def test_17():
allure.attach('pytest',name="附件",
attachment_type=allure.attachment_type.TEXT
)
测试用例执行后,生成测试报告如下:下面的红框地方可以看到用例的附件信息
从文件中阅读附件
allure.attach.file(source,name=None, attachment_type=None, extension=None)
def test_18():
allure.attach.file('/Users/ue/Desktop/1.png',name="附件",
attachment_type=allure.attachment_type.PNG
)
测试用例执行后,生成测试报告如下:下面的红框地方可以看到用例的附件信息(大家可以添加多种格式的附件,示例中的allure.attachment_type有很多种类型)
共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”
-----指水滴不断地滴,可以滴穿石头;
-----比喻坚持不懈,集细微的力量也能成就难能的功劳。
----感谢读者的阅读和学习,谢谢大家。
---祝愿大家都能够龙腾虎跃,步步高升!!!
相关推荐
- JavaScript做个贪吃蛇小游戏(过关-加速),无需网络直接玩。
-
JavaScript做个贪吃蛇小游戏(过关-则加速)在浏览器打开文件,无需网络直接玩。<!DOCTYPEhtml><htmllang="en"><...
- 大模型部署加速方法简单总结(大模型 ai)
-
以下对大模型部署、压缩、加速的方法做一个简单总结,为后续需要备查。llama.cppGithub:https://github.com/ggerganov/llama.cppLLaMA.cpp项...
- 安徽医大第一医院应用VitaFlow Liberty(R)Flex为患者焕然一“心”
-
近日,在安徽医科大学第一附属医院心血管内科负责人暨北京安贞医院安徽医院业务副院长喻荣辉教授的鼎力支持和卓越带领下,凭借着先进的VitaFlowLiberty(R)Flex经导管主动脉瓣可回收可...
- 300 多行代码搞定微信 8.0 的「炸」「裂」特效!
-
微信8.0更新的一大特色就是支持动画表情,如果发送的消息只有一个内置的表情图标,这个表情会有一段简单的动画,一些特殊的表情还有全屏特效,例如烟花表情有全屏放烟花的特效,炸弹表情有爆炸动画并且消息和...
- 让div填充屏幕剩余高度的方法(div填充20px)
-
技术背景在前端开发中,经常会遇到需要让某个div元素填充屏幕剩余高度的需求,比如创建具有固定头部和底部,中间内容区域自适应填充剩余空间的布局。随着CSS技术的发展,有多种方法可以实现这一需求。实现步骤...
- css之div内容居中(css中div怎么居中)
-
div中的内容居中显示,包括水平和垂直2个方向。<html><head><styletype="text/css">...
- 使用uniapp开发小程序遇到的一些问题及解决方法
-
1、swiper组件自定义知识点swiper组件的指示点默认是圆圈,想要自己设置指示点,需要获得当前索引,然后赋给当前索引不同的样式,然后在做个动画就可以了。*关键点用change方法,然后通过e.d...
- 微信小程序主页面排版(怎样设置小程序的排版)
-
开发小程序的话首先要了解里面的每个文件的作用小程序没有DOM对象,一切基于组件化小程序的四个重要的文件*.js*.wxml--->view结构---->html*.wxss--...
- Vue动态组件的实践与原理探究(vue动态组件component原理)
-
我司有一个工作台搭建产品,允许通过拖拽小部件的方式来搭建一个工作台页面,平台内置了一些常用小部件,另外也允许自行开发小部件上传使用,本文会从实践的角度来介绍其实现原理。ps.本文项目使用VueCLI...
- 【HarmonyOS Next之旅】兼容JS的类Web开发(四) -> tabs
-
目录1->创建Tabs2->设置Tabs方向3->设置样式4->显示页签索引5->场景示例编辑1->创建Tabs在pages/index目录...
- CSS:前端必会的flex布局,我把布局代码全部展示出来了
-
进入我的主页,查看更多CSS的分享!首先呢,先去看文档,了解flex是什么,这里不做赘述。当然,可以看下面的代码示例,辅助你理解。一、row将子元素在水平方向进行布局:1.垂直方向靠顶部,水平方向靠...
- 【HarmonyOS Next之旅】兼容JS的类Web开发(四) -> swiper
-
目录1->创建Swiper组件2->添加属性3->设置样式4->绑定事件5->场景示例编辑1->创建Swiper组件在pages/index...
- CSS:Flex布局,网页排版神器!(css3 flex布局)
-
还在为网页排版抓狂?别担心,CSS的flex布局来了,让你轻松玩转各种页面布局,实现网页设计自由!什么是Flex布局?Flex布局,也称为弹性布局,是CSS中的一种强大布局方式,它能够让你...
- 移动WEB开发之flex布局,附携程网首页案例制作
-
一、flex布局体验传统布局兼容性好布局繁琐局限性,不能再移动端很好的布局1.1flex弹性布局:操作方便,布局极为简单,移动端应用很广泛PC端浏览器支持情况较差IE11或更低版本,不支持或仅部...
- 2024最新升级–前端内功修炼 5大主流布局系统进阶(mk分享)
-
2024最新升级–前端内功修炼5大主流布局系统进阶(mk分享)获课》789it.top/14658/前端布局是网页设计中至关重要的一环,它决定了网页的结构和元素的排列方式。随着前端技术的不断发展,现...
- 一周热门
- 最近发表
-
- JavaScript做个贪吃蛇小游戏(过关-加速),无需网络直接玩。
- 大模型部署加速方法简单总结(大模型 ai)
- 安徽医大第一医院应用VitaFlow Liberty(R)Flex为患者焕然一“心”
- 300 多行代码搞定微信 8.0 的「炸」「裂」特效!
- 让div填充屏幕剩余高度的方法(div填充20px)
- css之div内容居中(css中div怎么居中)
- 使用uniapp开发小程序遇到的一些问题及解决方法
- 微信小程序主页面排版(怎样设置小程序的排版)
- Vue动态组件的实践与原理探究(vue动态组件component原理)
- 【HarmonyOS Next之旅】兼容JS的类Web开发(四) -> tabs
- 标签列表
-
- HTML 教程 (33)
- HTML 简介 (35)
- HTML 实例/测验 (32)
- HTML 测验 (32)
- JavaScript 和 HTML DOM 参考手册 (32)
- HTML 拓展阅读 (30)
- HTML常用标签 (29)
- HTML文本框样式 (31)
- HTML滚动条样式 (34)
- HTML5 浏览器支持 (33)
- HTML5 新元素 (33)
- HTML5 WebSocket (30)
- HTML5 代码规范 (32)
- HTML5 标签 (717)
- HTML5 标签 (已废弃) (75)
- HTML5电子书 (32)
- HTML5开发工具 (34)
- HTML5小游戏源码 (34)
- HTML5模板下载 (30)
- HTTP 状态消息 (33)
- HTTP 方法:GET 对比 POST (33)
- 键盘快捷键 (35)
- 标签 (226)
- HTML button formtarget 属性 (30)
- CSS 水平对齐 (Horizontal Align) (30)