Python+Pytest+Yaml+Allure数据参数化(DDT)数据驱动(一)

server/2024/11/30 14:55:51/

 我们在做数据之前要知道几个问题

1、在代码层面怎么来数据驱动

2、yaml文件是什么

3、怎么用yaml文件实现对应的数据驱动

我们用的是pytest框架所以相对来说是简单的,我们通过pytest框架来实现,而框架中要数据驱动用到我们装饰器就好啦@pytest.mark.parametrize(参数名,参数数据) 

那参数化就是DDT :把对应的数据提取出来 进行统一维护

参数1:参数的名字

参数2:  参数的数据列表

那我们的参数数据要什么数据格式?我们知道有字典 元祖 字符串....

我们要对应的数据话肯定是多组数据

[数据1,数据2,数据3]   列表

(数据1,数据2,数据3)元祖

[{k:v},{k:v},{k:v}]列表套字典------推荐,用的比较多

[[1],[2],[3]]列表套列表 

[(1),(2),(3)]列表套元祖 

 好 那我们现在简单写一个小demo

python">import pytest
# data 是我们的数据
data = ['小王','小张','小李']
# 通过用这个装饰器(data传入的参数列表需要有一个参数名来接收name)
@pytest.mark.parametrize('name',data)
# 给到name以后 需要给到test_01参数 去接受这个值
def test_01(name):print('当前运行的用户名是:',name)if __name__ == "__main__":pytest.main(['-vs'])

运行结果

我们中间的数据项有多少个,他就会执行多少次

我们的data中有三个 就执行三次

那如果列表套列表我们要怎么写呢--通过下标获取

python">import pytest
# data 是我们的数据
data = [['小王',22],['小张',23],['小李',24]]
# 通过用这个装饰器(data传入的参数列表需要有一个参数名来接收name)
@pytest.mark.parametrize('name',data)
# 给到name以后 需要给到test_01参数 去接受这个值
def test_01(name):print('当前运行的用户名是:',name[0])print('当前运行的用户年龄是:', name[1])if __name__ == "__main__":pytest.main(['-vs'])

运行结果

好 我们学会可以后在项目中怎么应用呢?

我们对应的登陆中是不是有对应的账户名密码等等一些参数

那我们可以在登陆写一下测试用例

登陆成功 密码错误 用户名错误 等等。。。

那我们来写一下

先导包

python">@pytest.mark.parametrize()

首先我们的格式是列表套字典

python">data = [{'username': 'aaa', 'password': '1245346', 'res': '登录成功'},{'username': 'aaa', 'password': '1234ddd56', 'res': '密码错误'},{'username': 'djjdjd', 'password': '15634432', 'res': '用户名不存在'}
]

 然后把data和我们的参数传入装饰器中

python">@pytest.mark.parametrize('case_info',data)

再把我的case_info传入方法中

python">def test_01_login(case_info):

接下来我们data中和断言中也需要相应改动---引用上面的数据

python"> data = {'accounts': case_info['username'],'pwd':  case_info['password'], 'type': 'username'}
python">assert mag_ret == case_info['res'], f'错误,我们当前返回的值是:{mag_ret}'

写好啦 我们接下来运行看看

第一个用例通过 这是正向测试 期望和实际一样

第二个也是 我们改了密码 期望是密码错误 实际返回的也是密码错误

第三个 账号密码都不对 期望返回的是用户名不存在但是实际返回的是登陆账号不存在

我们看懂了DDT了以后只需要维护我们的测试用例,如需要测试 直接引用就好啦 是不是很方便

但是目前我们只是把测试数据提取出来

那不同的接口可不可以把接口全部提取出来呢?---可以

因为我们发送请求无非是四要素不一样 你需要提取什么就提取什么

那我们这些都提取出来,我们可以通过yaml文件来进行操作,或者说我们需要有一个存放数据的地方excel 、yaml 也可以数据库这些都是可以的。

以上我们知道了 我们的数据驱动是通过装饰器来实现

那我们接下来说yaml是什么


http://www.ppmy.cn/server/146177.html

相关文章

开源项目:纯Python构建的中后台管理系统

来源:Python大数据分析 费弗里 大家好我是费老师,目前市面上有很多开源的「中后台管理系统」解决方案,复杂如「若依」那种前端基于Vue,后端基于Java的框架,虽然其提供了较为完善的一整套前后端分离权限管理系统解决方…

C++软件设计模式之组合模式与其他模式的协作举例

组合模式(Composite Pattern)、装饰器模式(Decorator Pattern)、享元模式(Flyweight Pattern)、迭代器模式(Iterator Pattern)和访问者模式(Visitor Pattern)…

Spark 内存管理机制

Spark 内存管理 堆内内存和堆外内存 作为一个 JVM 进程,Executor 的内存管理建立在 JVM(最小为六十四分之一,最大为四分之一)的内存管理之上,此外spark还引入了堆外内存(不在JVM中的内存),在spark中是指不…

23种设计模式-工厂方法(Factory Method)设计模式

文章目录 一.什么是工厂方法设计模式?二. 工厂方法模式的特点三.工厂方法模式的结构四.工厂方法模式的优缺点五.工厂方法模式的 C 实现六.工厂方法模式的 Java 实现七.代码解析八.总结 类图: 工厂方法设计模式类图 一.什么是工厂方法设计模式&#xff1…

Matlab数字信号处理——音频信号处理与分析GUI

1.实现内容 实现功能有回响、变声、倒放、变速、音量调整、加噪、设计 FIR和 IR 滤波器实现去噪功能(高通低通带通带阻),并且在时域波形图和频域波形展示变化。滤波器包括各种参数的选择、滤波器结构和类型的选择等。同时GUI上还包含打开、播放、保存、退出功能。 …

详细介绍HTTP与RPC:为什么有了HTTP,还需要RPC?

目录 一、HTTP 二、RPC 介绍 工作原理 核心功能 如何服务寻址 如何进行序列化和反序列化 如何网络传输 基于 TCP 协议的 RPC 调用 基于 HTTP 协议的 RPC 调用 实现方式 优点和缺点 使用场景 常见框架 示例 三、问题 问题一:是先有HTTP还是先有RPC&…

外卖点餐系统小程序

目录 开发前准备 项目展示项目分析项目初始化封装网络请求 任务1 商家首页 任务分析焦点图切换中间区域单击跳转到菜单列表底部商品展示 任务2 菜单列表 任务分析折扣信息区设计菜单列表布局请求数据实现菜单栏联动单品列表功能 任务3 购物车 任务分析设计底部购物车区域添加商…

ElasticSearch7.x入门教程之全文搜索(六)

文章目录 前言一、短语匹配:match_phrase query二、短语前缀匹配:~~match_phrase_prefix~~ query三、多字段查询:multi_match query四、Lucene中的简单查询五、存在查询:exists query六、前缀查询:~~prefix~~ query七、…