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


Posted in Python onMay 11, 2018

前言

大家在接口测试的过程中,很多时候会用到对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。

流程如下图 ☟

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

3、实现

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

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

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

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

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如何实现数据驱动的接口自动化测试

总结

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

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

Python 相关文章推荐
Python随机生成一个6位的验证码代码分享
Mar 24 Python
python使用Tkinter显示网络图片的方法
Apr 24 Python
使用PDB简单调试Python程序简明指南
Apr 25 Python
在Python的Django框架中显示对象子集的方法
Jul 21 Python
Python遍历文件夹和读写文件的实现方法
May 10 Python
python中(str,list,tuple)基础知识汇总
Feb 20 Python
pandas 条件搜索返回列表的方法
Oct 30 Python
利用python在excel里面直接使用sql函数的方法
Feb 08 Python
windows下python虚拟环境virtualenv安装和使用详解
Jul 16 Python
python  logging日志打印过程解析
Oct 22 Python
在Python 的线程中运行协程的方法
Feb 24 Python
Django REST framwork的权限验证实例
Apr 02 Python
Python数据结构之图的应用示例
May 11 #Python
python 重定向获取真实url的方法
May 11 #Python
基于python 爬虫爬到含空格的url的处理方法
May 11 #Python
解决Python 爬虫URL中存在中文或特殊符号无法请求的问题
May 11 #Python
解决Python网页爬虫之中文乱码问题
May 11 #Python
解决python爬虫中有中文的url问题
May 11 #Python
利用Python yagmail三行代码实现发送邮件
May 11 #Python
You might like
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
基于 Swoole 的微信扫码登录功能实现代码
2018/01/15 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
Google Suggest ;-) 基于js的动态下拉菜单
2006/10/11 Javascript
javascript cookies操作集合
2010/04/12 Javascript
div+css布局的图片连续滚动js实现代码
2010/05/04 Javascript
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
JS获得浏览器版本和操作系统版本的例子
2014/05/13 Javascript
Javascript中的getUTCDay()方法使用详解
2015/06/10 Javascript
javascript类型系统 Array对象学习笔记
2016/01/09 Javascript
jQuery实现的placeholder效果完整实例
2016/08/02 Javascript
javascript图片预览和上传(兼容IE)
2017/03/15 Javascript
Angular中实现树形结构视图实例代码
2017/05/05 Javascript
详解React+Koa实现服务端渲染(SSR)
2018/05/23 Javascript
微信小程序滑动选择器的实现代码
2018/08/10 Javascript
Vue中对拿到的数据进行A-Z排序的实例
2018/09/25 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
微信小程序实现点击按钮后修改颜色
2019/12/05 Javascript
JavaScript, select标签元素左右移动功能实现
2020/05/14 Javascript
在vue-cli3中使用axios获取本地json操作
2020/07/30 Javascript
基于JavaScript实现随机点名器
2021/02/25 Javascript
[00:12]2018DOTA2亚洲邀请赛 Sccc亮相SOLO赛,今年他又会有什么样的战绩?
2018/04/06 DOTA
Python 文件操作的详解及实例
2017/09/18 Python
golang/python实现归并排序实例代码
2020/08/30 Python
Python制作简单的剪刀石头布游戏
2020/12/10 Python
新奇的小玩意:IWOOT
2016/07/21 全球购物
西班牙语在线票务市场:SuperBoletería
2019/06/10 全球购物
教你怎样写好自我评价
2013/10/05 职场文书
煤矿班组长的职责
2013/12/25 职场文书
信息与计算机科学职业规划范文:成为一艘有方向的船
2014/09/11 职场文书
作风建设年度心得体会
2014/10/29 职场文书
项目经理岗位职责
2015/01/31 职场文书
学校党支部承诺书
2015/04/30 职场文书
小学生安全教育主题班会
2015/08/12 职场文书
深度学习小工程练习之垃圾分类详解
2021/04/14 Python