利用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入门篇之列表和元组
Oct 17 Python
python定时器(Timer)用法简单实例
Jun 04 Python
Python删除空文件和空文件夹的方法
Jul 14 Python
简单了解OpenCV是个什么东西
Nov 10 Python
利用Python在一个文件的头部插入数据的实例
May 02 Python
Python使用itertools模块实现排列组合功能示例
Jul 02 Python
Gauss-Seidel迭代算法的Python实现详解
Jun 29 Python
python每天定时运行某程序代码
Aug 16 Python
django创建超级用户过程解析
Sep 18 Python
基于python实现对文件进行切分行
Apr 26 Python
Python smtp邮件发送模块用法教程
Jun 15 Python
Python Django项目和应用的创建详解
Nov 27 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
改变Apache端口等配置修改方法
2008/06/05 PHP
PHP 进程锁定问题分析研究
2009/11/24 PHP
分享一个php 的异常处理程序
2014/06/22 PHP
php简单获取目录列表的方法
2015/03/24 PHP
php实现图片上传并进行替换操作
2016/03/15 PHP
JavaScript null和undefined区别分析
2009/10/14 Javascript
url地址自动加#号问题说明
2010/08/21 Javascript
JQuery中html()方法使用不当带来的陷阱
2011/04/07 Javascript
javascript firefox 自动加载iframe 自动调整高宽示例
2013/08/27 Javascript
JavaScript中为什么null==0为false而null大于=0为true(个人研究)
2013/09/16 Javascript
js实现div闪烁原理及实现代码
2014/06/24 Javascript
分享一个自己动手写的jQuery分页插件
2014/08/28 Javascript
javascript实现无限级select联动菜单
2015/01/02 Javascript
javascript面向对象之this关键词用法分析
2015/01/13 Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
2017/09/14 Javascript
详解微信JS-SDK选择图片遇到的坑
2018/08/15 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-model绑定的数据不能实时更新)
2020/04/03 Javascript
python中reload(module)的用法示例详解
2017/09/15 Python
Python实现七彩蟒蛇绘制实例代码
2018/01/16 Python
Python SQLite3简介
2018/02/22 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
2018/06/26 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
2019/06/21 Python
使用pip安装python库的多种方式
2019/07/31 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
python实现四人制扑克牌游戏
2020/04/22 Python
PyQt5实现登录页面
2020/05/30 Python
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
FirstCry阿联酋儿童和婴儿产品网上购物:FirstCry.ae
2021/02/22 全球购物
村庄环境整治方案
2014/05/15 职场文书
建设单位项目负责人任命书
2014/06/06 职场文书
合作协议书模板2014
2014/09/26 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
环境建议书
2015/02/04 职场文书
年中了,该如何写好个人述职报告?
2019/07/02 职场文书
MySQL 开窗函数
2022/02/15 MySQL