Python 如何实现数据驱动的接口自动化测试

🍅 视频学习:文末有免费的配套视频可观看

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快

大家在接口测试的过程中,很多时候会用到对CSV的读取操作,本文主要说明Python3对CSV的写入和读取。下面话不多说了,来一起看看详细的介绍吧。

一、需求

某API,GET方法,token,mobile,email三个参数

  • token为必填项
  • mobile,email 必填其中1项
  • mobile为手机号,email为email格式

二、方案

针对上面的API,在做接口测试时,需要的测试用例动辄会多达10+, 这个时候采用数据驱动的方式将共性的内容写入配置文件或许会更合适。

这里考虑把API、参数、以及预期结果预行在格式化的CSV里保存,利用csv组件从CSV里读取URL、参数以及预期结果,Requests组件发起请求,将响应结果与预期结果进行比对,最后把比对结果写到结果CSV。

流程如下图 

三、实现

1、在上代码之前,先安装好如下几个组件:

  • csv  读写CSV文件
  • json
  • requests  发起请求,获取响应结果
  • unittest    测试用例调度

2、data.csv(本示例选取部分用例)

3、reader_CSV函数代码示例

import csv
 
import json
 
import requests
 
import time
 
import unittest
 
def readCSV(self,filename):
 
 '''
 :param filename: 需要读取的数据文件
 :return: [{data1},{data2}...]
 '''
 
 datas = []
 
 try:
 
 #以DictReader的方式读取数据文件,方便与json互做转换
 
 with open(filename,'r') as csvfile :
 
 #从文件里读取到的数据转换成字典列表的格式
 
 reader = csv.DictReader(csvfile)
 
 for row in reader:
 
 data = {}
 
 data['id'] = row['id']
 
 data['url'] = row['url']
 
 data['token'] = str(row['token'])
 
 data['mobile'] = row['mobile']
 
 data['email'] = row['email']
 
 data['expect'] = json.dumps(row['expect']) \
 
 if isinstance(row['expect'],dict) \
 
 else row['expect'] #如果expect读取出来的不是json则取其原值,否则转为json格式保存到result里
 
 datas.append(data)
 
 return datas
 
 #如果文件找不到,返回空的datas
 
 except FileNotFoundError:
 
 print("文件不存在",filename)
 
 return datas

4、request_URL函数示例(包含GET请求和POST请求2个方法)

def get_request(self,url,params):
 
 '''
 通用的调用GET接口方法
 :param url:string 接口路径
 :param params:{"":"","":""} 需要传入的参数
 :return: response响应体
 '''
 
 print("调用API...")
 
 r = requests.get(url,params=params)
 
 print(r.text)
 
 return r
 
def post_request(self,url,params):
 
 '''
 通用的调用POST接口方法
 :param url: string 接口路径
 :param params: {"":"","":""} 需要传入的参数
 :return:response响应体
 '''
 
 print("调用API...")
 
 r = requests.post(url,params=json.dumps(params)) #post的方法必须用json.dumps()转化成json格式
 
 print(r.text)
 
 return r

5、assert_Result函数示例

def assertResult(self,except_value,real_value):
 
 '''
 校验样本字符串中是否包含指定字符串
 :param except_value: string 指定字符串
 :param real_value: string 样本字符串
 :return: Boolean 样本中包含指定字符串返回True,否则返回False
 '''
 
 ifsuccess = except_value in str(real_value)
 
 return ifsuccess

6、write_CSV函数示例

def writeCSV(self,filename,results):
 
 '''
 写入csv文件指定内容
 :param filename: string 需要写入的文件名称
 :param results: [{data1},{data2},...] 写入的内容
 :return: 无
 '''
 
 print("写文件:",filename)
 
 #以DictWriter的方式写文件
 
 with open(filename,'w+') as csvfile:
 
 headers="id,url,token,mobile,email,expect,real_value,assert_value".split(",")
 
 writer = csv.DictWriter(csvfile,fieldnames=headers)
 
 #写表头
 
 writer.writeheader()
 
 #写数据
 
 if results.__len__() > 0 :
 
 for result in results:
 
 writer.writerow(result)
 
 csvfile.close()

7、test_interface1函数示例

def test_interface1(self):
 
 #指定读取的数据文件名称
 
 data_file = "../data/data.csv"
 
 #指定最终结果生成的数据文件名称
 
 result_file = "../data/result_{}.csv".format(str(time.time()).split(".")[0])
 
 #读取指定文件的数据
 
 datas = self.readCSV(data_file)
 
 #数据文件有内容则调用接口,否则直接测试结束
 
 if datas.__len__() > 0:
 
 results =[]
 
 #获取数据文件里的每一行
 
 for testcase in datas :
 
 result = {}
 
 result["id"] = testcase["id"]
 
 result["url"] = testcase["url"]
 
 result["token"] = testcase["token"]
 
 result["mobile"] = testcase["mobile"]
 
 result["email"] = testcase["email"]
 
 result["expect"] = testcase["expect"]
 
 #组装参数
 
 params = {
 
 "token":result["token"],
 
 "mobile":result["mobile"],
 
 "email":result["email"]
 
 }
 
 #调用API接口,获取响应结果
 
 real_value = self.get_request(result["url"],params)
 
 #调用assert方法,检查预期结果是否在响应结果中存在
 
 assert_value = self.assertResult(result["expect"],real_value.text)
 
 result["real_value"] = real_value.text
 
 result["assert_value"] = assert_value
 
 #获取每一行里的所有字段以及实际结果和验证结果
 
 results.append(result)
 
 #执行完所有记录后,将所有结果写入result.csv
 
 self.writeCSV(result_file,results) #写入csv文件
 
 print("测试结束")
 
 

8、result_1523956055.csv(本示例中的测试结果请忽略)

四、总结

python封装了很多方法,对于测试来说开发速度相对较快,接口自动化测试如果采用CSV管理的数据驱动方式,使用csv+requests是测试开发不容错过的利器之一。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

同时,在这我为大家准备了一份软件测试视频教程(含面试、接口、自动化、性能测试等),就在下方,需要的可以直接去观看。

【2024最新版】Python自动化测试15天从入门到精通,10个项目实战,允许白嫖。。。

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

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

相关文章

【Java]认识泛型

包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。 除了 Integer 和 Character, 其余基本类型的包装类都是首字母大写。 泛型 泛型是在JDK1.5引入的…

spring boot 3.x版本中集成spring security 6.x版本进行实现动态权限控制解决方案

一、背景 最近在进行项目从jdk8和spring boot 2.7.x版本技术架构向jdk17和spring boot 3.3.x版本的代码迁移,在迁移过程中,发现spring boot 3.3.x版本依赖的spring security版本已经升级6.x版本了,语法上和spring security 5.x版本有很多地方…

AntV X6 图编辑引擎速通

前言:参考 [AntV X6 官网](https://x6.antv.antgroup.com/) 一、简介 X6 可以快速搭建 DAG 图、ER 图、流程图、血缘图等应用。 二、快速上手 1. 安装 npm install antv/x6 --save# oryarn add antv/x6# orpnpm add antv/x6 2. 使用 2.1 初始画布 在页面中创…

【Linux进阶】文件系统3——目录树,挂载

前言 在Windows 系统重新安装之前,你可能会事先考虑,到底系统盘C盘要有多大容量?而数据盘D盘又要给多大容量等,然后实际安装的时候,你会发现其实C盘之前会有个100MB的分区被独立出来,所以实际上你就会有三个…

Java进阶----继承

继承 一.继承概述 继承是可以通过定义新的类,在已有类的基础上扩展属性和功能的一种技术. 案例:优化 猫、狗JavaBean类的设计 狗类:Dog 属性:名字 name,年龄 age 方法:看家 watchHome(),Gett…

QT5.12.9 通过MinGW64 / MinGW32 cmake编译Opencv4.5.1

一、安装前准备: 1.安装QT,QT5.12.9官方下载链接:https://download.qt.io/archive/qt/5.12/5.12.9/ QT安装教程:https://blog.csdn.net/Mark_md/article/details/108614209 如果电脑是64位就编译器选择MinGW64,32位就选择MinGW…

C#描述-计算机视觉OpenCV(5):直方图算法

C#描述-计算机视觉OpenCV(5):直方图算法 前文链接图像直方图灰度直方图的计算灰度直方图的绘制BGR三通道的直方图直方图的均衡化算法相似图像检测 前文链接 文中没提到的东西,很可能都在前文描述过 C#描述-计算机视觉OpenCV&…

【C++深度探索】继承机制详解(二)

hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页:大耳朵土土垚的博客 &#x1…

深入解析:抖音视频标题的Python爬虫提取方法

引言 随着短视频的兴起,抖音已经成为全球最受欢迎的社交媒体平台之一。对于数据分析师、市场研究人员以及内容创作者来说,能够从抖音上抓取数据是一项宝贵的技能。本文将深入解析如何使用Python编写爬虫程序来提取抖音视频的标题。 爬虫基础 在开始编…

K8S 上部署大数据相关组件

文章目录 一、前言二、Redis 一、前言 Artifact Hub 是一个专注于云原生应用的集中式搜索和发布平台。它旨在简化开发者在 CNCF(Cloud Native Computing Foundation)项目中寻找、安装和分享包与配置的过程。用户可以通过这个平台方便地发现、安装各类云原…

为什么需要重写equals和如何重写equals

首先先看Java中的 ,比较的两个对象的地址值。 如果是基本数据类型,那么就是比较的是值。 如果是引用数据类型,比较的就是地址. object类中的equals方法也是用的; 所以要比较两个对象的大小,去调用默认的equals方法…

Apache Spark分布式计算框架架构介绍

目录 一、概述 二、Apache Spark架构组件栈 2.1 概述 2.2 架构图 2.3 架构分层组件说明 2.3.1 支持数据源 2.3.2 调度运行模式 2.3.3 Spark Core核心 2.3.3.1 基础设施 2.3.3.2 存储系统 2.3.3.3 调度系统 2.3.3.4 计算引擎 2.3.4 生态组件 2.3.4.1 Spark SQL 2.…

关系型数据库MySQL和时序数据库的区别?

时序数据库和关系型数据库是两种不同类型的数据库系统,它们在设计理念、存储结构、性能优化等方面有显著差异,以适应不同的应用场景和需求。具体对比如下: 数据存储结构 时序数据库:使用列式存储,每条记录通常包含时间…

MySQL资源组的使用方法

MySQL支持创建和管理资源组,并允许将服务器内运行的线程分配给特定的组,以便线程根据组可用的资源执行。组属性允许控制其资源,以启用或限制组中线程的资源消耗。DBA可以针对不同的工作负载适当地修改这些属性。 目前,CPU时间是一…

田地行走-美团2023笔试(codefun2000)

题目链接 田地行走-美团2023笔试(codefun2000) 题目内容 塔子哥是一个农民,他有一片 nm 大小的田地,共 n 行 m 列,其中行和列都用从 1 开始的整数编号,田地中有 k 个格子中埋有土豆。我们记第 a 行第 b 列的格子为 (a,b) 。塔子哥…

LM2596/LM2596S多路降压稳压DC-DC开关电源芯片详解(第二部分:电路设计)(12V转5V、12V转3.3V、任意电压转任意电压)

目录 一、固定电压(3.3/5/12V)模块设计实例 1.设计条件:VOUT5V,VIN(MAX)12V,ILOAD(MAX)3A 2.设计步骤: (1)电感的选择(L1) (2)输…

C++入门基础

前言 本篇博客讲解一下c得入门基础 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:C_普通young man的博客-CSDN博客 ⏩ 本人giee:普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见📝 🎉欢迎大家点赞&…

掌握计算机网络基础:从零开始的指南

计算机网络是现代信息社会的重要基石。本文将以简洁明了的方式为基础小白介绍计算机网络的基本概念、分类、以及其在信息时代中的重要作用。 计算机网络在信息时代中的作用 21世纪是以数字化、网络化、信息化为重要特征的信息时代。 计算机网络作为信息的最大载体和传输媒介&…

微信自动加好友工具

批量导入数据到后台,可设置添加速度、间隔时间、验证信息和自动备注等,任务执行时间,后台会自动执行操作。

ubuntu 分区情况

ubuntu系统安装与分区指南 - Philbert - 博客园 (cnblogs.com)https://www.cnblogs.com/liangxuran/p/14872811.html 详解安装Ubuntu Linux系统时硬盘分区最合理的方法-腾讯云开发者社区-腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/1711884