Py学习  »  Python

用Python实现数据驱动的接口自动化测试 | 岂安低调分享

bigsec岂安科技 • 5 年前 • 539 次点击  

干货

观点

案例

资讯

我们


岂安科技
最真诚的业务安全公众号


撸主:


miaomiao   高级测试工程师


目前负责RedQ、Warder产品的质量保障工作。




在接口测试的过程中,很多时候会用到对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函数代码示例


  1. import csv

  2. import json

  3. import requests

  4. import time

  5. import unittest

  6. def readCSV(self,filename):

  7.  '''

  8.  :param filename: 需要读取的数据文件

  9.  :return: [{data1},{data2}...]

  10.  '''

  11.  datas = []

  12.  try:

  13.  #以DictReader的方式读取数据文件,方便与json互做转换

  14.  with open(filename,'r')  as csvfile :

  15.  #从文件里读取到的数据转换成字典列表的格式

  16.  reader = csv.DictReader(csvfile)

  17.  for row in reader:

  18.  data = {}

  19.  data['id'] = row['id']

  20.  data['url'] = row['url']

  21.  data['token'] = str(row['token'])

  22.  data['mobile'] = row['mobile']

  23.  data['email'] = row['email']

  24.  data['expect'] = json. dumps(row['expect']) \

  25.  if isinstance(row['expect'],dict) \

  26.  else row['expect'] #如果expect读取出来的不是json则取其原值,否则转为json格式保存到result里

  27.  datas.append(data)

  28.  return datas

  29.  #如果文件找不到,返回空的datas

  30.  except FileNotFoundError:

  31.  print("文件不存在",filename)

  32.  return datas



4
request_URL函数示例(包含GET请求和POST请求2个方法)


  1. def get_request(self,url,params):

  2.  '''

  3.  通用的调用GET接口方法

  4.  :param url:string 接口路径

  5.  :param params:{"":"","":""} 需要传入的参数

  6.  :return: response响应体

  7.  '''

  8.  print("调用API...")

  9.  r = requests.get(url,params=params)

  10.  print(r.text)

  11.  return r

  12. def post_request(self,url,params):

  13.  '''

  14.  通用的调用POST接口方法

  15.  :param url: string 接口路径

  16.  :param params: {"":"","":""} 需要传入的参数

  17.  :return:response响应体

  18.  '''

  19.  print("调用API...")

  20.  r = requests.post(url,params=json.dumps(params)) #post的方法必须用json.dumps()转化成json格式

  21.  print(r.text)

  22.  return r



5
assert_Result函数示例


  1. def assertResult(self,except_value,real_value):

  2.  '''

  3.  校验样本字符串中是否包含指定字符串

  4.  :param except_value: string 指定字符串

  5.  :param real_value: string 样本字符串

  6.  :return: Boolean 样本中包含指定字符串返回True,否则返回False

  7.  '''

  8.  ifsuccess = except_value  in str(real_value)

  9.  return ifsuccess



6
6. write_CSV函数示例


  1. def writeCSV(self,filename,results):

  2.  '''

  3.  写入csv文件指定内容

  4.  :param filename: string 需要写入的文件名称

  5.  :param results: [{data1},{data2},...] 写入的内容

  6.  :return: 无

  7.  '''

  8.  print("写文件:",filename)

  9.  #以DictWriter的方式写文件

  10.  with open(filename,'w+') as csvfile:

  11.  headers ="id,url,token,mobile,email,expect,real_value,assert_value".split(",")

  12.  writer = csv.DictWriter(csvfile,fieldnames=headers)

  13.  #写表头

  14.  writer.writeheader()

  15.  #写数据

  16.  if results.__len__() > 0 :

  17.  for result in results:

  18.  writer.writerow(result)

  19.  csvfile.close()



7
test_interface1函数示例


  1. def test_interface1(self):


  2.  #指定读取的数据文件名称

  3.  data_file = "../data/data.csv"


  4.  #指定最终结果生成的数据文件名称

  5.  result_file = "../data/result_{}.csv".format(str(time.time()).split(".")[0])


  6.  #读取指定文件的数据

  7.  datas = self.readCSV(data_file)


  8.  #数据文件有内容则调用接口,否则直接测试结束

  9.  if datas.__len__() > 0:

  10.  results =[]


  11.  #获取数据文件里的每一行

  12.  for testcase in datas :

  13.  result = {}

  14.  result["id"] = testcase["id"]

  15.  result["url"] = testcase["url"]

  16.  result["token"] = testcase["token"]

  17.  result["mobile"] = testcase["mobile"]

  18.  result["email"] = testcase["email"]

  19.  result["expect"] = testcase["expect"]


  20.  #组装参数

  21.  params =  {

  22.  "token":result["token"],

  23.  "mobile":result["mobile"],

  24.  "email":result["email"]

  25.  }


  26.  #调用API接口,获取响应结果

  27.  real_value = self.get_request(result["url"],params)


  28.  #调用assert方法,检查预期结果是否在响应结果中存在

  29.  assert_value = self.assertResult(result["expect"],real_value.text)

  30.  result["real_value"] = real_value.text

  31.  result["assert_value" ] = assert_value

  32.  #获取每一行里的所有字段以及实际结果和验证结果

  33.  results.append(result)

  34.  #执行完所有记录后,将所有结果写入result.csv

  35.  self.writeCSV(result_file,results) #写入csv文件

  36.  print("测试结束")



8
result_1523956055.csv(本示例中的测试结果请忽略)




4
  总结


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


你会感兴趣的内容


【作者】

如何使用 JMeter 实现 API 接口自动化测试?


【测试】

测试工程师良品 —— Fiddler 工具简介

从入门到不放弃:多浏览器的自动化测试(1)- 本地测试

从入门到不放弃:多浏览器的自动化测试(2)- 云服务测试


【python】

谈谈Python协程技术的演进

Python机器学习工具:Scikit-Learn介绍与实践

手把手教你用Python爬虫煎蛋妹纸海量图片




今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/aTEoAuWfLo
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/11655
 
539 次点击