上一篇文章pytest Allure生成测试报告我们学习了Allure中的一些特性,接下来继续学习其他常用的特性。

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.propertiesenvironment.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. ]

参数说明:

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

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

Categories页面展示:

总结

Allure中常用的特性大致就这些,以上仅为简单示例,大家可根据自身项目的需要按需选择使用。Allure提供的特性当然也不止这些,如果感兴趣大家可以查看Allure官方文档了解更多。

pytest(12)-Allure常用特性allure.attach、allure.step、fixture、environment、categories的更多相关文章

  1. Pytest系列(21)- allure的特性,@allure.description()、@allure.title()的详细使用

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 前面介绍了两种allure的 ...

  2. Pytest系列(22)- allure的特性,@allure.link()、@allure.issue()、@allure.testcase()的详细使用

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 上一篇文章介绍了两种allu ...

  3. Pytest 学习(二十五)- allure 命令行参数【转】

    先看看 allure 命令的帮助文档 cmd 敲 allure -h allure 命令的语法格式 allure [options] [command] [command options] optio ...

  4. Pytest 系列(29)- 详解 allure.dynamic 动态生成功能

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 @allure.title  ...

  5. Allure自动化测试报告之修改allure测试报告名称

    1.从github获取allure代码 https://github.com/allure-framework/allure2 2.安装gradle,用于打包jar brew install grad ...

  6. Unity3D编辑器扩展(五)——常用特性(Attribute)以及Selection类

    前面写了四篇关于编辑器的: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)——使用GUI绘制窗口 Unity3D ...

  7. AngularJS 的常用特性(五)

    13.使用路由和 $location 切换视图 对于一些单页面应用来说,有时候需要为用户展示或者隐藏一些子页面视图,可以利用 Angular 的 $route 服务来管理这种场景. 你可以利用路由服务 ...

  8. mootools常用特性和示例(基础篇1)

    网上关于mootools这个库的信息很少. 公司一些老的项目用到了mootools库,因为要维护,所以接触到了mootools. mootools(文档)官网:http://www.chinamoot ...

  9. Vue的常用特性

    Vue的常用特性 一.表单基本操作 都是通过v-model 单选框 1. 两个单选框需要同时通过v-model 双向绑定 一个值 2. 每一个单选框必须要有value属性 且value值不能一样 3. ...

随机推荐

  1. 下载并搭建maven环境

    1.下载maven 1.在官网下载maven  http://maven.apache.org/download.cgi 2.将下载maven解压.复制路径. 2.搭建maven环境 1.新建M2_H ...

  2. [转]Vue之引用第三方JS插件

    1.绝对路径引入,全局使用. 在index.html文件中使用script标签引入插件. 该种方式就是上面演示ckplayer插件使用的方式. 备注: 这种方式的引用,会在开启ESLint时,报错,可 ...

  3. 注意,你所做的 A/B 实验,可能是错的!

    对于 A/B 实验原理认知的缺失,致使许多企业在业务增长的道路上始终在操作一批"错误的 A/B 实验".这些实验并不能指导产品的优化和迭代,甚至有可能与我们的初衷背道而驰,导致&q ...

  4. 钓鱼攻击之远程加载恶意Word模版文件上线CS

    0x00 前言 利用Word文档加载附加模板时的缺陷所发起的恶意请求而达到的攻击目的,所以当目标用户点开攻击者发给他的恶意word文档就可以通过向远程服务器请求恶意模板并执行恶意模板上的恶意代码.这里 ...

  5. docker创建mysql容器时挂载文件路径后无法启动(已解决)

    系统centos7 docker版本: 解决方法: 在docker run中加入 --privileged=true  给容器加上特定权限,如下 docker run --privileged=tru ...

  6. Kotlin 协程一 —— 全面了解 Kotlin 协程

    一.协程的一些前置知识 1.1 进程和线程 1.1.1基本定义 1.1.2为什么要有线程 1.1.3 进程与线程的区别 1.2 协作式与抢占式 1.2.1 协作式 1.2.2 抢占式 1.3 协程 二 ...

  7. 《剑指offer》面试题28. 对称的二叉树

    问题描述 请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和它的镜像一样,那么它是对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的.     1    / \   2   ...

  8. 【记录一个问题】笔记本ThinkPad X1-Extreme安装ubuntu 18后,更新nvidia显卡驱动后出现显示问题,无法再登录

    如题 更新的过程如下: sudo ubuntu-drivers autoinstall sudo reboot 后续准备在recovery模式中尝试删除驱动.

  9. vue文档1-VSCode介绍

    开发工具VSCode: Vue的开发工具用的是VSCode(Visual Studio Code),这款开发工具是微软官方出品,开源,免费,并且功能相当强大,使用者很多,插件相当丰富,是Vue开发的不 ...

  10. golang中的标准库flag

    Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单. os.Args 如果你只是简单的想要获取命令行参数,可以像下面的代码示例一样使用os.Args来获取命令行参数. ...