pytest框架的基本使用

news2024/11/17 8:51:36

1. 测试框架的作用

测试框架不关系用例的内容

它关心的是:用例编排和结果收集

2. pytest框架的特点

1. 适用于python语言

2. 用法符合python风格

3. 有丰富的生态

3. 安装pytest框架

1. 新建一个项目

2. 在项目终端窗口输入如下命令,用于安装pytest,其中-U是表示更新到最新的版本(如果你已经有了pytest,但是不是最新版,也会进行下载最新版)

pip install pytest -U

3. 下载完成后可以输入如下命令查看pytest是否安装成功

pip list

如果输出的列表中存在pytest,并且版本为最新,则安装成功。

4. pytest的用例发现规则

1. 以test_开头和以_test为结尾的文件 中收集用例

2. 从 以Test_开头的类 中收集用例(类不能包含__init__()方法)

3. 以test_开头的函数和方法 会作为测试用例

注意:作为测试用例的函数不能含有参数和返回值

5. 编写和执行测试用例

编写测试用例

编写测试用例就是通过代码实现用例的逻辑,可以通过assert来确定用例是否执行成功

class Test_A:
    def test_1(self):
        assert 1 == 1

    def test_2(self):
        assert 2 == 2

执行测试用例

方法一:通过执行pytest自带的main方法,该方法会执行项目中的所有用例

方法二:通过在终端输入命令行的方式,如下

pytest

执行不符合规则的文件中的用例

通过在终端中执行如下命令,符合的文件也可以通过此方法执行:

pytest 文件路径

6. 用例执行结果

结果缩写:

.测试通过
F测试失败
E出现错误
s跳过执行
x预期内失败
X预期外通过

结果的缩写是按照用例的执行顺序依次往后输出的

7. 配置

约定大于配置对于成熟的工具来说(如:pytest),默认配置是一种比较好的配置,如非必要,请勿修改

添加配置

1. 新建一个.ini结尾的文件

2. 加上如下内容

[pytest]

3. 查看所有的配置项:在终端中输入如下内容

pytest -h

4. 选择需要添加的配置项,将其按照对应的格式填写到.ini文件中

常用的命令行参数

额外的命令行选项 - addopts

v增加详细程度
q减少详细程度
s不进行内容捕捉,让所有的输出内容可以正常展示(成功的用例不会将里面的执行过程打印出来,可以通过-s来设置)
x快速退出(只要发现失败用例就立即停止运行)

一般情况下可以使用-vs,打印详细执行结果+用例输出内容打印

[pytest]
addopts = -vs

用户自定义标记 - mark

1. 注册标记

在.ini文件中添加mark,并添加标记

# 用户自定义标记
markers =
    name1
    name2
    name3

2. 打上标记

在函数上面添加标记,应该函数可以添加多个标记

class Test_A:
    @pytest.mark.name1
    def test_1(self):
        print('用例1')

    @pytest.mark.name1
    def test_2(self):
        print('用例2')

    @pytest.mark.name1
    @pytest.mark.name2
    def test_3(self):
        print('用例3')

    @pytest.mark.name2
    def test_4(self):
        print('用例4')

3. 筛选标记

通过筛选标记,筛选出需要执行的用例

在终端输入如下命令(可以结合前面的筛选文件):

pytest -m 标记名

也支持逻辑运算

pytest -m "标记1 and 标记2" # 执行包含标记1和标记2的用例
pytest -m "标记1 or 标记2"  # 执行包含标记1或标记2的用例

框架内置标记

特点:

1. 不需要注册,可以直接使用

2. 标记不仅仅用于筛选,还有特殊的效果

常用内置标记:

skip无条件跳过用例
skipif有条件跳过用例
sfail预期用例失败
parametrize参数化测试
class Test_A:
    def test_1(self):
        print('用例1')

    @pytest.mark.skip()
    def test_2(self):
        print('用例2')

    @pytest.mark.xfail(reason='预期失败')
    def test_3(self):
        print('用例3')
        assert 1 == 2

    @pytest.mark.skipif(1 == 2, reason='当1 == 2时用例跳过')
    def test_4(self):
        print('用例4')

参数化执行带参数的用例

1. 在用例中添加参数

2. 再用力中使用参数

3. 给用例添加parametrize注解

        3.1 添加第一个参数:参数名称(与用例参数名相同且对应)

        3.2 添加第二个参数:用例传入参数的数据(有几组数据就意味着这个用例要执行几次,只是参数不同)

        3.3 添加第三个参数(非必填):给每组参数添加用例名称

        如果名称带有中文可以在.ini配置文件中添加如下内容,否则会乱码

# 用例的id可以包含各类字符,并且自负风险
disable_test_id_escaping_and_forfeit_all_rights_to_community_support = true
def add(a, b):
    return a + b

@pytest.mark.parametrize(  # 3. 添加parametreze标记
    'a, b',  # 3.1 第一个参数为参数名称(要与用例参数对应)
    [
        (1, 1),  # 3.2 第二个参数添加用例的参数数据(有几组参数就相当于是几个用例,只是参数不一样)
        (2, 2),
        (3, 3)
    ],
    ids=[
        "1 + 1",  # 3.3 给每组参数添加用例名称(非必填,且使用中文需要添加相应的配置)
        "2 + 2",
        "3 加 3"
    ]
)
def test_add(a, b): # 1. 给用例添加参数
    print(f'执行add的结果为: {add(a, b)}') # 2. 再用例中使用参数

8. 夹具fixture

创建和使用夹具

夹具就是一个带有fixture标记的函数,然后将夹具作为参数传入用例的形参中即可。

如果夹具中正常去写,其所有内容会在用例执行之前执行

@pytest.fixture()
def fixture1(): # 夹具
    print('执行前置代码,用例执行前使用') # 夹具的内容



def test_1(fixture1): # 在用例中使用夹具
    print('执行用例内容')

如果想在前后都执行部分夹具的代码,也需要加上yield关键字

@pytest.fixture()
def fixture1():
    print('执行前置代码,用例执行前使用')
    
    # yield之前的代码会在用例执行前执行
    yield  
    # yield之后的代码会在用例执行后执行
    
    print('执行后置代码,用例执行后使用')



def test_1(fixture1):
    print('执行用例内容')

夹具的返回值

夹具可以带有返回值,并且其返回值可以在用例中使用

@pytest.fixture()
def fixture1():
    print('执行前置代码,用例执行前使用')

    # yield之前的代码会在用例执行前执行
    yield 5
    # yield之后的代码会在用例执行后执行

    print('执行后置代码,用例执行后使用')



def test_1(fixture1):
    print(f'输出夹具返回值:{fixture1}')

夹具的作用域

function每个用例直接不共享fixture的返回值(默认)
class每个类中的用例共享fixture的返回值
module每个文件中的用例共享fixture的返回值
package每个目录中的用例共享fixture的返回值
session全部用例共享fixture的返回值

下面以class和function作用域举例

注意:一个用例可以添加多个夹具,使用逗号分隔

@pytest.fixture(scope='class')
def fixture2():
    print('class作用域下,执行夹具前置代码')

    yield []  # 返回一个空列表,让用例之间传递数据

    print('class作用域下,执行夹具后置代码')


@pytest.fixture()
def fixture3():
    print('function作用域下,执行夹具前置代码')

    yield

    print('function作用域下,执行夹具后置代码')


# Test_A中的用例共享同一个 fixture2 夹具的返回值
class Test_A:
    def test_1(self, fixture2, fixture3):
        fixture2.append('A-test_1')
        print(fixture2)

    def test_2(self, fixture2, fixture3):
        fixture2.append('A-test_2')
        print(fixture2)

    def test_3(self, fixture2, fixture3):
        fixture2.append('A-test_3')
        print(fixture2)


# Test_B中的用例共享同一个 fixture2 夹具的返回值
class Test_B:
    def test_1(self, fixture2, fixture3):  # 一个用例可以添加多个夹具,用 逗号 分隔
        fixture2.append('B-test_1')
        print(fixture2)

    def test_2(self, fixture2, fixture3):
        fixture2.append('B-test_2')
        print(fixture2)

    def test_3(self, fixture2, fixture3):
        fixture2.append('B-test_3')
        print(fixture2)

在结果中可以看到function作用域的夹具对每个用例都执行了一次

class作用域的夹具对类在执行用例的前后执行了一次,并且夹具的返回值对类中的用例共享

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

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

相关文章

危险!这3本期刊陆续被三大数据库剔除!2024年EI期刊目录首次更新!

【SciencePub学术】2024年1月1日,爱思唯尔更新了EI Compendex收录期刊目录。 继上次EI期刊目录更新之后,本次1月更新共有3本期刊发生变动: 其中,有3本期刊停止收录(DISCONTINUED),连续出版/核心…

如何使用Docker部署WBO白板并实现公网地址远程访问

本文主要是如何使用Docker部署WBO白板并实现公网地址远程访问的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 🌄每日一句&am…

MySql语句中的ON DUPLICATE KEY UPDATE使用详解

目录 一:主键索引,唯一索引和普通索引的关系1. 主键索引2. 唯一索引:3. 普通索引:1:ON DUPLICATE KEY UPDATE功能介绍:2:ON DUPLICATE KEY UPDATE测试样例总结: 执行以下实验进行分析…

苹果m1、m2安装blender GIS,解决not Imageio 报错

blender-GIS 能够在地图上生成地形,如下图所示: 使用blenderGIS过程中会有 imageio 找不到的情况, 网上的 imageio 用在苹果电脑的M1、M2芯片上好像还是没有出图,似乎这个 imageio 这个已经是好几年前的代码,没能适配…

100天精通鸿蒙从入门到跳槽——第20天:ArkTS装饰器@Link双向数据绑定

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》 — Go语言学习之旅!《100天精通鸿蒙》 — 从Web/安卓到鸿蒙大师!100天…

C语言——O / 动态内存管理

一、为什么要有动态内存分配 我们已经掌握的内存开辟⽅式有: int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间 但是上述的开辟空间的⽅式有两个特点: • 空间开辟⼤⼩是固定的。 • 数组在申明的时候&am…

头戴式耳机推荐,适合学生党入手的平价头戴式耳机型号品牌推荐

市面上的头戴式耳机品牌繁多,价格各异,如何选择一款性价比高、适合自己的头戴式耳机呢?作为一个使用过不下十几款的头戴式耳机的大户,接下来我就根据我自己的经验为大家推荐一些平价好用的头戴式耳机,让学生党在预算有…

亚信安慧AntDB:AntDB-M元数据锁(六)

5.4.2 慢路径(slow path) 对于obtrusive锁,以及当前申请unobtrusive锁,而锁对象下已经持有obtrusive锁时,需要进入慢路径申请锁,即先对锁对象下的读写锁加写锁。在当前锁对象首次进入慢路径时,…

iOS 自动打包如何配置配置打包证书和profile provision文件

Jenkins 打包相关问题记录 打包失败截图: 1、证书找不到 NO certificate matching ‘ ‘ for ‘ ’ code singing is required …. D791BAD1-390A-4587-A35C-A743A3D88D52.png 由于更新过证书配置,导致新证书没有导入到Jenkins中。 配置步骤&#xf…

【AI视野·今日Robot 机器人论文速览 第七十六期】Fri, 12 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Fri, 12 Jan 2024 Totally 12 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers Topology-Driven Parallel Trajectory Optimization in Dynamic Environments Authors Oscar de Groot, Laura Ferranti, Dari…

Hadoop3.x基础(1)

来源:B站尚硅谷 这里写目录标题 大数据概论大数据概念大数据特点(4V)大数据应用场景 Hadoop概述Hadoop是什么Hadoop发展历史(了解)Hadoop三大发行版本(了解)Hadoop优势(4高)Hadoop组成&#xf…

MMCLMC公差计算.exe

一、概要 软件及完整代码请戳这里:MMC&LMC公差计算软件及代码 图1 软件操作界面 本软件功能主要是根据实际应用选择MMR或者LMR原则,输入基本尺寸、形位公差尺寸和实际测量尺寸,即可计算出对应的公差值。以孔的MMR为例见如图2、3&#xf…

SpringCloud-高级篇(十六)

前面学习了Lua的语法,就可以在nginx去做编程,去实现nginx类里面的业务,查询Redis,查询tomcat等 ,业务逻辑的编写依赖于其他组件,这些组件会用到OpenResty的工具去实现 (1)安装OpenRe…

不熟悉现货白银的震荡行情?你可以试着这样理解

在现货白银交易中,投资者很不想碰到震荡行情,因为震荡行情说明市场没有明确的趋势,而是倾向于横向波动,因此没有潜在风险较低且潜在盈利较大的顺势交易机会。可不幸的是,在市场中大部分时间市场还是会倾向横向震荡&…

WhatsApp首次营销模板怎么写?WhatsApp营销效果怎么样?

近年来,随着社交媒体的飞速发展,WhatsApp作为一种全球通用的即时通讯应用程序,在营销领域备受重视。很多企业开始利用WhatsApp这一平台与客户进行沟通和营销推广活动。本文将探讨WhatsApp首次营销模板如何编写以及其所带来的效果。 首先&…

MG7050VAN 基于声表的差分多输出 晶体振荡器(LVDS)

MG7050VAN的LVDS输出是一款差分多输出晶体振荡器,具有极低的抖动和超强的稳定性。该振荡器适用于多种应用场景,如服务器、存储器和网络仪器等。作为一款高端的LVDS输出设备,该振荡器在输出性能上具有明显优势。其超低抖动水平可以达到0.3ps M…

【机器学习】强化学习(七)-策略梯度算法-REINFORCE 训练月球着陆器代理(智能体)...

概 述 月球着陆器代理是一个模拟飞行器在月球表面着陆的环境,它有八个连续的状态变量,分别是水平坐标、垂直坐标、水平速度、垂直速度、角度、角速度、腿1触地、腿2触地。它有四个离散的动作,分别是什么都不做、发动左方向引擎、发动主引擎、…

情人节爆品出现!单周GMV暴涨6成,直冲20K美金,节庆用品赛道迎来“爆单潮”!

2024新年钟声已经敲响,一大波节日爆品正在疯狂涌现,而这只是一个开始。 开年首月电商流量一波接一波来袭,下一个“消费大节”已经在来的路上!——情人节。 节日营销热点抢量,宜早不宜晚。商家们纷纷开始上新节庆相关…

【详解】贪吃蛇游戏----下篇(完整源码)

目录 引入: 本片文章目的: 整个游戏的实现流程图如下: 游戏实现 GameRun PrintHelpInfo Pause NextIsFood printSnake EatFood NoFood KillByWall KillBySelf GameRun GameEnd 总代码: (1&#xff09…

【Linux】Linux权限的概念 -- 详解

一、Linux 中的用户 Linux 下有两种用户: 超级用户(root):可以在 Linux 系统下做任何事情,不受限制。普通用户:在 Linux 下做有限的事情。 超级用户的命令提示符是 “#”,普通用户的命令提示符…