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

发表于:2018-5-11 17:16

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:miaomiao    来源:51testing软件测试网采编

  在接口测试的过程中,很多时候会用到对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 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,paramsparams=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("测试结束") 
  8result_1523956055.csv(本示例中的测试结果请忽略)
  4. 总结
  python封装了很多方法,对于测试来说开发速度相对较快,接口自动化测试如果采用CSV管理的数据驱动方式,使用csv+requests是测试开发不容错过的利器之一。




上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号