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

devtools/2025/1/15 22:55:54/

在这里插入图片描述

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

在这里插入图片描述

简介

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

在这里插入图片描述

基本使用

测试函数形式

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

运行结果:

在这里插入图片描述

测试类形式

python"># 类形式
class TestDemo(uiltin">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同时支持主函数执行, 只需要加入以下代码片段:

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

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

python"># 类形式
class TestDemo(uiltin">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'])

动图演示效果:

在这里插入图片描述

特殊方法

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

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

代码示例:

python"># 类形式
class TestDemo(uiltin">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'])

运行结果:

在这里插入图片描述

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

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

代码示例:

python"># 类形式
class TestDemo(uiltin">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()

代码示例:

python"># 类形式
class TestDemo(uiltin">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_259">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_321">pytest常用插件

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

HTML报告插件

pytest-htmlpytest的一个插件, 可以为测试结果生成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
使用步骤

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

python">@pytest.mark.run(order=序号)

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

代码示例:

python">import pytestclass TestDemo(uiltin">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(uiltin">object):  # 类名必须以Test开头def test_method(self):  # 方法名必须以test开头'''错误代码'''print(f"num={10/0}")

终端输入pytest运行结果:

在这里插入图片描述

pytest_468">pytest高级功能

跳过操作

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

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

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

代码示例:

python">import pytestclass TestDemo(uiltin">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框架自带参数化功能, 调用对应方法并传入数据, 即可完成参数化实现.

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

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

代码示例:

python">import pytestclass TestDemo(uiltin">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

代码示例:

python">import pytestclass TestDemo(uiltin">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.ppmy.cn/devtools/150317.html

相关文章

计算机网络学习笔记

第1课 绪论、传输介质 【知识点回顾】 两种导线可以减小电磁干扰&#xff1a; 双绞线&#xff08;分为非屏蔽双绞线、屏蔽双绞线&#xff09;&#xff08;RJ-45用&#xff09;同轴电缆&#xff08;短距离使用&#xff09;网络通信的基本单位&#xff1a;位&#xff08;bit&…

CancerGPT :基于大语言模型的罕见癌症药物对协同作用少样本预测研究

今天我们一起来剖析一篇发表于《npj Digital Medicine》的论文——《CancerGPT for few shot drug pair synergy prediction using large pretrained language models》。该研究聚焦于一个极具挑战性的前沿领域&#xff1a;如何利用大语言模型&#xff08;LLMs&#xff09;在数…

HTTP详解——HTTP基础

HTTP 基本概念 HTTP 是超文本传输协议 (HyperText Transfer Protocol) 超文本传输协议(HyperText Transfer Protocol) HTTP 是一个在计算机世界里专门在 两点 之间 传输 文字、图片、音视频等 超文本 数据的 约定和规范 1. 协议 约定和规范 2. 传输 两点之间传输&#xf…

解决 Git SSL 连接错误:OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno

问题描述 在执行 git pull 命令时遇到以下错误&#xff1a; > git pull --tags origin main fatal: unable to access github仓库: OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 0这个错误通常表示 Git 在尝试通过 HTTPS 连接到 GitHub 时遇到了 SSL 连接问题。 解决方案…

网络安全 | 数据隐私保护:全球趋势与合规要求

网络安全 | 数据隐私保护&#xff1a;全球趋势与合规要求 一、前言二、全球数据隐私保护的主要趋势2.1 法律法规的强化2.2 消费者意识的觉醒2.3 技术创新推动隐私保护升级 三、不同国家和地区的数据隐私法规3.1 欧盟《通用数据保护条例》&#xff08;GDPR&#xff09;3.2 美国《…

CentOS 和 Ubantu你该用哪个

文章目录 **一、CentOS 和 Ubuntu 的详细介绍****1. CentOS****1.1 基本信息****1.2 特点****1.3 缺点** **2. Ubuntu****2.1 基本信息****2.2 特点****2.3 缺点** **二、CentOS 和 Ubuntu 的异同****1. 相同点****2. 不同点****3. 使用体验对比** **三、总结和选择建议** Cent…

neo4j 安装 (提供镜像下载方式

neo4j 安装 docker # 获取镜像 docker pull neo4j:community# 启动 docker run \--publish7474:7474 --publish7687:7687 \neo4j:communityfile download 文件下载的方式&#xff0c;访问 URL&#xff1a;https://neo4j.com/deployment-center/ 然后选择对应的平台&#xff…

单片机中运行多个定时器

在单片机的裸机编程环境中&#xff0c;同时运行多个定时器是完全可行的&#xff0c;但需要注意一些关键点以确保系统的稳定性和效率。以下是一些考虑因素和实现方法&#xff1a; 1. 硬件支持 定时器数量&#xff1a;首先确认您的单片机是否具备足够的定时器资源。大多数现代…