学会这些pytest-Allure常用特性allure.attach、allure.step、fixture、environment、categories

allure.attach

allure.attach用于在测试报告中添加附件,补充测试结果。附件格式可以是txt、jpg等,附件内容通常是测试数据、截图等。

allure.attach提供了两种方法:allure.attach()allure.attach.file()

allure.attach()

作用:在测试报告中生成指定内容、名称、类型的附件

语法:allure.attach(body, name=None, attachment_type=None, extension=None)

参数说明:

  1. body,需要显示的内容,也可以理解为写入附件的内容
  2. name,附件名称
  3. attachment_type,附件类型,如csv、jpg、html 等,由allure.attachment_type提供
  4. extension:附件扩展名,不常用

allure.attach.file()

作用:向测试用例中上传附件

语法:allure.attach.file(source, name=None, attachment_type=None, extension=None)

参数说明:source为文件路径,其他参数与allure.attach()参数一致。

在UI自动化测试中,会经常用到这个方法来上传用例执行的截图。

示例

test_login.py

 
  1. import allure

  2. import pytest

  3. import requests

  4. import json

  5. data = [("lilei", "123456"), ("hanmeimei", "888888"), ("xiaoming", "111111")]

  6. ids = ["username:{}-password:{}".format(username, password) for username, password in data]

  7. @allure.epic("xx在线购物平台接口测试")

  8. @allure.feature("登录模块")

  9. class TestLogin:

  10. @allure.story("用户登录")

  11. @allure.title("登录")

  12. @pytest.mark.parametrize("username, password", data, ids=ids)

  13. def test_login(self, username, password):

  14. headers = {"Content-Type": "application/json;charset=utf8"}

  15. url = "http://127.0.0.1:5000/login"

  16. _data = {

  17. "username": username,

  18. "password": password

  19. }

  20. allure.attach(

  21. body="用户名-{},密码-{}".format(username, password),

  22. name="登录参数",

  23. attachment_type=allure.attachment_type.TEXT

  24. )

  25. res = requests.post(url=url, headers=headers, json=_data).text

  26. res = json.loads(res)

  27. assert res['code'] == 1000

  28. @allure.story("用户退出登录")

  29. @allure.title("退出登录")

  30. def test_logout(self):

  31. '''这条测试用例仅仅只是为了举例说明allure.attach.file的使用'''

  32. print("退出登录,并截图")

  33. # 截图路径

  34. testcase_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

  35. source_path = testcase_path + "/screenshot/logout.jpg"

  36. allure.attach.file(

  37. source=source_path,

  38. name="退出登录后截图",

  39. attachment_type=allure.attachment_type.JPG

  40. )

  41. assert True

上述代码中使用了@pytest.mark.parametrize(),Allure能够很好的支持@pytest.mark.parametrize()进行参数化。

run.py

 
  1. if __name__ == '__main__':

  2. pytest.main(['testcase/test_login.py', '-s', '-q', '--alluredir', './result'])

  3. os.system('allure generate ./result -o ./report --clean')

运行run.py,测试报告结果展示如下:

allure.attach()结果:

allure.attach.file()结果:

从结果可以看出来,两种方法都在报告中对应的测试用例中展示了附件内容。

allure.attach()结果还可以看出来,Allure能够很好的支持@pytest.mark.parametrize()进行参数化

with allure.step

上一篇文章我们使用了装饰器@allure.step()标记函数使之成为测试步骤,而在测试函数/方法中,我们还可以通过with allure.step()的方式标记测试步骤。

它们之间的区别在于,@allure.step()用于标记通用函数,当这个被标记的函数被调用后,会插入步骤说明并展示在Allure报告中。

而with allure.step()则是将普通的代码标记为测试步骤,执行到这段代码时则会在Allure报告中展示步骤说明。

我们在上面代码的基础上,加入with allure.step(),示例如下:

 
  1. import allure

  2. import pytest

  3. import requests

  4. import json

  5. data = [("lilei", "123456"), ("hanmeimei", "888888"), ("xiaoming", "111111")]

  6. ids = ["username:{}-password:{}".format(username, password) for username, password in data]

  7. @allure.epic("xx在线购物平台接口测试")

  8. @allure.feature("登录模块")

  9. class TestLogin:

  10. @allure.story("用户登录")

  11. @allure.title("登录")

  12. @pytest.mark.parametrize("username, password", data, ids=ids)

  13. def test_login(self, username, password):

  14. headers = {"Content-Type": "application/json;charset=utf8"}

  15. url = "http://127.0.0.1:5000/login"

  16. _data = {

  17. "username": username,

  18. "password": password

  19. }

  20. # 第一步,请求登录接口

  21. with allure.step("请求登录接口"):

  22. allure.attach(

  23. body="用户名-{},密码-{}".format(username, password),

  24. name="登录参数",

  25. attachment_type=allure.attachment_type.TEXT

  26. )

  27. res = requests.post(url=url, headers=headers, json=_data).text

  28. res = json.loads(res)

  29. # 第二步,获取返回参数进行断言

  30. with allure.step("断言"):

  31. assert res['code'] == 1000

测试报告结果展示如下:

代码中插入的测试步骤如上图中的标记所示。

fixture

pytest的fixture函数可以实现setup、teardown的功能,而Allure会跟踪每个fixture的调用情况,详细显示调用了哪些fixture和参数以及调用顺序。

我们在上面代码的基础上,加入fixture函数,示例如下:

 
  1. import allure

  2. import pytest

  3. import requests

  4. import json

  5. @pytest.fixture(scope="class", autouse=True)

  6. def fixture_demo(request):

  7. print("连接数据库")

  8. def finalizer():

  9. print("关闭数据库")

  10. request.addfinalizer(finalizer)

  11. data = [("lilei", "123456"), ("hanmeimei", "888888"), ("xiaoming", "111111")]

  12. ids = ["username:{}-password:{}".format(username, password) for username, password in data]

  13. @allure.epic("xx在线购物平台接口测试")

  14. @allure.feature("登录模块")

  15. class TestLogin:

  16. @allure.story("用户登录")

  17. @allure.title("登录")

  18. @pytest.mark.parametrize("username, password", data, ids=ids)

  19. def test_login(self, username, password):

  20. headers = {"Content-Type": "application/json;charset=utf8"}

  21. url = "http://127.0.0.1:5000/login"

  22. _data = {

  23. "username": username,

  24. "password": password

  25. }

  26. # 第一步,请求登录接口

  27. with allure.step("请求登录接口"):

  28. allure.attach(

  29. body="用户名-{},密码-{}".format(username, password),

  30. name="登录参数",

  31. attachment_type=allure.attachment_type.TEXT

  32. )

  33. res = requests.post(url=url, headers=headers, json=_data).text

  34. res = json.loads(res)

  35. # 第二步,获取返回参数进行断言

  36. with allure.step("断言"):

  37. assert res['code'] == 1000

测试报告结果展示如下:

从结果可以看出来,Allure测试报告展示了用例调用的fixture函数信息。多个fixture函数被调用及其执行顺序的展示,这里不做过多说明。

environment

在Allure报告的首页可以展示此次测试执行的环境信息 (如测试环境、测试人员、被测系统版本号、系统配置环境等),这需要通过创建environment.properties或environment.xml进行配置,并把文件放置在--alluredir指定的文件夹中 (博主这里即result文件夹)。

environment.properties示例如下:

 
  1. system=win

  2. python=3.7.7

  3. version=1.0.1

  4. host=127.0.0.1

 或environment.xml

 
  1. <environment>

  2. <parameter>

  3. <key>system</key>

  4. <value>win</value>

  5. </parameter>

  6. <parameter>

  7. <key>python</key>

  8. <value>3.7.7</value>

  9. </parameter>

  10. <parameter>

  11. <key>version</key>

  12. <value>1.0.1</value>

  13. </parameter>

  14. <parameter>

  15. <key>host</key>

  16. <value>127.0.0.1</value>

  17. </parameter>

  18. </environment>

生成报告后首页展示ENVIRONMENT信息如下:

categories

Allure报告中有一栏叫Categories,即分类,用于展示测试结果,默认只显示两类缺陷结果:

  1. Product defects 产品缺陷(测试结果:failed)
  2. Test defects 测试缺陷(测试结果:error/broken)

如下图所示

如果想要缺陷分类显示更丰富,我们可以通过创建categories.json文件进行自定义缺陷分类,并把文件放置在--alluredir指定的文件夹中 (即同environment.properties放在同一目录中)。

categories.json示例如下:

  1. [

  2. {

  3. "name": "Passed tests",

  4. "matchedStatuses": ["passed"]

  5. },

  6. {

  7. "name": "Ignored tests",

  8. "matchedStatuses": ["skipped"]

  9. },

  10. {

  11. "name": "Infrastructure problems",

  12. "matchedStatuses": ["broken", "failed"],

  13. "messageRegex": ".*bye-bye.*"

  14. },

  15. {

  16. "name": "Outdated tests",

  17. "matchedStatuses": ["broken"],

  18. "traceRegex": ".*FileNotFoundException.*"

  19. },

  20. {

  21. "name": "Product defects",

  22. "matchedStatuses": ["failed"]

  23. },

  24. {

  25. "name": "Test defects",

  26. "matchedStatuses": ["broken"]

  27. }

  28. ]

参数说明:

  • name:分类名称
  • matchedStatuses:测试用例的运行状态,默认["failed", "broken", "passed", "skipped", "unknown"]
  • messageRegex:测试用例运行的错误信息,默认是 .* ,通过正则去匹配
  • traceRegex:测试用例运行的错误堆栈信息,默认是 .* ,同样通过正则去匹配

执行后会在报告的Categories中展示,首页CATERORIES栏展示如下:

Categories页面展示:

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/603051.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

flutter自定义日期选择器按日、按月、自定义开始、结束时间

导入包flutter_datetime_picker: 1.5.0 封装 import package:atui/jade/utils/JadeColors.dart; import package:flutter/cupertino.dart; import package:flutter/material.dart; import package:flutter_datetime_picker/flutter_datetime_picker.dart; import package:flut…

从开发角度理解漏洞成因(03)

文章目录 JS前端验证 - 文件上传设计浏览器禁用JS&#xff0c;前端绕过文件上传漏洞验证漏洞 Ajax 登录验证&#xff0c;状态回显&#xff0c;状态码设计修改返回包绕过登录验证 通过Ajax 传递数据进行购物验证设计1此漏洞也可以修改状态码绕过 持续更新中… 文章中代码资源已上…

运维自动化工具:Ansible 概念与模块详解

目录 前言 一、运维自动化工具有哪些 二、Ansible 概述 1、Ansible 概念 2、Ansible 特点 3、Ansible 工作流程 4、Ansible 架构 4.1 Ansible 组成 4.2 Ansible 命令执行来源 5、Ansible 的优缺点 三、Ansible 安装部署 1、环境部署 2、管理节点安装 Ansible 3、…

【如此简单!数据库入门系列】之无序不代表混乱 -- 堆文件

文章目录 前言堆文件链表实现页目录实现总结系列文章 前言 还记得上次遗留的问题吗&#xff1f; 以什么组织方式将数据保存在磁盘中&#xff1f; 今天我们接着讨论这个问题。 首先想一个问题&#xff1a;有一天&#xff0c;你开着自己心爱的大型SUV去超市购物。在停车场入口看…

roblox国际服游戏充值付款订阅Robux套装商城会员,roblox国际服虚拟信用卡充值教程

roblox是一款由Roblox公司开发的大型多人在线游戏创建平台&#xff0c;该平台允许用户设计自己的游戏、物品及衣服&#xff0c;以及游玩自己和其他开发者创建的各种不同类型的游戏。 没有账号注册一个账号&#xff0c;他支持多种平台授权登录&#xff0c;我这里直接选择注册一个…

2024蓝桥杯CTF writeUP--缺失的数据

压缩包的内容 里面有secret.txt文件&#xff0c;用ARCHPR工具套上字典&#xff0c;爆破压缩包密码。密码为pavilion 解压得到原图&#xff0c;并且有了加密后的图片&#xff0c;根据代码里的key和参数直接运行脚本解密水印图片&#xff1a; import cv2 import numpy as np imp…

qt5-入门-xml文件读写

本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt 5.12 代码已经测试通过。其他例子日后更新。 假设需要读写的xml文档结构如下图所示&#xff1a; 那么首先需要修改.pro文件&#xff0c;增加一句&#xff1a; 然后执行qmake。 代码 #include <QtXml/Q…

您的浏览器不支持 undefined 代理认证!如有问题请联系您的浏览器支持,请勿反馈此问题给 SwitchyOmega.

一、【问题描述】 PAC 文件是一个 JavaScript 文件&#xff0c;用于定义客户端的代理规则。您可以在 PAC 文件中编写规则&#xff0c;根据不同的目标网址或其他条件&#xff0c;决定是否通过代理服务器进行访问。您可以将 PAC 文件部署到服务器上&#xff0c;并在客户端配置浏…

一篇教程搞定Windows系统中的Docker应用安装

文章目录 1. 引言2. “Docker -> WSL -> Windows”的依赖逻辑3. 安装方法3.1 安装WSL3.2 安装Docker Desktop 4. 是否安装成功&#xff1f;初始化一个容器试试。FAQ 1. 引言 Docker是一个用于创建、管理和编排容器的应用。容器是运行在操作系统上的一个应用&#xff0c;…

SharePoint 使用renderListDataAsStream方法查询list超过5000时的数据

问题&#xff1a; 当SharePoint List里的数据超过5000时&#xff0c;如果使用常用的rest api去获取数据&#xff0c;例如 await this.sp.web.lists.getByTitle(Document Library).rootFolder.files.select(*, listItemAllFields).expand(listItemAllFields).filter(listItemA…

.net 6.0 框架集成ef实战,步骤详解

一、代码框架搭建 搭建如下代码架构: 重点含EntityFrameworkCore工程,该工程中包含AppDbContext.cs和数据表实体AggregateObject 1、AppDbContext 代码案例 //AppDbContext 代码案例using Microsoft.EntityFrameworkCore;namespace EntityFrameworkCore {public class Ap…

STM32-HAL库12-STM32F407VGT6的PWM主从定时器,发送指定数量脉冲

STM32-HAL库12-STM32F407VGT6的PWM主从定时器&#xff0c;发送指定数量脉冲 一、所用材料 STM32F407VGT6自制双伺服电机控制板&#xff1b; 一川A1系列伺服电机驱动器&#xff08;电0.73KW电机&#xff09;&#xff1b; 二、所学内容 实现PWM发送指定个数脉冲&#xff0c;以…

Https协议加密过程,中间人攻击详解

在上一篇博客中我们讲到了http协议http://t.csdnimg.cn/OsvCh&#xff0c;没看过之前建议先瞅瞅。 https本质就是对http协议进行了一层加密。为什么要进行加密呢&#xff0c;也参考上面一篇文章&#xff0c;涉及到运营商劫持。 因为http是明文传输&#xff0c;所以要对http进…

An Embarrassingly Easy but Strong Baseline for Nested Named Entity Recognition

任务描述&#xff1a; NER 是检测和分类文本中实体范围的任务。当实体范围在文本中彼此重叠时&#xff0c;这个问题被称为嵌套 NER。 解决方法&#xff1a; 使用基于跨度的方法来处理嵌套 NER&#xff0c;其中大多数方法将得到一个 n n 的分数矩阵&#xff0c;其中 n 表示句子…

Compose 生命周期和副作用

文章目录 Compose 生命周期和副作用生命周期副作用APIDisposableEffectSIdeEffectLaunchedEffectrememberCoroutineScoperememberUpdatedStatesnapshotFlowproduceStatederivedStateOf Compose 生命周期和副作用 生命周期 OnActive&#xff1a;添加到视图树。即Composable被首…

有哪些有效的复习方法可以帮助备考软考?

软考目前仍然是一个以记忆为主、理解为辅的考试。学过软考的朋友可能会感到困惑&#xff0c;因为软考的知识在日常工作中有许多应用场景&#xff0c;需要理解的地方也很多。但为什么我说它是理解为辅呢&#xff1f;因为这些知识点只要记住了&#xff0c;都不难理解&#xff0c;…

快速传输大文件:手机电脑互传文件的最佳解决方案

无论是工作还是生活&#xff0c;我们都可能需要将照片、视频、音乐或其他类型的文件从一台设备发送到另一台设备。然而&#xff0c;由于网络速度的限制&#xff0c;传统的文件传输方法可能会非常耗时。那么&#xff0c;有没有一种快速传输大文件的解决方案呢&#xff1f;答案是…

Linux网络编程(三)IO复用一 select系统调用

I/O复用使得程序能同时监听多个文件描述符。在以下场景中需要使用到IO复用技术&#xff1a; 客户端程序要同时处理多个socket&#xff0c;非阻塞connect技术客户端程序要同时处理用户输入和网络连接&#xff0c;聊天室程序TCP服务器要同时处理监听socket和连接socket服务器要同…

【JAVA |数组】数组定义与使用、常见的Arrays类介绍

目录 一、前言 二、数组的创建和初始化 三、数组的使用 四、数组是引用类型 1.JVM的内存分配 2.与引用类型变量 3.null 五、二维数组 六、Java中Arrays类的常用方法 1. Arrays.fill ->填充数组 2. Arrays.sort ->数组排序 3. Arrays.toString ->数组打印 …

数据中台:企业数字化转型的驱动力量_光点科技

在当今数字化快速发展的时代&#xff0c;企业正积极寻求转型升级的新路径。在这个过程中&#xff0c;数据中台以其独特的功能和价值&#xff0c;逐渐成为了企业数字化转型的关键驱动力。本文将深入探讨数据中台的角色、架构及其在企业中的应用&#xff0c;以期为企业的数字化转…