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 pytest

if __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):
        '''用例前执行准备工作'''
        pass
    def 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):
        '''用例前执行准备工作'''
        pass
        
    def 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 pytest

class 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 pytest

class 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 pytest

class 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 pytest

class 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'])

运行结果:

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基类指针指向派生类对象,基类指针的首地址永远指向子类从基类继承的基类首地址

文章目录 基类指针指向派生类对象&#xff0c;基类指针的首地址永远指向子类从基类继承的基类起始地址。代码代码2 基类指针指向派生类对象&#xff0c;基类指针的首地址永远指向子类从基类继承的基类起始地址。 代码 #include <iostream> using namespace std;class b…

分布式Id方案选择

分布式 ID 方案选择 在当今分布式系统日益盛行的背景下&#xff0c;分布式 ID 生成方案的选择成为了众多开发者关注的焦点。一个优秀的分布式 ID 方案&#xff0c;不仅能够确保生成的 ID 全局唯一&#xff0c;避免数据冲突&#xff0c;还能在高并发、大规模的分布式环境中保持…

花生好坏缺陷识别数据集,7262张图片,支持yolo,coco json,pasical voc xml格式的标注,识别准确率在95.7%

花生好坏缺陷识别数据集,7262张图片&#xff0c;支持yolo&#xff0c;coco json&#xff0c;pasical voc xml格式的标注&#xff0c;识别准确率在95.7% 数据集分割 训练组87&#xff05; 6353图片 有效集8% 606图片 测试集4% 303图片 预处理 自动定…

springboot 集成 etcd

springboot 集成 etcd 往期内容 ETCD 简介docker部署ETCD 前言 好久不见各位小伙伴们&#xff0c;上两期内容中&#xff0c;我们对于分布式kv存储中间件有了简单的认识&#xff0c;完成了docker-compose 部署etcd集群以及可视化工具 etcd Keeper&#xff0c;既然有了认识&a…

【递归与分治】Leetcode23:合并K个升序链表

一、题目描述 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xff1a;链表数…

将分支A某一个commit合并到分支B

1.寻找A分支的commit 在分支B下&#xff0c;点击git找到分支A的历史提交记录,如图所示&#xff1a; 2.点击分支A的某个commit&#xff0c;进行合并到分支B 将这个commit&#xff0c;进行cherry-Pick&#xff0c;就可以把分支A的合并到分支B上的本地仓库中&#xff0c;然后就可…

如何快速上手一个鸿蒙工程

作为一名鸿蒙程序猿&#xff0c;当你换了一家公司&#xff0c;或者被交接了一个已有的业务。前辈在找你之前十分钟写了一个他都看不懂的交接文档&#xff0c;然后把一个鸿蒙工程交接给你了&#xff0c;说以后就是你负责了。之后几天你的状态大概就是下边这样的&#xff0c;一堆…

预训练语言模型——BERT

1.预训练思想 有了预训练就相当于模型在培养大学生做任务&#xff0c;不然模型初始化再做任务就像培养小学生 当前数据层面的瓶颈是能用于预训练的语料快被用完了 现在有一个重要方向是让机器自己来生成数据并做微调 1.1 预训练&#xff08;Pre - training&#xff09;vs. 传…

关于FPGA(现场可编程门阵列)工程技术人员的详细介绍

一、FPGA工程技术人员概述 FPGA工程技术人员是专注于现场可编程门阵列&#xff08;FPGA&#xff09;设计、开发、测试及优化的专业技术人员。他们利用FPGA的灵活性和可编程性&#xff0c;为各种应用创建高效、定制化的硬件解决方案。 二、主要工作任务 FPGA逻辑设计&#xf…

机器学习模型评估指标

模型的评估指标是衡量一个模型应用于对应任务的契合程度&#xff0c;常见的指标有&#xff1a; 准确率&#xff08;Accuracy&#xff09;: 正确预测的样本数占总样本数的比例。适用于类别分布均衡的数据集。 精确率&#xff08;Precision&#xff09;: 在所有被预测为正类的样…

基于html5实现音乐录音播放动画源码

源码介绍 基于html5实现音乐录音播放动画源码是一款类似Shazam的UI&#xff0c;点击按钮后&#xff0c;会变成为一个监听按钮。旁边会有音符飞入这个监听按钮&#xff0c;最后转换成一个音乐播放器。 效果预览 源码获取 基于html5实现音乐录音播放动画源码

基于深度学习的视觉检测小项目(六) 项目的信号和变量的规划

• 关于前后端分离 当前流行的一种常见的前后端分离模式是vueflask&#xff0c;vueflask模式的前端和后端之间进行数据的传递通常是借助 API&#xff08;应用程序编程接口&#xff09;来完成的。vue通过调用后端提供的 API 来获取或提交数据。例如&#xff0c;前端可能通过发送…

文件传输速查表:Windows 和 Linux

文件传输速查表&#xff1a;Windows 和 Linux 免责申明 本文章仅供网络安全相关学习与研究使用&#xff0c;旨在促进技术交流与安全知识普及&#xff0c;严禁将本文内容及相关工具用于未授权的渗透测试或任何违法活动。 重要声明&#xff1a; 由于传播、使用本文章所提供的信…

基于SpringBoot+Vue的“有光”摄影分享网站系统

基于SpringBootVue的“有光”摄影分享网站系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345…

课题推荐——基于GPS的无人机自主着陆系统设计

关于“基于GPS的无人机自主着陆系统设计”的详细展开&#xff0c;包括项目背景、具体内容、实施步骤和创新点。如需帮助&#xff0c;或有导航、定位滤波相关的代码定制需求&#xff0c;请点击文末卡片联系作者 文章目录 项目背景具体内容实施步骤相关例程MATLAB例程python例程 …

腾讯云AI代码助手编程挑战赛-凯撒密码解码编码器

作品简介 在CTFer选手比赛做crypto的题目时&#xff0c;一些题目需要自己去解密&#xff0c;但是解密的工具大部分在线上&#xff0c;而在比赛过程中大部分又是无网环境&#xff0c;所以根据要求做了这个工具 技术架构 python语言的tk库来完成的GUI页面设计&#xff0c;通过…

《机器学习》集成学习之随机森林

目录 一、集成学习 1、简介 2、集成学习的代表 3、XGBoost和随机森林的对比 相同点&#xff1a; 不同点&#xff1a; 二、Bagging之随机森林 1、简介 2、随机森林的核心思想 3、随机森林生成步骤 4、随机森林的优点 5、随机森林的缺点 三、随机森林的代码实现 1、…

四、VSCODE 使用GIT插件

VSCODE 使用GIT插件 一下载git插件与git Graph插件二、git插件使用三、文件提交到远程仓库四、git Graph插件 一下载git插件与git Graph插件 二、git插件使用 git插件一般VSCode自带了git&#xff0c;就是左边栏目的图标 在下载git软件后vscode的git插件会自动识别当前项目 …

JS进阶--JS听到了不灭的回响

作用域 作用域&#xff08;scope&#xff09;规定了变量能够被访问的“范围”&#xff0c;离开了这个“范围”变量便不能被访问 作用域分为局部和全局 局部作用域 局部作用域分为函数和块 那 什么是块作用域呢&#xff1f; 在 JavaScript 中使用 { } 包裹的代码称为代码块…

《自动驾驶与机器人中的SLAM技术》ch1:自动驾驶

目录 1.1 自动驾驶技术 1.2 自动驾驶中的定位与地图 1.1 自动驾驶技术 1.2 自动驾驶中的定位与地图 L2 在技术实现上会更倾向于实时感知&#xff0c;乃至可以使用感知结果直接构建鸟瞰图&#xff08;bird eye view, BEV&#xff09;&#xff0c;而 L4 则依赖离线地图。 高精地…