自动化测试 —— Pytest测试框架

news/2025/1/15 16:19:42/

01 | 简介

Pytest是一个非常成熟的全功能的Python测试框架,主要有以下特点:

  1. 简单灵活,容易上手,文档丰富

  2. 支持参数化,可以细粒度地控制测试用例

  3. 支持简单的单元测试与复杂的功能测试,还可以用来做Selenium、Appium、Requests等UI、接口自动化测试

  4. 支持很多第三方插件,并且可以自定义扩展(Pytest插件下载地址)

  5. 支持测试用例的跳过与失败重试

  6. 可以很好的与CI工具结合,比如Jenkins

02 安装

pip install pytest

03 | 简单使用

import pytestdef test01():print('第一条用例')assert True
def test02():print("第二条用例")assert Falseif __name__=="__main__":# -s:显示用例中的输出# -v:输出更详细的用例执行信息# __file__:本文件pytest.main(["-s", "-v", __file__])

运行结果如下图:

04 | 初始化&结束

4.1 函数级别

每执行一个测试用例就执行一次初始化&结束方法

import pytest
class Test:def setup(self):print("初始化")def teardown(self):print("结束")def test01(self):print('第一条用例')assert Truedef test02(self):print("第二条用例")assert False
if __name__=="__main__":pytest.main(["-s",__file__])

执行结果图:

4.2 类级别

不管类中有多少条用例需要执行,仅仅只执行一次初始化&结束方法

import pytest
class Test:def setup_class(self):print("初始化")def teardown_class(self):print("结束")def test01(self):print('第一条用例')assert Truedef test02(self):print("第二条用例")assert False
if __name__=="__main__":pytest.main(["-s",__file__])

执行结果图:

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036

05 | 常用插件

5.1 测试报告

安装测试报告插件

pip install pytest-html

在项目目录下创建 pytest.ini 配置文件,配置文件中新增测试报告存储路径。

[pytest]
# 在当前目录下创建report目录存放测试报告
addopts = --html=./report/report.html    

执行测试,生成的测试报告如下图: 

5.2 失败重试

安装插件

pip install pytest-rerunfailures

全局重试:在配置文件中增加重试参数,控制所有用例失败后的重试及重试等待时间

[pytest]
addopts = --html=./report/report.html --reruns 3 --reruns-delay 2
# --reruns n,n是一个整数,表示重试次数
# --reruns-delay n,n是一个整数,表示重试等待时间,单位是s

测试报告中可以看出失败用例的重试情况

单个重试:在某个用例函数中增加装饰器,注意需要将 全局重试 的配置注释掉

# reruns指定重试次数,reruns_delay指定重试间隔
@pytest.mark.flaky(reruns=2, reruns_delay=1)  def test02(self):print("第二条用例")assert False

测试报告中看重试情况:

5.3 多进程并发执行

pytest-xdist的出现就是为了让自动化测试用例可以分布式执行,从而节省自动化测试时间

安装插件

pip install pytest-xdist

多CPU并行执行

pytest -n 并行测试数量

5.4 多重断言

使用pytest进行断言判断的时候,为了用例的精准性,经常会多个方面进行断言,比如:

  • 断言1:断言响应的http的状态

  • 断言2:断言响应返回的code值

  • 断言3:断言响应返回的json中的data字段是否符合预期。

如果使用原生python的assert,就会遇到一个断言失败则全部失败的情况。比如说,断言1结果为Failed,那么断言2和断言3都不会被执行。我们希望断言2和断言3继续执行,这样我们能获取更多的断言结果来判断出接口哪里出了问题,能够更好地进行问题定位,这时候就可以使用pytest-assume插件来实现。

安装插件

pip install pytest-assume

使用案例

import pytestdef test_add2():pytest.assume(1 + 4 == 5)pytest.assume(1 + 3 == 3)pytest.assume(2 + 5 == 7)pytest.assume(2 + 5 == 9)print("测试完成")if __name__=="__main__":pytest.main(["-s", "-v", __file__])

执行结果如下图,可以看出总共执行了四个断言,其中失败的断言有2个

5.5 美化执行结果

在我们进行自动化测试的时候,用例往往是成百上千,执行的时间是几十分钟或者是小时级别。有时,我们在调试那么多用例的时候,不知道执行到什么程度了,而pytest-sugar插件能很好解决我们的痛点。

安装pytest-sugar插件

pip install pytest-sugar

在命令行中执行用例文件,执行结果如下图,用例执行时会有进度条展示:

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!


http://www.ppmy.cn/news/1173978.html

相关文章

OSPF复习

一、OSPF基础-----开放式最短路径优先协议 1、技术背景(RIP中存在的问题 RIP中存在最大跳数为15的限制,不能适应大规模组网 周期性发送全部路由信息,占用大量的带宽资源 路由收敛速度慢 以跳数作为度量值 存在路由环路可能性 每隔30秒更新 2…

xcode Simulator 安装

xcode Simulator 安装 参考文档 xcode又又又升级了,升级完成之后不下载最新的 iOS 17 Simulator就不能编译运行了,只能静静的等他下载。但是离谱的是这个居然没有断点续下,每次都要重新下载,眼睁睁的看着下载了4个G然后断掉了从…

Sui提供dApp Kit 助力快速构建React Apps和dApps

近日,Mysten Labs推出了dApp Kit,这是一个全新的解决方案,可用于在Sui上开发React应用程序和去中心化应用程序(dApps)。mysten/dapp-kit是专门为React定制的全新SDK,旨在简化诸如连接钱包、签署交易和从RPC…

使用python爬虫语言调用有道翻译实现英中互译(2023实现)

使用python爬虫语言调用有道翻译实现英中互译(2023实现) 作者: 安静到无声 作者简介:人工智能和硬件设计博士生、CSDN与阿里云开发者博客专家,多项比赛获奖者,发表SCI论文多篇。 Thanks♪(・ω・)ノ 如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关…

vue3项目使用TypeIt打字机

官网: TypeIt | The most versatile JavaScript typewriter effect library on the planet. 下载: npm i typeit 使用方法: 正常打字 多行打字机 input输入框实现打字机效果 打字机颜色变化 删除,光标移动,最全面的打字机效果 官网最下面还可以输入你想有的打字效果,然后生…

Spring MVC常用十大注解

Spring MVC常用十大注解 一,什么要使用注解 使用注解可以简化配置,提高代码的可读性和可维护性。通过注解可以实现依赖注入,减少手动管理对象的代码量。注解还支持面向切面编程,实现切面、切入点和通知等。此外,注解提…

DSI及DPHY的学习

DSI的物理层PHY只能是DPHY 本节讲述的DSI是V1.02.00---2010.6.28 从DSI V1.02开始DSI支持图像数据包RGB和YCbCr的传输,在此版本之前只支持RGB传输。 本节内容与CSICDPHY相同时 请参考: CSI2与CDPHY学习-CSDN博客 同时本节会做一些与CSICDPHY的比较 …

【QT】其他常用控件1

新建项目 scrollArea 滚动 toolBox 插入 tabWidget stackedWidget 切换 索引是0 运行后,没有切换按钮,结合pushbutton,加两个Button 代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent)…