UI自动化测试保姆级教程--pytest详解(精简易懂)

在这里插入图片描述

欢迎来到啊妮莫的学习小屋
别让过去的悲伤,毁掉当下的快乐一《借东西的小人阿莉埃蒂》

在这里插入图片描述

简介

pytest是一个用于Python的测试框架, 支持简单的单元测试和复杂的功能测试. 和Python自带的UnitTest框架类似, 但是相比于UnitTest更加简洁, 效率更高.

特点

  1. 非常容易上手, 入门简单, 文档丰富, 文档中有很多实例可以参考

    官方文档地址: pytest: helps you write better programs — pytest documentation

  2. 支持简单的单元测试和复杂的功能测试.

  3. 支持参数化: UnitTest需要通过插件扩展参数化功能!

  4. 执行测试过程中可以将某些测试跳过, 或者对某些预期失败的Case标记成失败

  5. 支持重复执行失败的Case: 通过安装插件实现

  6. 支持运行UnitTest编写的测试Case

  7. 具有很多第三方插件, 并且可以自定义扩展

    插件获取网站: Pytest Plugin List - pytest documentation

安装

# 安装命令
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pytest
# 查看
pip show pytest
# 确认版本
pytest --version

在这里插入图片描述

基本使用

测试函数形式

# 函数形式
def test_func():# 要求函数必须以test开头'''测试函数'''print('测试函数001')

运行结果:

在这里插入图片描述

测试类形式

# 类形式
class TestDemo(object):  # 类名必须以Test开头def test_method_01(self):  # 方法名必须以test开头'''测试方法 1'''print('测试方法 1')def test_method_02(self):'''测试方法 2'''print('测试方法 2')def text(self):'''不以test开头的方法'''print('text方法')

运行结果:

在这里插入图片描述

注意点:

类名以Test开头, 函数名或方法名以test开头, 否则不予执行

主函数执行

上述两种执行方式均为终端命令执行; pytest同时支持主函数执行, 只需要加入以下代码片段:

# 导包
import pytestif __name__ == '__main__':pytest.main(['-s','执行文件名称'])

以下以上述测试类形式为例:

# 类形式
class TestDemo(object):  # 类名必须以Test开头def test_method_01(self):  # 方法名必须以test开头'''测试方法 1'''print('测试方法 1')def test_method_02(self):'''测试方法 2'''print('测试方法 2')def text(self):'''不以test开头的方法'''print('text方法')if __name__ == '__main__':pytest.main(['-s','hm04_pytest_basic_04.py'])

动图演示效果:

在这里插入图片描述

特殊方法

函数级别
class TestDemo(object):  def setup_method(self):'''用例前执行准备工作'''passdef teardown_method(self):'''用例后扫尾工作'''pass

注意: 特殊方法名写法固定:setup_method 和 teardown_method, 没有代码提示, 需要手写.

代码示例:

# 类形式
class TestDemo(object):  # 类名必须以Test开头def setup_method(self):'''用例前执行准备工作'''print('开始测试')def teardown_method(self):'''用例后扫尾工作'''print('结束测试')def test_method_01(self):  # 方法名必须以test开头'''测试方法 1'''print('测试注册逻辑代码...')def test_method_02(self):'''测试方法 2'''print('测试登陆逻辑代码...')if __name__ == '__main__':pytest.main(['-s','pytest_basic_05.py'])

运行结果:

在这里插入图片描述

类级别
class TestDemo(object):  # 类名必须以Test开头def setup_class(self):'''用例前执行准备工作'''passdef teardown_class(self):'''用例后扫尾工作'''pass

注意: 与函数级别的特殊方法一致, setup_class 和 teardown_class也是写法固定的.

代码示例:

# 类形式
class TestDemo(object):  # 类名必须以Test开头def setup_class(self):'''用例前执行准备工作'''print('开始测试')def teardown_class(self):'''用例后扫尾工作'''print('结束测试')def test_method_01(self):  # 方法名必须以test开头'''测试方法 1'''print('测试注册逻辑代码...')def test_method_02(self):'''测试方法 2'''print('测试登陆逻辑代码...')if __name__ == '__main__':pytest.main(['-s','pytest_basic_06.py'])

运行结果:

在这里插入图片描述

执行顺序

执行顺序:
setup_class() --> setup_method() --> 测试方法 1 --> teardown_method() -->setup_method() --> 测试方法 2 --> teardown_method() --> (以此类推) -->teardown_class()

代码示例:

# 类形式
class TestDemo(object):  # 类名必须以Test开头def setup_class(self):print('开始测试 类级别')def teardown_class(self):print('结束测试 类级别')def setup_method(self):print('开始测试 函数级别')def teardown_method(self):print('结束测试 函数级别')def test_method_01(self):  # 方法名必须以test开头'''测试方法 1'''print('测试注册逻辑代码...')def test_method_02(self):'''测试方法 2'''print('测试登陆逻辑代码...')if __name__ == '__main__':pytest.main(['-s','pytest_basic_07.py'])

运行结果:

在这里插入图片描述

pytest配置文件

使用pytest.ini配置文件后可以快速的使用配置的项来选择执行哪些测试模块

注意:

1.在Windows系统中, pytest.ini配置文件中, 不可以写注释

2.一个工程中只需要一个pytest配置文件, 并且需要保证文件名正确

3.一般情况下, 只需要将pytest.ini 置于工程根目录下

4.配置有pytest.ini的文件, 只需要在终端输入pytest指令, 即可执行测试

pytest配置项有很多, 可以在终端输入pytest --help来执行

在这里插入图片描述

配置文件示例:

[pytest]
testpaths = ./
addopts = -s
python_files=pytest*.py
python_classes=Test*
python_functions=test*

在这里插入图片描述

输入pytest指令执行结果:

在这里插入图片描述

注意: 默认情况下 测试文件名/类名/方法函数名 均以Test或test开头.

当然我们可以通过配置文件进行自定义. 例如:测试类名以 CeShi 开头

[pytest]
testpaths = ./
addopts = -s
python_files=test*.py
python_classes=CeShi*
python_functions=test*

例如:指定某一个 文件/类/方法 执行 (指定pytest_basic_06.py)

[pytest]
testpaths = ./
addopts = -s
python_files=pytest_basic_06.py
python_classes=CeShi*
python_functions=test*

pytest常用插件

pytest拥有很多第三方插件. 以下介绍几个常用的.

HTML报告插件

pytest-html是pytest的一个插件, 可以为测试结果生成HTML报告.

安装
pip install pytest-html
使用步骤

在pytest.ini文件中添加参数选项:

--html=./报告路径/报告  #指定报告文件的存放位置(会自动创建)
--self-contained-html  #将CSS文件内嵌到HTML文件中

配置文件示例:

[pytest]
testpaths = ./
addopts = -s--html=./report/report.html--self-contained-html
python_files=pytest*.py
python_classes=Test*
python_functions=test*

输入pytest指令执行结果:

在这里插入图片描述

查看报告

在这里插入图片描述

控制方法执行顺序插件

在使用Python进行单元测试或者集成测试的时候, 通常测试用例的执行顺序是自动排序的. 不过在某些情况下, 特别是当测试用例存在依赖关系的时候, 我们可能希望自定义测试的执行顺序.Python提供了一个实用的插件–>pytest-ordering

安装
pip install pytest-ordering
使用步骤

直接在测试类测试方法上方添加以下代码:

@pytest.mark.run(order=序号)

注意:
序号支持正负数;
纯正数或者纯负数:数字越小,优先级越高;
正负混合:正数先按序执行, 再负数按序执行;

代码示例:

import pytestclass TestDemo(object):  # 类名必须以Test开头@pytest.mark.run(order=-5)def test_method_01(self):  # 方法名必须以test开头'''测试方法 1'''print('测试方法 1...')@pytest.mark.run(order=-2)def test_method_02(self):'''测试方法 2'''print('测试方法 2...')@pytest.mark.run(order=2)def test_method_03(self):'''测试方法 3'''print('测试方法 3...')if __name__ == '__main__':pytest.main(['-s', 'pytest_basic_08.py'])

运行结果:

在这里插入图片描述

失败重试插件

pytest-rerunfailures是一个基于pytest框架的插件, 它允许我们对测试用例进行失败重试.

安装
pip install pytest-rerunfailures
使用步骤

在pytest.ini文件中添加参数选项:

--reruns 次数  #指定失败后的执行次数

配置文件示例:

[pytest]
testpaths = ./
addopts = -s--html=./report/report.html--self-contained-html--reruns 1  
python_files=pytest*.py
python_classes=Test*
python_functions=test*

创建一个测试用例文件, 包含异常代码:

# 类形式
class TestDemo(object):  # 类名必须以Test开头def test_method(self):  # 方法名必须以test开头'''错误代码'''print(f"num={10/0}")

终端输入pytest运行结果:

在这里插入图片描述

pytest高级功能

跳过操作

对于完成的代码或者版本不对应的代码, 可以设置跳过让代码不执行

在测试类/方法上方添加以下代码:

@pytest.mark.skipif(符合的条件, reason='跳过的原因')

代码示例:

import pytestclass TestDemo(object):  # 类名必须以Test开头version = 2.5@pytest.mark.skipif(version <= 5, reason='版本过低,测试用例失效')def test_method_01(self):  # 方法名必须以test开头'''测试方法 1'''print('测试方法 1...\n')version = 5.6@pytest.mark.skipif(version <= 5, reason='版本过低,测试用例失效')def test_method_02(self):'''测试方法 2'''print('测试方法 2...\n')version = 7.0@pytest.mark.skipif(version <= 5, reason='版本过低,测试用例失效')def test_method_03(self):'''测试方法 3'''print('测试方法 3...\n')if __name__ == '__main__':pytest.main(['-s', 'pytest_basic_09.py'])

运行结果:

在这里插入图片描述

参数化操作

pytest框架自带参数化功能, 调用对应方法并传入数据, 即可完成参数化实现.

@pytest.mark.parametrize('参数1, 参数2', [(数据1-1,数据1-2),(数据2-1,数据2-2)] )
# 同组数据之间用 , 分割, 不同组数据之间用 () 分割
def test_method_01(self,参数1,参数2):  pass

注意: 测试方法中需要传入参数名

代码示例:

import pytestclass TestDemo(object):  # 类名必须以Test开头# 单个参数@pytest.mark.parametrize('stu',[('张三'),('李四'),('王五')])def test_method_01(self,stu):  # 方法名必须以test开头'''测试方法 1'''print('学生名字:',stu)# 多个参数@pytest.mark.parametrize('用户名, 密码', [('zs', '12345'), ('lisi', 'abcde'), ('wwu', '01010')])def test_method_02(self,用户名,密码):'''测试方法 2'''print(f'用户名:{用户名} && 密码:{密码}')if __name__ == '__main__':pytest.main(['-s', 'pytest_basic_10.py'])

运行结果:

在这里插入图片描述

断言操作

UnitTest框架不同的是, pytest框架使用的是Python自带的断言–assert

代码示例:

import pytestclass TestDemo(object):  # 类名必须以Test开头# 多个参数@pytest.mark.parametrize('用户名, 密码', [('zs', '12345'), ('lisi', 'abcde'), ('wwu', '01010')])def test_method_01(self, 用户名, 密码):'''测试方法 2'''# assert 条件# 如果不满足条件则会断言报错assert 密码 != '01010'print(f'用户名:{用户名} && 密码:{密码}')if __name__ == '__main__':pytest.main(['-s', 'pytest_basic_11.py'])

运行结果:

在这里插入图片描述

感谢铁汁萌花时间来看我写的文章~ 以上就是本篇文章的所有内容了, 如果对你有所帮助的话, 还请给我点一个小小的赞哦~💖 期待你的关注和三连🌈🌈

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于Mac使用VSCode连接虚拟机

1. 下载插件 输入Remote - SSH下载下图两个插件。 2. 配置虚拟机信息 按图示步骤点击完成后&#xff0c;进入到虚拟主机的配置页面。 其中Host可以自定义主机名&#xff0c;HostName是虚拟机ip&#xff0c;可以通过ifconfig eth0查看ip&#xff0c;User是虚拟机的用户名。…

细说STM32F407单片机以轮询方式读写外部SRAM的方法

目录 一、实例的功能 二、工程配置 1、KEYLED 2、时钟、DEBUG、USART6、NVIC、GPIO、CodeGenerator 3、FSMC &#xff08;1&#xff09; 模式设置 &#xff08;2&#xff09; Bank 1子区3参数设置 1) NOR/PSRAM control组&#xff0c;子区控制参数 2) NOR/PSRAM timi…

Eclipse配置Tomcat服务器(最全图文详解)

前言&#xff1a; 本章使用图文讲解如何在Eclipse开发工具中配置Tomcat服务器、如何创建和启动JavaWeb工程&#xff0c;欢迎童鞋们互相交流。觉得不错可以三连订阅喔。 目标&#xff1a; 一、配置Tomcat服务器 1. 切换Eclipse视图 2. 打开菜单 3. 找到服务选项 4. 选择…

uniapp vue2版本如何设置i18n

如何设置i18n在该软件设置过语言的情况下优先选择所设置语言&#xff0c;在没有设置的情况下&#xff0c;获取本系统默认语言就&#xff0c;将系统默认语言设置为当前选择语言。 1、下载依赖&#xff1a; npm install vue-i18n --save 2、创建相关文件&#xff08;在最外层&…

QPS和TPS 的区别是什么?QPS 大了会有什么问题,怎么解决?

QPS 和 TPS 的区别是什么&#xff1f;QPS 大了会有什么问题&#xff0c;怎么解决&#xff1f; QPS&#xff08;Queries Per Second&#xff09;和 TPS&#xff08;Transactions Per Second&#xff09;都是衡量系统性能的重要指标&#xff0c;尤其是在 Web 服务、数据库和分布…

《Spring Framework实战》4:Spring Framework 文档

欢迎观看《Spring Framework实战》视频教程 概述 历史&#xff0c; 设计理念&#xff0c; 反馈&#xff0c; 开始。 核心技术 IoC 容器、事件、资源、i18n、 验证、数据绑定、类型转换、SpEL、AOP、AOT。 测试 Mock 对象、TestContext 框架、 Spring MVC 测试&#xff0c;…

经典多模态模型CLIP - 直观且详尽的解释

对比语言-图像预训练&#xff08;CLIP&#xff09;&#xff0c;这是一种创新的多模态建模策略&#xff0c;能够创建视觉和语言的联合表示。CLIP 的效果非常出色&#xff0c;可以用于构建高度特定且性能卓越的分类器&#xff0c;而无需任何训练数据。本文将深入探讨其理论基础&a…

vulnhub靶场【DC系列】之7

前言 靶机&#xff1a;DC-7&#xff0c;IP地址为192.168.10.13 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.2 都采用VMWare&#xff0c;网卡为桥接模式 对于文章中涉及到的靶场以及工具&#xff0c;我放置在网盘中&#xff0c;链接&#xff1a;https://pan.quark…

内网基础-防火墙-隧道技术

内网对抗-网络通讯篇&防火墙组策略&入站和出站规则&单层双层&C2正反向上线 关闭第一个防火墙&#xff1a; 第一个上线就走反向或者正向 第二个上线走反向&#xff08;第二个防火墙阻止入站&#xff09; 关闭第二个防火墙&#xff1a; 第一个上线就走反向&a…

BGP的local_preference本地优先级属性

一、BGP的local preference属性简介 1、local preference公认任意属性 当一条BGP路由器中存在多条去往同一目标网络的BGP路由时&#xff0c;BGP协议会对这些BGP路由属性进行比较&#xff0c;从而筛选出最佳到达目标网络的通达路径。本地优先属性&#xff0c;只在IBGP对等体之间…

从零手写线性回归模型:PyTorch 实现深度学习入门教程

系列文章目录 01-PyTorch新手必看&#xff1a;张量是什么&#xff1f;5 分钟教你快速创建张量&#xff01; 02-张量运算真简单&#xff01;PyTorch 数值计算操作完全指南 03-Numpy 还是 PyTorch&#xff1f;张量与 Numpy 的神奇转换技巧 04-揭秘数据处理神器&#xff1a;PyTor…

如何让用户在网页中填写PDF表格?

在网页中让用户直接填写PDF表格&#xff0c;可以大大简化填写、打印、扫描和提交表单的流程。通过使用复选框、按钮和列表等交互元素&#xff0c;PDF表格不仅让填写过程更高效&#xff0c;还能方便地在电脑或移动设备上访问和提交数据。 以下是在浏览器中显示可填写PDF表单的四…

【和春笋一起学C++】文本输入与读取(二)

目录 使用cin.eof()或cin.fail()检测EOF 使用cin.get(ch)的返回结果检测EOF 使用cin.get()的返回结果检测EOF 上篇文章《文本输入与读取》学习了遇到某个字符时停止读取&#xff0c;那如果要读取键盘输入的所有字符该怎么做呢。答案是检测文件尾&#xff08;EOF&#xff09;…

Ungoogled Chromium127 编译指南 MacOS篇(八)- 开始编译

1. 引言 完成了所有依赖包的安装后&#xff0c;我们终于来到了最关键的编译阶段。在开始编译之前&#xff0c;有一些重要的配置信息需要了解。本文将指导您完成整个编译过程。 2. 签名相关说明 虽然在我们的测试编译中不需要进行签名操作&#xff0c;但了解官方的签名要求仍…

Jenkins内修改allure报告名称

背景&#xff1a; 最近使用Jenkins搭建自动化测试环境时&#xff0c;使用Jenkins的allure插件生成的报告&#xff0c;一直显示默认ALLURE REPORT&#xff0c;想自定义成与项目关联的名称&#xff0c;如图所示&#xff0c;很明显自定义名称显得高大上些 本地修改方法&am…

关于物联网的基础知识(二)——物联网体系结构分层

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于物联网的基础知识&#xff08;二&a…

应急响应——Windows / Linux 排查笔记

一、基本思路流程 收集信息&#xff1a;收集客户信息和中毒主机信息&#xff0c;包括样本判断类型&#xff1a;判断是否是安全事件&#xff0c;何种安全事件&#xff0c;勒索、挖矿、断网、DoS 等等抑制范围&#xff1a;隔离使受害⾯不继续扩⼤深入分析&#xff1a;日志分析、…

Git撤销指定commit并更新远端仓库

Git撤销指定commit并更新远端仓库 一、撤销指定commit 1.首先执行git log 命令&#xff0c;查看git历史提交以及commit信息&#xff1a; 由于需要脱敏&#xff0c;所以截图可能看得马赛克比较多&#xff0c;需要关注的就是上面的commit后跟的id&#xff0c;以及HEAD当前指定…

C 语言奇幻之旅 - 第16篇:C 语言项目实战

目录 引言1. 项目规划1.1 需求分析与设计1.1.1 项目目标1.1.2 功能需求1.1.3 技术实现方案 2. 代码实现2.1 模块化编程2.1.1 学生信息模块2.1.2 成绩管理模块 2.2 调试与测试2.2.1 调试2.2.2 测试2.2.4 测试结果 3. 项目总结3.1 代码优化与重构3.1.1 代码优化3.1.2 代码重构 3.…

2025最新解决方案:新买的mac鼠标和这个触控板反向

solution1 &#xff1a;1.打开设置&#xff0c;搜索 触控 点击 自然滚动 ----->解决的是 触控板 但是还是解决不了鼠标反向的问题 solution1 ultra&#xff1a; 下载一个免费 且纯净的 软件 Scroll Reverser for macOS 这是给出的链接&#xff0c;非常简单&#xff0c;…