利用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 变量类型及命名规则介绍
Jun 08 Python
python实现在windows服务中新建进程的方法
Jun 30 Python
python实现井字棋游戏
Mar 30 Python
Python爬取网易云音乐上评论火爆的歌曲
Jan 19 Python
python数据预处理之将类别数据转换为数值的方法
Jul 05 Python
Python实现PS滤镜Fish lens图像扭曲效果示例
Jan 29 Python
python3.x实现发送邮件功能
May 22 Python
Python操作mongodb的9个步骤
Jun 04 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
Apr 11 Python
tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
Jun 22 Python
用Python开发app后端有优势吗
Jun 29 Python
Python 实现一个计时器
Jul 28 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
PHP4和PHP5共存于一系统
2006/11/17 PHP
PHPUnit PHP测试框架安装方法
2011/03/23 PHP
用javascript父窗口控制只弹出一个子窗口
2007/04/10 Javascript
Jquery乱码的一次解决过程 图解教程
2010/02/20 Javascript
jquery 学习笔记一
2010/04/07 Javascript
JS 文件传参及处理技巧分析
2010/05/13 Javascript
JS字符串截取函数实例
2013/12/27 Javascript
jQuery实现感应鼠标动画效果自动伸长的输入框实例
2015/02/24 Javascript
MVC Ajax Helper或Jquery异步加载部分视图
2015/11/29 Javascript
JavaScript学习笔记之检测客户端类型是(引擎、浏览器、平台、操作系统、移动设备)
2015/12/03 Javascript
JS验证逗号隔开可以是中文字母数字
2016/04/22 Javascript
Jquery on方法绑定事件后执行多次的解决方法
2016/06/02 Javascript
js删除数组元素、清空数组的简单方法(必看)
2016/07/27 Javascript
Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
2017/06/04 Javascript
详解vue.js之绑定class和style的示例代码
2017/08/24 Javascript
基于node打包可执行文件工具_Pkg使用心得分享
2018/01/24 Javascript
JS实现左边列表移到到右边列表功能
2018/03/28 Javascript
webstorm中配置nodejs环境及npm的实例
2018/05/15 NodeJs
微信小程序实现二维码签到考勤系统
2020/01/16 Javascript
Vue 一键清空表单的实现方法
2020/02/07 Javascript
详解React路由传参方法汇总记录
2020/11/29 Javascript
两个命令把 Vim 打造成 Python IDE的方法
2016/03/20 Python
利用python为运维人员写一个监控脚本
2018/03/25 Python
python smtplib模块自动收发邮件功能(一)
2018/05/22 Python
python cv2在验证码识别中应用实例解析
2019/12/25 Python
pandas to_excel 添加颜色操作
2020/07/14 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
2021/01/21 Python
CSS3实现的文本3D效果附图
2014/09/03 HTML / CSS
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
护士辞职信范文
2014/01/19 职场文书
给面试官的感谢信
2014/02/01 职场文书
企业口号大全
2014/06/12 职场文书
投资意向书
2014/07/30 职场文书
2014县政府领导班子三严三实对照检查材料思想汇报
2014/09/26 职场文书
Python3中PyQt5简单实现文件打开及保存
2021/06/10 Python
《遗弃》开发商删推文要跑路?官方回应:还在开发
2022/04/03 其他游戏