今天更新最后一篇接口自动化的内容:框架搭建,建议大家提前了解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()
报告层:
生成的报告会直接在这个目录下面:
报告样式:
两个测试脚本,两个测试报告
自动化测试差不多就到这里结束了,欢迎大家多多留言,下一期我们讲性能测试了啦