Pytest之重运行及生成测试报告
在上一篇Pytest系列文章:Pytest之参数化,主要介绍pytest参数化讲解及实战。
以下主要介绍Pytest的重运行及生成测试报告。
一
重运行
在做UI自动化,如Selenuim或者Appium时,遇到某些元素未能及时显示,导致点击失败,如果加上重跑,那么将有效提高报告的准确性。
在Pytest中,可以使用pytest-rerunfailures
用来失败用例重跑。
1
安装pytest-rerunfailures
安装命令:
pip install pytest-rerunfailures
2
使用说明
@pytest.mark.flaky(reruns=重试次数, reruns_delay=次数之间的延时设置(单位:秒))
3
举个栗子
重试次数
test_demo.py
import pytest
@pytest.mark.flaky(reruns=2)
def test_demo():
assert 3 == 4
运行结果为:
指定重运行等待时间:
import pytest
@pytest.mark.flaky(reruns=2,reruns_delay=2)
def test_demo():
assert 3 == 4
运行结果为:
二
生成测试报告
1
pytest-html生成报告
pytest使用pytest-html
插件生成测试报告。
① 安装pytest-html
安装命令:
pip install pytest-html
② 举个栗子
现有用例如下:
test_demo.py
import pytest
@pytest.mark.flaky(reruns=2,reruns_delay=2)
def test_demo():
assert 3 == 4
test_demo1.py
class TestDemo:
def test_demo01(self):
print("这是test_demo01")
def test_demo02(self):
print("这是test_demo02")
命令行输入:pytest --html=report.html
运行之后,会生成report.html,用浏览器打开report.html,如下:
2
allure生成报告
用pytest-html生成的报告稍微简单和丑了一点,我们可以使用更强大的工具allure
,allure测试报告框架帮助你轻松实现"高大上"报告展示。
01 安装allure
①从github上下载allure,下载传送门为:
https://github.com/allure-framework/allure2/releases
如下所示,选择”Download“下载即可:
② 下载完后,解压到项目根目录下。
③ 安装allure插件
安装命令:
pip install allure-pytest
④ 添加环境变量:将allure-2.13.5bin的目录路径添加到环境变量。
02 举个栗子
① 现有用例如下:
test_demo.py
import pytest
@pytest.mark.flaky(reruns=2,reruns_delay=2)
def test_demo():
assert 3 == 4
test_demo1.py
class TestDemo:
def test_demo01(self):
print("这是test_demo01")
def test_demo02(self):
print("这是test_demo02")
② 在项目根目录下新建目录report。
③ 在命令行输入:pytest -s -q --alluredir ./report,在report目录下会生成一些json格式的。
④ 在report目录下,新建目录html,用于存放html报告。
⑤ 命令行输入allure generate ./report -o ./report/html,生成了最终的html报告。
⑥用浏览器打开index.html文件,效果如下:
以上
That‘s all
- MVC自定义视图引擎地址
- JS禁止鼠标右键、禁止全选、复制、粘贴的方法(所谓的防盗功能)
- impdp异常中断导致的问题(r2第8天)
- 利用autocomplete.js实现仿搜索效果(ajax动态获取后端[C#]数据)
- sql语句的简化(r2第7天)
- Ajax jsonp 跨域请求实例
- asp.net动态解析用户控件(UserControl)
- 找到多个与名为“Home”的控制器匹配的类型的解决方案
- 关于sequence问题的紧急处理(r2第26天)
- 使用动态变量进行动态数据比较(r2笔记25天)
- MVC分部视图@Html.Partial
- 基于马尔科夫链的产品评估预测
- MVC 控制器中传递dynamic(对象) 给视图
- 使用copy命令解决LONG类型的困扰(r2第24天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- TRTC横竖屏切换
- Swift 元祖
- Flutter - 解决混合开发iOS脚本打包遇到的问题
- Shader 特效 —— Film Burn (炫光光晕)效果【GLSL】
- java selenium chromedriver浏览器驱动放在哪里?【两种位置】
- 56. Vue原生js的组件拆分结构设计
- 一步一步教你把 Redux Saga 添加到 React&Redux 程序中
- Octave的基本语句及函数的使用入门—ML Note 31
- JAVA的Lock锁接口实现
- 抽象语法树为什么抽象
- burpsuite IP伪造插件
- 用阻塞队列,再系一次鞋带
- I2C总线架构 之 设备驱动
- kail 安装及卸载 docker【亲测可用】
- mac 登录远程服务器(常规ssh+免密快捷方式)