2024测试开发必知必会:Pytest框架实战!

news2025/1/11 14:45:19

应用场景:

pytest 框架可以解决我们多个测试脚本一起执行的问题。

它提供了测试用例的详细失败信息,使得开发者可以快速准确地改正问题。它兼容最新版本的 Python。它还兼容 unittest、doctest 和 nose,开箱即用。接下来我们详细了解下pytest框架。

01、安装和介绍

概念:

pytest 是 python 的一种单元测试框架,同自带的 Unittest 测试框架类似,相比于 Unittest 框架使用起来更简洁,效率更高

官网:  https://docs.pytest.org/en/latest/
中文文档地址:  https://www.osgeo.cn/pytest/

01、特点和书写规则

特点:

  • 非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考
  • 支持简单的单元测试和复杂的功能测试
  • 支持参数化
  • 执行测试过程中可以将某些测试跳过,或者对某些预期失败的 Case 标记成失败 支持重复执行失败的 Case
  • 支持运行由 Nose, Unittest 编写的测试 Case
  • 具有很多第三方插件,并且可以自定义扩展
  • 方便的和持续集成工具集成

安装:

通过pip命令安装指定版本

pip3 install pytest==5.4.3

pytest是python的第三方测试框架,是基于unittest的扩展框架,比unittest更简洁,更高效。

使用 pytest编写用例,必须遵守以下规则:

测试文件名必须以“test”开头或者"test"结尾(如:test_ab.py)
测试方法必须以“test”开头。test*.py 或 *test.py
测试类命名以“Test”开头。用例识别:包含所有test_*的方法(测试类不能带有— init—方法)
断言使用基本的assert即可
  1. 使用 pytest 需要更改 pycharm 集成设置

  2. Pytest 可以执行 uinttest 写的用例和方法

02、运行方式

运行方式分为两种

  • 命令行模式【建议】
  • 主函数模式

命令行模式【建议】

命令行中执行 pytest -s test_demo01.py

主函数模式

  1. import pytest

  2. class Test:def test_case01(self):print(1)

  3. def test_case02(self):print(2)# 主函数执行if __name__ == '__main__':pytest.main(['-s','test_demo01.py'])

在 test_demo01.py文件中增加主函数

-s 表示支持控制台打印,如果不加,print 不会出现任何内容

运行结果

  • . 表示成功
  • F 表示失败
小结:建议使用命令行的形式运行,对比主函数模式更加方便

03、setup 和 teardown

pytest 在运行自动化脚本的前后会执行两个特殊的方法,分别是 setup 和 teardown 在执行脚本之前会执行 setup方法,在执行脚本之后会执行 teardown 方法,我们可以在 setup 中进行获取驱动对象的操作,在teardown 中进行关闭驱动对象的操作

应用场景:

函数级别方法

运行于测试方法的始末,运行一次测试函数会运行一次 setup 和teardown。

示例代码

  1. import pytestclass Test:

  2. def setup(self):print('test--->setup')def teardown(self):print('test--->teardown')def test_case01(self):print('test--->1')

  3. def test_case02(self):print('test--->2')

  4. # 主函数执行if __name__ == '__main__':pytest.main(['-s','test_demo01.py'])

执行结果

示例代码

  1. import pytestclass Test:

  2. def setup_class(cls):print('test--->setupcls')def teardown_class(cls):print('test--->teardowncls')def test_case01(self):print('test--->1')

  3. def test_case02(self):print('test--->2')

  4. # 主函数执行if __name__ == '__main__':pytest.main(['-s','test_demo01.py'])

执行结果

02、Pytest-常用插件

插件列表网址: https://plugincompat.herokuapp.com包含很多插件包,大家可依据工作的需求选择 使用。

01、Pytest-html测试报告

应用场景

自动化测试脚本最终执行是通过还是不通过,需要通过测试报告进行体现

使用命令进行安装 指定版本

pip install pytest-html=2.1.1

执行命令

pytest test_login.py --html=report.html

查看报告

报告展示:

02、控制函数执行顺序

应用场景:

现实生活中,如果想下订单,必须先登录,我们可以通过插件的形式来控制函数执行的顺序 安装
使用命令 pip3 install pytest-ordering
  • 标记于被测试函数,@pytest.mark.run(order=x)
  • 根据order传入的参数来解决运行顺序
  • order值全为正数或全为负数时,运行顺序:值越小,优先级越高
  • 正数和负数同时存在:正数优先级高

示例代码

 
  1. import pytest

  2. class Test:

  3. def test_case01(self):print('test--->001')

  4. @pytest.mark.run(order=2)def test_case02(self):print('test--->002')

  5. @pytest.mark.run(order=1)def test_case03(self):print('test--->003')

执行结果

03、失败重试

应用场景:

由于网络的原因造成自动化脚本报错,我们可以使用失败重试的插件,当失败后尝试再次运行,一般情况最终成功可以视为成功,但最好进行进行排查时候是脚本问题
使用命令pip3install pytest-rerunfailures 进行安装使用

在配置文件中的命令行参数中增加 -- reruns n

pytest  -s test_demo2.py --reruns 3

示例代码

 
  1. class Test:

  2. def test_a(self):assert 1,1 # 断言成功

  3. def test_b(self):print('失败')assert 0,1 # 断言失败

运行结果

R 表示重试

注意重试时,如果脚本通过,那么后续不再重试

03、pytest高级用法

01、跳过测试函数

应用场景:

同一个软件在不同的设备上可能会有不同的效果,比如,iOS 的 3d touch 操作是需要 6s 以上设备支持 的,6 和 6s 都可以安装同一款应用,如果设备不支持,那么根本没有必要去测试这个功能。此时,我们可以 让这种函数进行跳过

使用方式:

在需要跳过的测试脚本之上加上装饰器 @pytest.mark.skipif(condition, reason="xxx")
conditionreason跳过的条件,必传参数标注原因,必传参数

示例代码:

 
  1. class Test:

  2. def test_a(self):assert 1,1 # 断言成功@pytest.mark.skipif(condition=True,reason='x')def test_b(self):print('失败')assert 0,1 # 断言失败

执行结果

02、预期失败

应用场景:

举例,测试手机号码输入框长度为11位数字,如果我们传入一个 12 位数字,此时可以使用预期失败
@pytest.mark.xfail(condition=None, reason=None, raises=None, run=True, strict=False)
  • condition 跳过条件,必填参数
  • reason 标注原因,必填参数

使用方式:

在需要标记预期失败的测试脚本之上加上装饰器示例

示例代码:

 
  1. class Test:

  2. def test_a(self):print('-----testa')assert 1,1 # 断言成功

  3. @pytest.mark.xfail(condition=True,reason='x')def test_b(self):print('-----testb')assert 0,1 # 断言失败

  4. @pytest.mark.xfail(condition=True, reason='x')def test_c(self):print('-----testc')assert 0, 2 # 断言失败

执行结果:

x 表示预期失败结果失败 不算是bug,X 表示预期失败结果成功 算是bug

03、数据参数化

应用场景:

登录功能都是输入用户名,输入密码,点击登录。但登录的用户名和密码如果想测试多个值是没有办法 用普通的操作 实现的。数据参数化可以帮我实现这样的效果。

方法名:

@pytest.mark.parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)
  • argnames 参数名
  • argvalues 参数对应值,类型必须为可迭代类型,一般使用list

一个参数使用方式

  • argnames 为字符串类型,根据需求决定何时的参数名
  • argvalues 为列表类型,根据需求决定列表元素中的内容
  • 在测试脚本中,参数,名字与 argnames 保持一致
  • 在测试脚本中正常使用

argvalues 列表有多少个内容,这个脚本就会运行几次

示例代码:

 
  1. class Test:

  2. @pytest.mark.parametrize('age',[18,19,23,21])def test_01(self,age):print(age)

执行结果:

多个参数:

 
  1. class Test:

  2. @pytest.mark.parametrize(('name','age'),[('zhangsan',18),('lisi',19)]) def test_01(self,name,age):print(name,age)

执行结果:

04、Pytest-fixture

应用场景:

fixture 修饰器来标记固定的工厂函数,在其他函数,类调用它时会被激活并优先执行,通常会被用于完成预置处理和重复操作

使用方式:

  • 通过函数引用

示例代码:

  1. class Testlogin:

  2. @pytest.fixture()def test_login(self):print('登录操作')uname = 'lily'return uname

  3. def test_a(self,test_login):print(f'test_a {test_login}')

  4. def test_b(self):print('不需要登录操作')

运行结果:

 

总结:

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

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

软件测试面试文档

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

 

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LLM与知识图谱

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

昆仑山矿泉水《大湾区旅行者》正式开机,携手共赴一场净化心灵之旅

在这个快节奏的时代,我们总在寻找一片能让心灵得以栖息的地方。今年,昆仑山矿泉水与深圳卫视再度携手,推出充满人文温情与自然探索的慢生活旅行综艺《大湾区旅行者》,目前已于8月29日开机启航。本次旅行,昆仑山矿泉水与…

废品回收小程序,从传统到现代化的回收模式

在数字化发展的当下,废品回收行业也进行了更新换代,由传统“喊卖”,到目前的线上回收,将互联网小程序与废品回收相结合,打造一个线上回收模式,让大众可以直接通过手机进行回收。小程序的出现不仅解决了传统…

四层神经网络,反向传播计算过程;四层神经网络中:y的函数公式是什么

目录 四层神经网络,反向传播计算过程 网络结构 前向传播 损失函数 反向传播 1. 计算输出层到隐藏层 2 的梯度 2. 计算隐藏层 2 到隐藏层 1 的梯度 3. 计算输入层到隐藏层 1 的梯度 梯度下降更新 四层神经网络,反向传播计算过程 在四层神经网络中,使用均方差损失函数…

H264结构及RTP封装

H264是一种针对视频的压缩编码方式。 一、压缩方法 H264主要基于以下几种方法,将数据进行压缩: 1.帧内预测压缩:解决空间域数据冗余的问题 2.帧间预测压缩:(运动估计与补偿)解决时间域数据冗余的问题 3…

项目实训:创建一张贺卡以及一只盒子——WEB开发系列27

以下是两道关于基础 CSS 盒模型和其他盒子相关特性的练习题,适合测试对这些概念的掌握程度,通过实际的设计任务来深入理解这些概念。 练习题 1: 设计一张中秋节海报贺卡 任务描述 制作一张精美的中秋节海报贺卡,用于庆祝这个传统节日。你的…

visual studio 2022更新以后,之前的有些工程编译出错,升级到Visual studio Enterprise 2022 Preview解决

系列文章目录 文章目录 系列文章目录前言一、解决方法 前言 今天遇到一个问题:visual studio 2022升级成预览版以后,之前的有些工程编译出错。首先代码、项目设置都没有改变,只是更新了visual studio 2022。 在编译工程时,编译器…

Source-code-of-charging-云快充协议1.5+互联互通协议+新能源汽车充电桩系统

介绍 SpringBoot 框架,充电桩平台充电桩系统充电平台充电桩互联互通协议云快充协议1.5-1.6协议新能源汽车二轮车公交车二轮车充电-四轮车充电充电源代码充电平台源码Java源码 软件架构 软件功能 小程序端:城市切换、附近电站、电桩详情页、扫码充电、…

视频智能分析打手机检测算法安防监控打手机检测算法应用场景、算法源码、算法模型介绍

随着智能手机的普及,手机已成为人们生活中不可或缺的一部分。然而,在某些场合,如驾驶、会议、学校课堂等,不当使用手机可能会导致安全隐患或干扰他人。因此,开发出一种能够准确识别并阻止不当使用手机的行为检测算法显…

技术故障和情感危机,哪个更难修复?

在数字化时代,软件服务的稳定性至关重要。 然而,数字时代的感情同样脆弱! 超单身时代 这一概念主要用来描述一个国家或地区中单身人口占据较大比例的社会现象。以日本为例,根据日本国立社会保障与人口问题研究所的推算,到2035年…

[bevformer渲染可视化] 2d框可视化 并可视化出小目标

可视化代码: 代码使用方法: 1.复制代码全文到任意python文件中 2.下载nuscenes v1.0-mini数据集,修改数据集路径,保证能读取到数据集 3.按照需求修改代码(本文是2dbox面积的面积和整个图片的面积比小于0.03视为小目标&#xff0…

电流互感器的操作、类型和极性注意事项

了解电流互感器及其在将大电流转换为小电流方面的重要作用,包括绕组比、类型以及保持计量极性的重要性。 电流互感器 (CT) 主要用于改变电压值。第二个结果是它们也会改变当前值。 升压变压器减少次级绕组中的电流,降压变压器增加次级绕组中的电流&…

vscode Git代码版本回退

在项目文件夹右键打开git bash,输入命令git log 查看提交的历史 commit,git log --prettyoneline将版本信息压缩到一行 使用git log可能会显示不全,按enter逐行查看,按end跳至末尾查看完成后,按q即可退出 找到自己想…

云计算实训40——部署nmt、部署project_exam_system项目

NMT N指的是nginx M指的是mysql T指的是tomcat 一、环境准备 #使用基础的docker指令来创建镜像,实现项目的发布 #安装docker、编辑daemon.json文件、安装docker-compose编排容器、启动docker #拖拽docker.sh的脚本[rootdocker--1 ~]# rz -Erz waiting to rec…

Qt QPushButton 按钮右上角增加小红点

简述 在项目里有时候应用类按钮在模块上新时&#xff0c;需要增加小红点提示。 效果图&#xff1a; 实现 实现的方法有很多 &#xff0c;下面介绍超简单的一种。 直接在按钮上贴一个 QLabel 即可。 #pragma once#include <QtWidgets/QWidget> #include "ui_paf…

宁武县乡村e镇招商引资暨产品推介会在京举办

2024年8月26日&#xff0c;宁武县乡村e镇招商引资暨产品推介会在北京市朝阳区五洲皇冠国际酒店举办。此次活动由山西省宁武县委、县政府主办&#xff0c;中国联合国采购促进会、中国商业文化研究会乡村振兴工作委员会协办&#xff0c;旨在宣传推介宁武县丰富的自然资源和农特产…

“1X”家用人形机器人:NEO Beta人形机器人,专为家庭使用而设计

1X机器人是指挪威人形机器人初创企业1X公司推出的一款名为NEO Beta的双足人形机器人原型。这款机器人专为家庭使用而设计&#xff0c;身高约1米65&#xff0c;体重30公斤&#xff0c;具有仿生设计&#xff0c;能够在人与人之间安全工作。NEO Beta采用了OpenAI的技术支持&#x…

spotbugs问题描述汉化

1 支持多语言 spotbugs自身支持问题描述的国际化&#xff0c;默认支持了英语、日语和法语。 问题描述都配置在messages.xml文件中。 (在源码中的位置&#xff1a;/spotbugs//spotbugs/etc/messages.xml) 2 多语言文件名 如果需要支持中文可以将messages.xml中的英文翻译过来。将…

Chapter 08 Vue生命周期

欢迎大家订阅【Vue2Vue3】入门到实践 专栏&#xff0c;开启你的 Vue 学习之旅&#xff01; 文章目录 前言一、生命周期阶段二、生命周期钩子三、生命周期图示 前言 Vue.js 是一个渐进式的 JavaScript 框架&#xff0c;广泛用于构建用户界面。理解 Vue 的生命周期对于开发高效、…

基于springboot+vue的在线商城系统

基于springbootvue的商城系统 (源码L文ppt)4-056 4 系统设计 4.1 系统功能模块设计 经过分析本系统的实际需求&#xff0c;系统主要分为三个模块&#xff0c;用户、商家以及管理员&#xff0c;具体的功能模块如图4-1所示&#xff1a; 图4-1 功能模块设计图 4.2…