据说这是最细滴,Python接口自动化测试数据驱动DDT使用实战,有这一篇就完全足够了

前言

环境准备
首先,需要安装ddt模块

pip install ddt

调用时标准格式
在类下面如下写上:@ddt.ddt
在调用的方法下面需要写上:@ddt.data(需要传入的多组数据)

DDT简单介绍
名称: Data-Driven Tests,数据驱动测试。
作用: 由外部数据集合来驱动测试用例的执行。
核心的思想:数据和测试代码分离。
应用场景: 一组外部数据来执行相同的操作。
优点: 当测试数据发生大量变化的情况下,测试代码可以保持不变。
实际项目: excel存储测试数据,ddt读取测试数据到单元测试框架(测试用例中),输出到html报告。

一、数据驱动

就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。说的直白些,就是参数化的应用。

实现方式
老的实现方式中,对测试结果的解析和校验都是在各个 case 中做的, case 层的处理的逻辑较为混杂,可读性不强

新的实现方式中,case 层只需要调用下结果校验的方法,逻辑清晰

工具
数据驱动在自动化中起到了一个很重要的作用。它实现了一条case,多次执行。很多的接口测试工具,也都把数据驱动利用的淋漓尽致。就拿我们最熟悉的jmeter来说。它的数据驱动是依靠CSV文件(一种通用文本格式。常用于数据之间的转换。

一行就是一条数据,数据中多个值用“,”分割。)设置的,通过编写CSV表格,然后设置好对应的参数。在接口中调用这些参数所属的变量。即可实现数据驱动。

二、传递基础数据类型

  # 导入ddt库下所有内容
  from ddt import *
  # 在测试类前必须首先声明使用 ddt
  @ddt
  class imoocTest(unittest.TestCase):
	  # int
	  @data(1, 2, 3, 4)
	  def test_int(self, i):
		  print("test_int:", i)
	  # str
	  @data("1", "2", "3")
	  def test_str(self, str):
		  print("test_str:", str)

测试结果

test_int: 1
test_int: 2
test_int: 3
test_int: 4
test_str: 1
test_str: 2
test_str: 3

包含知识点
想使用DDT首先要在单元测试类上面加上 @ddt

三、传递一个复杂的数据结构

from ddt import *
# 在测试类前必须首先声明使用 ddt
@ddt
class imoocTest(unittest.TestCase):
  tuples = ((1, 2, 3), (1, 2, 3))
  lists = [[1, 2, 3], [1, 2, 3]]
  # 元组
  @data((1, 2, 3), (1, 2, 3))
  def test_tuple(self, n):
	  print("test_tuple", n)
  # 列表
  @data([1, 2, 3], [1, 2, 3])
  @unpack
  def test_list(self, n1, n2, n3):
	  print("test_list", n1, n2, n3)
  # 元组2
  @data(*tuples)
  def test_tuples(self, n):
	  print("test_tuples", n)
  # 列表2
  @data(*lists)
  @unpack
  def test_lists(self, n1, n2, n3):
	  print("test_lists", n1, n2, n3)
  # 字典
  @data({'value1': 1, 'value2': 2}, {'value1': 1, 'value2': 2})
  @unpack
  def test_dict(self, value1, value2):
	  print("test_dict", value1, value2)

测试结果

test_dict 1 2
test_dict 1 2
test_list 1 2 3
test_list 1 2 3
test_lists 1 2 3
test_lists 1 2 3
test_tuple (1, 2, 3)
test_tuple (1, 2, 3)
test_tuples (1, 2, 3)
test_tuples (1, 2, 3)

包含知识点
@unpack :当传递的是复杂的数据结构时使用。比如使用元组或者列表,添加 @unpack 之后, ddt 会自动把元组或者列表对应到多个参数上。字典也可以这样处理。

当没有加unpack时,test_case方法的参数只能填一个;如元组的例子。

当你加了unpack时,传递的数据量需要一致;如列表例子中,每个列表我都固定传了三个数据,当你多传或少传时会报错,而test_case方法的参数也要写三个,需要匹配上。

当传的数据是字典类型时,要注意每个字典的key都要一致,test_case的参数的命名也要一致;如字典的例子,两个字典的key都是value1和value2,而方法的参数也是。

当传的数据是通过变量的方式,如元组2、列表2,变量前需要加上*。

四、传递json文件

json文件

{
"first": [
  {
	"isRememberMe": "True",
	"password": "111111",
	"username": "root"
  },
  "200"
],
"second": [
  "{'isRememberMe': True, 'password': '1111111', 'username': 'root'}",
  "406"
],
"third": [
  1,
  2
],
"four": "123123"
}

单元测试类

from ddt import *
# 在测试类前必须首先声明使用 ddt
@ddt
class imoocTest(unittest.TestCase):
  @file_data('F:/test/config/testddt.json')
  def test_json(self, data):
	  print(data)

测试结果

[{'isRememberMe': 'True', 'password': '111111', 'username': 'root'}, '200']
["{'isRememberMe': True, 'password': '1111111', 'username': 'root'}", '406']
[1, 2]
123123

五、传递Yaml文件

yaml文件

  unsorted_list:
    - 10
    - 15
    - 12
  sorted_list: [ 15, 12, 50 ]

单元测试类

from ddt import *
# 在测试类前必须首先声明使用 ddt
@ddt
class imoocTest(unittest.TestCase):
  @file_data('F:/test/config/testddt.yaml')
  def test4(self, data):
	  print("yaml", data)

测试结果

yaml [10, 15, 12]
yaml [15, 12, 50]

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

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

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

相关文章

深入理解Servlet

目录: ServletWeb开发历史Servlet简介Servlet技术特点Servlet在应用程序中的位置Tomcat运行过程Servlet继承结构Servlet生命周期Servlet处理请求的原理Servlet的作用HttpServletRequest对象HttpServletResponse对象ServletContext对象ServletConfig对象Cookie对象与…

Keepalived实验

一、 LVSKeepalived 实验:7-1为主; 7-2为备; 7-3和7-4为后端服务器 1.关闭防火墙和selinux [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 02.配置主设备7-1 1.安装ipvsadm和keepalived [rootlocalhost ~]#…

阿珊解说Vue中`$route`和`$router`的区别

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

可视化图表:柱坐标系与对应图表详解

一、柱坐标系及其构成 柱状坐标系是一种常见的可视化图表坐标系,用于显示柱状图(也称为条形图)的数据。它由两个相互垂直的轴组成,一个是水平轴(X轴),另一个是垂直轴(Y轴&#xff0…

评测本地部署的语音识别模型

1 引言 最近,朋友给我发来了一段音频,想转录成文字,并使用大型润色文本。音频中的普通话带有一定的口音,并且讲解内容较为专业,所以一般的语音识别工具很难达到较高的识别率。 于是试用了两个大模型。Whisper 是目前…

AIOps常见问题

AIOps的自动化通常指什么? AIOps 平台的自动化一般包括以下几个方面: 数据收集和整合:AIOps 平台可以从多个 IT 基础架构组件、应用需求与性能监视工具以及服务工单系统等数据源中收集并整合运维数据,形成一个全面的数据平台。数…

Access AR Foundation 5.1 in Unity 2022

如果已经下载安装了ARF但版本是5.0.7 可以通过下面的方式修改 修改后面的数字会自动更新 更新完成后查看版本 官方文档 Access AR Foundation 5.1 in Unity 2021 | AR Foundation | 5.1.2

YOLOv9中train.py与train_dual.py的异同!

专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,主力高效涨点!!! 首先,train.py(左)与train_dual.py(右)中的损失函数是不一样的,这也解释了为什么使用train.py除了填入…

Visual Studio 2022之Release版本程序发送到其它计算机运行

目录 1、缺少dll​ 2、应用程序无法正常启动 3、This application failed to start because no Qt platform plugin could be initialized. 代码在Debug模式下正常运行,然后切换到Release模式下,也正常运行,把第三方平台的dll拷贝到exe所在…

Chrome浏览器好用的几个扩展程序

Chrome好用的扩展程序 背景目的介绍JsonHandle例子未完待续。。。。。。 背景 偶然在往上看到Chrome有很多好用的扩展程序,比较好用,因此记录下比较实用的扩展程序。 目的 记录Chrome浏览器好用的插件。 介绍 JsonHandle下载以及无法扩展插件的解决…

Vue3_2024_6天【回顾上篇watch常见的前三种场景】另两种待补

第一种情况:监视【ref】定义(基本数据类型) 1.引入watch2.格式:watch(基本数据类型数据,监视变化的回调函数) 注意点: 2.1.watch里面第一个参数,是数据~~【监视的基本类…

基于深度学习的三维重建MVSNet系列

2019年4月15日下午6时50分左右,一场大火席卷了法国巴黎圣母院,持续长达14小时。幸而巴黎圣母院有着高分辨率的3D模型,研究人员可以了解圣母院本身的建造结构,以便修复工程的开展。 多视图立体几何(Multi-View Stereo&a…

unity-urp:视野雾

问题背景 恐怖游戏在黑夜或者某些场景下,需要用雾或者黑暗遮盖视野,搭建游戏氛围 效果 场景中,雾会遮挡场景和怪物,但是在玩家视野内雾会消散,距离玩家越近雾越薄。 当前是第三人称视角,但是可以轻松的…

Linux:kubernetes(k8s)探针LivenessProbe的使用(9)

他做的事情就是当我检测的一个东西他不在规定的时间内存在的话,我就让他重启,这个检测的目标可以是文件或者端口等 我这个是在上一章的基础之上继续操作,我会保留startupProbe探针让后看一下他俩的执行优先的一个效果 Linux:kuber…

【QT】QDialog/ QMessageBox/提示对话框/颜色(文字)------对话框

QDialog—对话框 什么是对话框,如下样式 非模态对话框,即打开以后,我还可以对其他框进行操作。 模态对话框,打开以后,其他框都不能再操作了 模态对话框是阻塞对话框 QDialog dig(this);//显示模态对话框dig.exec();…

ROS2中nav_msgs/msg/Path 数据含义及使用

目录 ROS2中nav_msgs/msg/Path数据含义及使用ROS官方消息说明使用ros2中Path生成路径并显示案例使用ROS2命令创建功能包修改创建功能包中的CMakeLists.txt如下创建发布话题的main函数编译与运行rviz可视化发布的路径 ROS2中nav_msgs/msg/Path数据含义及使用 ROS2官方关于nav_m…

vue面试--9, 1 ObjectProperty与vue3Proxy区别。2 MVVM的理解 3 双向绑定原理?

1 ObjectProperty与vue3Proxy区别 2 MVVM的理解 3 双向绑定原理?

Spring源码:手写AOP

文章目录 一、概念1、AOP是什么?2、相关概念1)目标对象Target2)通知Advice3)连接点Joinpoint4)切点Pointcut5)切面Aspect6)织入Weaving 二、分析三、实现1、实现Advice1)前置通知2&a…

Jmeter高效组织接口自动化用例

1、善用“逻辑控制器”中的“简单控制器”。可以把简单控制器像文件夹一样使用,通过它来对用例进行分类归档,方便后续用例的调试和执行。 2、同编写测试用例一样,这里的接口测试用例应该进行唯一性编号,这样在运行整个用例计划出现…

wince+gprs拨号上网总结

一、硬件连接 本次调试的GPRS模块引脚定义 三星主板全功能扩展串口2引脚定义 因GPRS模块可以和pc机直连进行数据通讯,那么收发肯定内部交叉,故主板和GPRS的连接也采用直连方式。如果接线不对则出现没有回应现象,拨号时出现端口不可用&#xf…
最新文章