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.mzph.cn/diannao/66510.shtml

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

相关文章

微信小程序实现长按录音,点击播放等功能,CSS实现语音录制动画效果

有一个需求需要在微信小程序上实现一个长按时进行语音录制&#xff0c;录制时间最大为60秒&#xff0c;录制完成后&#xff0c;可点击播放&#xff0c;播放时再次点击停止播放&#xff0c;可以反复录制&#xff0c;新录制的语音把之前的语音覆盖掉&#xff0c;也可以主动长按删…

Clojure语言的数据库编程

Clojure语言的数据库编程 引言 在当今社会&#xff0c;数据的处理和管理已经成为一个不可或缺的部分。无论是互联网应用、企业系统还是移动应用&#xff0c;都需要与数据库进行频繁的交互。因此&#xff0c;选择一种合适的编程语言和相应的库来进行数据库编程显得尤为重要。C…

Javascript算法——贪心算法(一)

贪心算法详解&#xff08;JavaScript&#xff09;&#xff08;局部最优->全局最优&#xff09; 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取当前状态下的最优选择&#xff08;局部最优&#xff09;的算法设计方法。通过局部最优解的累积&…

[读书日志]从零开始学习Chisel 第九篇:Scala的内建控制结构(敏捷硬件开发语言Chisel与数字系统设计)

6.Scala的内建控制结构 6.1 if表达式 和大部分编程语言的if表达式使用上没有区别&#xff0c;单句话不需要加花括号&#xff0c;多个语句需要加花括号&#xff0c;直接来看一段代码&#xff1a; scala> def whichInt(x:Int) {| if(x 0) "Zero"| else if(x &g…

AI大模型-提示工程学习笔记5

卷首语&#xff1a;我所知的是我自己非常无知&#xff0c;所以我要不断学习。 写给AI入行比较晚的小白们&#xff08;比如我自己&#xff09;看的&#xff0c;大神可以直接路过无视了。 零提示是什么 “零提示”&#xff08;Zero-shot&#xff09;是指在没有提供任何特定示例…

全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之循环结构(while循环应用)

在 C 编程的世界里&#xff0c;循环结构是掌控程序流程的关键工具之一&#xff0c;而while循环更是其中的经典。它就像一个不知疲倦的小卫士&#xff0c;只要条件满足&#xff0c;就会持续执行特定的代码块&#xff0c;可以解决诸多复杂的编程任务。本文就一同深入探索while循环…

CK18——肝损伤无创诊断标志物

肝脏作为人体至关重要的代谢与解毒器官&#xff0c;极易遭受病毒、药物、酒精及不良饮食等多种因素的损害&#xff0c;进而引发一系列如非酒精性脂肪肝&#xff08;NAFLD&#xff09;、肝纤维化、肝硬化、肝细胞癌以及各类肝炎等病症。因此&#xff0c;确定一种高可靠性、非侵入…

.NET Core + Kafka 开发指南

什么是Kafka Apache Kafka是一个分布式流处理平台,由LinkedIn开发并开源,后来成为Apache软件基金会的顶级项目。Kafka主要用于构建实时数据管道和流式应用程序。 Kafka 架构 从下面3张架构图中可以看出Kafka Server 实际扮演的是Broker的角色, 一个Kafka Cluster由多个Bro…

软件体系结构与设计模式

在软件开发中&#xff0c;软件体系结构和设计模式是两个至关重要的概念。它们帮助开发者设计出易于理解、可扩展、可维护的系统。尽管这两个概念密切相关&#xff0c;但它们分别关注系统的不同方面&#xff1a;软件体系结构关注的是系统整体结构的设计&#xff0c;而设计模式则…

[离线数仓] 总结二、Hive数仓分层开发

接 [离线数仓] 总结一、数据采集 5.8 数仓开发之ODS层 ODS层的设计要点如下: (1)ODS层的表结构设计依托于从业务系统同步过来的数据结构。 (2)ODS层要保存全部历史数据,故其压缩格式应选择压缩比率,较高的,此处选择gzip。 CompressedStorage - Apache Hive - Apac…

Unity3D仿星露谷物语开发19之库存栏丢弃及交互道具

1、目标 从库存栏中把道具拖到游戏场景中&#xff0c;库存栏中道具数相应做减法或者删除道具。同时在库存栏中可以交换两个道具的位置。 2、UIInventorySlot设置Raycast属性 在UIInventorySlot中&#xff0c;我们只希望最外层的UIInventorySlot响应Raycast&#xff0c;他下面…

阿里云代理商热销产品推荐

在数字化浪潮的推动下&#xff0c;企业对于云计算的依赖日益加深。阿里云&#xff0c;作为中国领先的云计算服务提供商&#xff0c;为企业提供了丰富多样的云产品和服务。本文将聚焦于阿里云代理商热销产品推荐&#xff0c;探讨其如何帮助企业高效利用云资源&#xff0c;加速数…

Python入门教程 —— 多任务

1.线程 1.1.线程安全问题 线程访问全局变量 import threading g_num = 0 def test(n):global g_numfor x in range(n):g_num += xg_num -= xprint(g_num)if __name__ == __main__:t1 = threading.Thread(target=test, args=(10,))t2 = threading.Thread(target=test, args=(…

江科大STM32入门——IIC通信笔记总结

wx&#xff1a;嵌入式工程师成长日记 &#xff08;一&#xff09;简介 STM32内部集成了硬件I2C收发电路&#xff0c;可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能&#xff0c;减轻CPU的负担 支持多主机 支持7位/10位地址模式 支持不同的通讯速…

vue3 vite 动态加载路由遇到的问题

记录一下动态加载路由遇到的问题 正常使用import引入静态路由是没问题的 component: () > import(/components/ExampleComponent.vue)动态引入的时候写成import就不行了 由于后端给的路由格式比较反人类…我这边先递归把获取到的数据格式做了一个整合. const processedDa…

MySQL安装,配置教程

一、Linux在线yum仓库安装 打开MySQL官方首页&#xff0c;链接为&#xff1a;https://www.mysql.com/ 界面如下&#xff1a; 在该页面中找到【DOWNOADS】选项卡&#xff0c;点击进入下载页面。 在下载界面中&#xff0c;可以看到不同版本的下载链接&#xff0c;这里选择【My…

Elixir语言的面向对象编程

Elixir语言的面向对象编程探讨 引言 Elixir是一种基于Erlang虚拟机的函数式编程语言&#xff0c;旨在支持可扩展性和维护性。尽管Elixir的核心特性是函数式编程模型&#xff0c;但它依然能够实现面向对象编程&#xff08;OOP&#xff09;的某些特性。本文将深入探讨如何在Eli…

【工具】HTML自动识别用户正在讲话 以及停止讲话

【工具】HTML自动识别用户正在讲话 以及停止讲话 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>语…

HTML5 滑动效果(Slide In/Out)详解

HTML5 滑动效果&#xff08;Slide In/Out&#xff09;详解 滑动效果&#xff08;Slide In/Out&#xff09;是一种常见的动画效果&#xff0c;使元素从一侧滑入或滑出&#xff0c;增强页面的动态感和用户体验。以下是滑动效果的详细介绍及实现示例。 1. 滑动效果的特点 动态视…

面试题: 对象继承的方式有哪些

在 JavaScript 中&#xff0c;对象继承可以通过多种方式实现。每种方法都有其特点和适用场景。以下是几种常见的对象继承方式&#xff1a; 1. 原型链继承&#xff08;Prototype Chain Inheritance&#xff09; 这是最基础的对象继承方式&#xff0c;利用了 JavaScript 的原型…