Python实现基于CSV的数据驱动接口自动化测试
本文介绍如何使用Python结合csv和requests库,构建基于CSV文件的数据驱动接口自动化测试方案。通过预定义测试用例数据,自动发起GET或POST请求并比对响应结果,实现高效、可扩展的接口测试流程,适用于需要批量验证API参数的场景。
前言
在进行接口测试时,频繁读取CSV文件是常见操作。本文将详细讲解如何在Python3环境下实现CSV文件的写入与读取功能,帮助读者快速掌握相关技巧。
1、需求分析
假设有一个API接口,采用GET方法,包含token、mobile和email三个参数。
- 其中,token为必填参数。
- mobile和email中至少需要填写其中一项。
- mobile字段需符合手机号格式,email字段需符合邮箱格式。
2、解决方案
针对上述API,测试用例数量可能超过10个。此时,采用数据驱动模式将共性内容写入配置文件是更优的选择。
我们将API地址、请求参数及预期结果预先保存在格式化的CSV文件中。利用csv组件读取URL、参数和预期结果,通过Requests组件发起请求,将实际响应与预期结果进行比对,最后将比对结果写入结果CSV文件。
具体流程如下图所示 ☟

3、代码实现
在编写代码前,需确保已安装以下组件:
- csv:用于读写CSV文件。
- json:用于处理JSON数据格式。
- requests:用于发起HTTP请求并获取响应结果。
- 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请求两个方法)
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封装了丰富的方法,使得测试开发速度相对较快。在接口自动化测试中,若采用CSV管理的数据驱动方式,使用csv配合requests库是测试开发人员值得掌握的利器之一。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作具有一定的参考学习价值。如果有疑问大家可以留言交流,谢谢大家对本站的支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









