接口自动化(四):框架搭建(Python)

这篇博客介绍了如何搭建接口自动化测试框架,包括配置、测试数据、测试脚本、启动主函数和报告生成。使用unittest框架,配置文件和测试数据以csv格式存储,测试脚本涉及sessionID处理。启动主函数按配置执行测试,并利用HTMLTestRunner生成测试报告。最后展示了报告样式和性能测试预告。
摘要由CSDN通过智能技术生成

今天更新最后一篇接口自动化的内容:框架搭建,建议大家提前了解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()

报告层:

生成的报告会直接在这个目录下面:
报告样式:
在这里插入图片描述两个测试脚本,两个测试报告
自动化测试差不多就到这里结束了,欢迎大家多多留言,下一期我们讲性能测试了啦

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芳草乀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值