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

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

1、需求

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

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

2、方案

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

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

流程如下图 

3、实现

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

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

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

3、reader_CSV函数代码示例

import csvimport jsonimport requestsimport timeimport unittestdef 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#如果文件找不到,返回空的datasexcept 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 rdef 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.textresult["assert_value"] = assert_value#获取每一行里的所有字段以及实际结果和验证结果results.append(result)#执行完所有记录后,将所有结果写入result.csvself.writeCSV(result_file,results) #写入csv文件print("测试结束")

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

总结

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

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


              【下面是我整理的2023年最全的软件测试工程师学习知识架构体系图】


一、Python编程入门到精通

二、接口自动化项目实战 

三、Web自动化项目实战


四、App自动化项目实战 

五、一线大厂简历


六、测试开发DevOps体系 

七、常用自动化测试工具

八、JMeter性能测试 

九、总结(尾部小惊喜)

生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!

生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!

只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到! 

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

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

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

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

相关文章

探索人工智能领域——每日20个名词详解【day13】

目录 前言 正文 总结 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Filotimo__✍️原创,首发于CSDN📚。 📣如需转载,请事先与我联系以…

Axure网页端高交互组件库, 下拉菜单文件上传穿梭框日期城市选择器

作品说明 组件数量:共 11 套 兼容软件:Axure RP 9/10,不支持低版本 应用领域:web端原型设计、桌面端原型设计 作品特色 本作品为「web端组件库」,高保真高交互 (带仿真功能效果);运用了动态面板、中继…

UniGui使用CSSUniTreeMenu滚动条

有些人反应UniTreeMenu当菜单项目比较多的时候会超出但是没有出滚动条,只需要添加如下CSS 老规矩,unitreemeu的layout的componentcls里添加bbtreemenu,然后在css里添加 .bbtreemenu .x-box-item{ overflow-y: auto; } 然后当内容超出后就会…

【数据结构第 6 章 ②】- 用 C 语言实现邻接矩阵

目录 一、邻接矩阵表示法 二、AMGraph.h 三、AMGraph.c 四、Test.c 【数据结构第 6 章 ① 】- 图的定义和基本术语-CSDN博客 由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位置来表示元素之间的关系&…

SpringCloud网关介绍

一、Gateway简介 1、官网 上一代zuul 1.X:https://github.com/Netflix/zuul/wiki 当前gateway:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/ 2、是什么 SpringCloud Gateway是SpringCloud的一个全…

.NET Core 依赖注入 Microsoft.Extensions.DependencyInjection

文章目录 前言什么是依赖注入C# 使用依赖注入框架介绍 Microsoft.Extensions.DependencyInjectionNuget安装简单单例使用打印结果 自动装配举例自动装配测试用例打印结果自动装配执行顺序测试用例有歧义构造函数渐进式构造函数循环依赖 自动装配结论 手动装配手动注入别名注入 …

调用win32 api获取电脑名字和系统目录

学习一下几个函数的功能,和调用方式; void CBasenameView::OnDraw(CDC* pDC) {CBasenameDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString str1;TCHAR myname1[50], myname2[50], mydirname1[50], myd…

常见的Linux系统版本

在介绍常见的Linux系统版本之前,首先需要区分Linux系统内核与Linux发行套件系统的不同。Linux系统内核指的是一个由Linus Torvalds负责维护,提供硬件抽象层、硬盘及文件系统控制及多任务功能的系统核心程序。而Linux发行套件系统是我们常说的Linux操作系…

【Vue+Python】—— 基于Vue与Python的图书管理系统

文章目录 🍖 前言🎶一、项目描述✨二、项目展示🏆三、撒花 🍖 前言 【VuePython】—— 基于Vue与Python的图书管理系统 🎶一、项目描述 描述: 本项目为《基于Vue与Python的图书管理系统》,项目…

Minio保姆级教程

转载自:www.javaman.cn Minio服务器搭建和整合 1、centos安装minio 1.1、创建安装目录 mkdir -p /home/minio1.2、在线下载minio #进入目录 cd /home/minio #下载 wget https://dl.minio.io/server/minio/release/linux-amd64/minio1.3、minio配置 1.3.1、添加…

Flutter笔记:滑块及其实现分析1

Flutter笔记 滑块分析1 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/134900784 本文从设计角度&#…

SQL命令---删除字段

介绍 使用sql语句删除表字段。 命令 alter table 表名 drop 字段名;例子 删除a表中的name字段。 alter table a drop name;下面是执行删除后的表结构:

微服务实战系列之通信

前言 掰个指头数一数,博主的“微服务实战系列”从无到有,从零走到了十五。如果比作时钟,刚好走过了一刻度。 当初为什么要做这个系列,博主想了又想,私以为作为当下软件领域的几个“hot spot”之一,又乘着…

探秘机器学习核心逻辑:梯度下降的迭代过程 (图文详解)

一 需求解函数 f() 和 g()函数分别为求y值和求导数的函数。 目的:求该函数的最小值: 代码: import numpy as np import matplotlib.pyplot as plt f lambda x : (x - 3.5) ** 2 - 4.5 * x 10 g lambda x : 2 * (x - 3.5) - 4.5x np.l…

架构LAMP

目录 1.什么是LAMP 2.LAMP组成及作用 3.搭建Apache httpd服务 4.编译安装mysqld 服务 5.编译安装PHP 解析环境 6.安装论坛 1.什么是LAMP LAMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件,能够提供动态Web站点服务…

【Python】视频剪辑小程序

近期遇到一些录制的视频需要剪辑。 手机上剪辑操作很耗时,有几个G的视频,花了一天的空余时间去剪辑。电脑上也有格式工厂,有很方便。 可是学了Pthon,又无意中了解到了moviepy这个库,于是自己写了个简单的视频剪辑程序。…

Windows安装kafka

压缩包下载地址:https://www.apache.org/dyn/closer.cgi?path/kafka/3.6.1/kafka_2.13-3.6.1.tgz 启动kafka步骤 zookeeper-server-start.bat rem 闭命令提示符窗口的命令回显,这样在运行脚本时不会显示脚本的具体命令内容 echo offrem 命令行启动未…

Proteus仿真--8×8LED点阵屏仿电梯数字滚动显示

本文介绍基于88LED点阵屏仿电梯数字滚动显示设计(完整仿真源文件及代码见文末链接) 仿真图如下 其中K1-K5的5个按键分别代表不同楼层,摁下按键后在8X8LED上便会显示到对应楼层的跳变信息,模拟电梯的运作 仿真运行视频 Proteus仿…

《安富莱嵌入式周报》第328期:自主微型机器人,火星探测器发射前失误故障分析,微软推出12周24期免费AI课程,炫酷3D LED点阵设计,MDK5.39发布

周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程: 【实战技能】 单步运行源码分析,一期视频整明白FreeRTOS内核源码框架和运行…

【STM32】TIM定时器基本定时功能

第一部分:定时器基本定时的功能; 第二部分:定时器的输出比较功能; 第三部分:定时器输入捕获的功能; 第四部分:定时器的编码接口。 1 TIM简介 TIM(Timer)定时器&#…