当前位置: 首页 > news >正文

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 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是测试开发不容错过的利器之一。

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

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 面壁智能发布端侧 AI 应用开发平台;快手推出肖像动画技术 LivePortrait丨 RTE 开发者日报
  • 【C++中resize和reserve的区别】
  • qt 线程举例
  • 基层医院、专科医院云HIS系统,支持电子病历四级,全套源码交付
  • MeEdu网校系统搜索功能问题处理
  • 【网络安全】Host碰撞漏洞原理+工具+脚本
  • codeforces round 956 div2
  • 使用 mongo2neo4j 和 SemSpect 通过各种方式进行图探索
  • 超市收银系统源码
  • 通过 Parallels Desktop 虚拟机安装运行 macOS 15 Sequoia
  • 通用后台管理(二)——项目搭建
  • go mod 依赖管理补充2
  • 手写MyBatis
  • 20W+喜爱的Pathview网页版 | 整合表达谱数据KEGG通路可视化
  • 大模型备案全网最详细流程说明【附附件】
  • 2018一半小结一波
  • Apache Zeppelin在Apache Trafodion上的可视化
  • CSS相对定位
  • echarts的各种常用效果展示
  • Fundebug计费标准解释:事件数是如何定义的?
  • Git同步原始仓库到Fork仓库中
  • JS 面试题总结
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • React中的“虫洞”——Context
  • springboot_database项目介绍
  • 从伪并行的 Python 多线程说起
  • 关于Flux,Vuex,Redux的思考
  • 普通函数和构造函数的区别
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 异常机制详解
  • 第二十章:异步和文件I/O.(二十三)
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​决定德拉瓦州地区版图的关键历史事件
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • ### RabbitMQ五种工作模式:
  • #Spring-boot高级
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (2)空速传感器
  • (7)svelte 教程: Props(属性)
  • (C语言)fgets与fputs函数详解
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (HAL库版)freeRTOS移植STMF103
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (十)Flink Table API 和 SQL 基本概念
  • (四)linux文件内容查看
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (转)关于多人操作数据的处理策略
  • (转)使用VMware vSphere标准交换机设置网络连接
  • **PHP二维数组遍历时同时赋值
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • *setTimeout实现text输入在用户停顿时才调用事件!*