在接口测试的过程中,经常会用到CSV的读取操作。本文主要讲解Python3对CSV的写入和读取。1.需要一个API,GET方法,token,mobile,email三个参数token是必填项mobile,email是必填项,其中mobile是手机号,email是邮件格式测试时,测试用例数需要的可能多达10+。这时候,采用数据驱动的方式,将通用的内容写入配置文件可能更合适。这里考虑将API、参数和预期结果预先保存在格式化的CSV中,并使用csv组件从CSV中读取URL、参数和预期结果。Requests组件发起请求并将响应结果与预期结果进行比较。***将比较结果写入结果CSV。流程如图3所示。实现(1)上传代码前,安装以下组件:csv读写CSV文件jsonrequests发起请求并获取响应结果unittest测试用例调度(2)data.csv(本例选部分用例)(3)reader_CSV函数代码示例'datas=[]try:#以DictReader的形式读取数据文件,方便与json转换withopen(filename,'r')ascsvfile:#将从文件读取的数据转换为字典列表)forrowinreader: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'])\ifisinstance(row['expect'],dict)\elserow['expect']#如果期望值不是json,取其原值,否则convert转成json格式保存到结果datas.append(data)returndatas#如果找不到文件,返回空数据exceptFileNotFoundError:print("文件不存在",filename)returndatas(4)request_URL函数示例(包括GET请求和POST请求两种方法)defget_request(self,url,params):'''一般调用GET接口方法:paramurl:string接口路径:paramparams:{"":"","":""}传入的参数:return:response响应体'''print("CallAPI...")r=requests.get(url,paramsparams=params)print(r.text)returnrdefpost_request(self,url,params):'''通用调用POST接口方法:paramurl:stringInterfacepath:paramparams:{"":"","":""}需要传入的参数:return:responseresponsebody'''print("CallAPI...")r=requests.post(url,params=json.dumps(params))#post方法必须使用json.dumps()转成json格式print(r.text)returnr(5)assert_Result函数示例defassertResult(self,except_value,real_value):'''验证指定字符串是否包含在样本字符串中:paramexcept_value:stringspecifiedstring:paramreal_value:stringsamplestring:return:布尔样本包含指定string并返回True,否则返回False'''ifsuccess=except_valueinstr(real_value)returnifsuccess(6)write_CSV函数示例defwriteCSV(self,filename,results):'''在csv文件中写入指定内容:paramfilename:stringrequired写入的文件名:paramresults:[{data1},{data2},...]写入的内容:return:None'''print("Writefile:",filename)#以表格形式写入文件DictWriterwithopen(filename,'w+')ascsvfile:headers="id,url,token,mobile,email,expect,real_value,assert_value".split(",")writer=csv.DictWriter(csvfile,fieldnames=headers)#writeheaderwriter.writeheader()#writedataifresults.__len__()>0:forresultinresults:writer.writerow(result)csvfile。close()(7)test_interface1函数示例deftest_interface1(self):#指定读取的数据文件名data_file="../data/data.csv"#指定最终结果生成的数据文件名result_file="../data/result_{}.csv".format(str(time.time()).split(".")[0])#读取指定文件的数据datas=self.readCSV(data_file)#数据文件有内容则调用接口,否则直接测试结束ifdatas.__len__()>0:results=[]#获取数据文件中每一行fortestcaseindatas: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"]#Assemblyparameterparams={"token":result["token"],"mobile":result["mobile"],"email":result["email"]}#调用API接口获取响应结果real_value=self.get_request(result["url"],params)#调用assert方法检查响应中是否存在预期结果resultassert_value=self.assertResult(result["expect"],real_value.text)result["real_value"]=real_value.textresult["assert_value"]=assert_value#获取每一行的所有字段以及实际结果和验证结果results.append(result)#执行完所有记录后,将所有结果写入result.csvself.writeCSV(result_file,results)#写入csv文件print("测试结束")8result_1523956055.csv(请忽略本例中的测试结果)4.综上所述,python封装了很多方法,开发速度对于测试来说是比较快的,如果接口自动化测试采用CSV管理的数据驱动方式,使用csv+requests是其中一种测试开发中不可错过的强大工具《技术》原创文章,转载请合作微信联系原作者公众号(bigsec)】点此查看该作者更多好文
