赞
踩
今天更新最后一篇接口自动化的内容:框架搭建,建议大家提前了解unittest框架
框架分为五部分(配置、测试数据文件、测试脚本、启动主函数、报告)
配置文件为csv格式,给大家看下样式:主要包括脚本路径,脚本名称,测试是否执行和执行顺序
数据文件也是csv文件格式,主要存放的是接口所需要的数据,这里我只有一个接口用到了数据文件,给大家看下什么样子:
第一列:请求url
第二列:预期结果(第一个没有预期结果,因为我测试的是更新信息接口,依赖登录,所以我登录成功就行了,没有做断言)
第三列:请求的参数个数
第四列及以后:参数名称及参数值
该文件放在testdatafile目录下的ind_interface
测试脚本,和我前几期讲的差不多,就是发请求,断言,不过这里有个新东西和大家说下,就是sessionID问题,因为实际工作中有好多请求就是依赖这些东西,我这里是更新用户信息,需要用户登录返回来的sessionID,直接上代码:
import os from HTMLTestRunner import HTMLTestRunner import requests import unittest import csv class test_updateuser_v3(unittest.TestCase): #unittest框架中setUp方法是在每个测试case前都执行一遍 def setUp(self): #获取当前路径,如果路径混乱时,大家可以print打印去调试 path = os.getcwd() # 一个点上一级 两个点上上一级 p1 = os.path.abspath(os.path.dirname(path) + os.path.sep + ".") self.fpath = p1 + "\\testdatafile\ind_interface\\test_updateuser.csv" print(self.fpath) self.file = open(self.fpath, 'r') table = csv.reader(self.file) userinfo = {} 拿到登录的用户名和登录密码,所以这里参数写死掉了 for row in table: url = row[0] userinfo[row[3]] = row[4] userinfo[row[5]] = row[6] break response = requests.post(url, data=userinfo) #拿到登录返回来的jsessionid self.sessionID = dict(response.cookies)['JSESSIONID'] self.file.close() #更新用户信息,unittest框架中测试方法必须以test开头 def test_03(self): self.file2 = open(self.fpath, 'r') #这里为什么是num=0呢,是因为文件的第一行是登录请求url,所以我第一行要跳过,下面做判断用 num = 0 table = csv.reader(self.file2) for row in table: userinfo = {} #第一行就跳过了 num = num + 1 if num > 1: #拿到url url = row[0] #拿到参数个数,类似我前几篇方法一样,我就不一一解释了 j = int(row[2]) expresult = row[1] for i in range(3, 2 * j + 3, 2): userinfo[row[i]] = row[i + 1] # print(userinfo) session = {'JSESSIONID': self.sessionID} #这里多了cookies参数,请注意 response = requests.post(url, data=userinfo, cookies=session).text print(response) #这里断言:判断response里面是否有更新个人信息成功字段,比if简单多了 self.assertIn("更新个人信息成功", response) self.file2.close()
该脚本放在script目录下面的ind_interface
主要记录了怎么去按照配置文件里面的标识去执行脚本:
import csv import operator import os import unittest #这里用HTMLTestRunner生成报告,需要把该python文件放到项目目录下面 from HTMLTestRunner import HTMLTestRunner if __name__ == '__main__': path = os.getcwd() p2 = os.path.abspath(os.path.dirname(path) + os.path.sep + ".") #报告名字 filename = p2 + "\\testresultfile\ind_interface\\test_updatauser_report.html" #以二进制写报告 report=open(filename,'wb') file = open('D:\Learn\\automation\interfaceframework\config\config.csv', 'r') #下面注释的两行是获取配置文件里一共多少行 # line=len(open('D:\Learn\\automation\interfaceframework\config\config.csv').readlines()) # print(line) table = csv.reader(file) lis = [] n = 0 dic = {} for row in table: #跳过第一行 if n > 0: dic = {} #拿到测试脚本路径,测试脚本名称 dic[row[1]] = row[0] #拿到测试顺序 dic['num'] = row[3] #拿到测试状态:即是否执行 dic['state']=row[2] # print(dic) if dic != {}: #把他们装到列表里面 lis.append(dic) #n为csv行数 n = n + 1 #这里是把列表按照num排序 dicn = sorted(lis, key=operator.itemgetter('num')) #给大家看下dicn结果排序内容: #[{'test_updateuser_v2.py': 'D:\\Learn\\automation\\interfaceframework\\script\\ind_interface', 'num': '1', 'state': 'YES'}, {'test_updateuser_v3.py': 'D:\\Learn\\automation\\interfaceframework\\script\\ind_interface', 'num': '2', 'state': 'YES'}] # print(dicn) #相当于循环配置文件了 for i in range(0, n - 1): m = 0 #拿到字典里的值 for content in dicn[i].items(): if m == 0: #拿到测试文件名,测试文件路径 fname = content[0] fpath = content[1] print(fname, fpath) if m==2: state=content[1] #判断是否执行该脚本 if state=='YES': #加载测试case discover = unittest.defaultTestLoader.discover(fpath, pattern=fname) runner = HTMLTestRunner(stream=report, title="测试报告", description="更新接口") #执行加载的测试案例 runner.run(discover) m = m + 1 report.close()
生成的报告会直接在这个目录下面:
报告样式:
两个测试脚本,两个测试报告
自动化测试差不多就到这里结束了,欢迎大家多多留言,下一期我们讲性能测试了啦
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。