后台接口自动化(基于QT4S)-程序员宅基地

技术标签: 接口  后台  自动化  

后台接口自动化(基于QT4S)

导语 根据测试金字塔理论,自动化收益由高到低依次是单元测试,API接口测试和UI测试。其中单元测试的主体一般是开发人员,API接口测试和UI测试的主体是测试人员。相比迭代变化快、编写成本高而且运行耗时长的UI测试,API接口测试的ROI要高得多,是最适合测试人员做自动化测试的地方。本文基于此点考虑,重心放在基于QT4S和业务相结合,探讨最有效用和最能解决业务痛点的一些心得和总结。

一、背景:

后台测试一般会分为接入层的测试和逻辑层的测试。自动化测试实施在接入层,还是逻辑层,或者都需要,是测试人员需要考虑的问题。后台架构比较简单,且很少依赖第三方的产品,做接入层的自动化测试比较常见;对于后台架构比较复杂,有较多第三方依赖的产品,做逻辑层的自动化要更容易一些。
先看一下腾讯课堂的业务逻辑,分为前端、cgi接口、逻辑svr三大部分。目前的考虑是做接入层的自动化,覆盖主流程上常用的模块。
在这里插入图片描述

二、技术方案

QT4S,即Quick Test for Server,是基于QTA框架的面向后台测试的自动化解决方案。基于QT4S架构实现的后台接口测试,该框架封装好了消息(Message)处理、通道(Channel)连接和常用的测试框架,我们只需要关注自己的业务逻辑代码上的实现和封装。

2.1项目目录:

ke------------------------------------------------产品模块
----- conf----------------------------------------配置相关(账号和环境)
-----kelib----------------------------------------自定义库(后台PB文件)
-----test_resources--------------------------接口定义
-----testcases---------------------------------测试用例
--------------------------cgitest----------------测试用例脚本编写(初始化、请求,检查返回)
--------------------------cgitestdata----------测试用例数据(请求和回包数据)
在这里插入图片描述

2.2接口定义

拿到一个接口的完整信息,包括接口name、请求的方式**(GET或POST)**和接口的请求参数。

from ke.test_resources.cgiresource import KeBaseCgi

class GetAgencyBargainListCgi(KeBaseCgi):

def __init__(self, tuin = None):
super(GetAgencyBargainListCgi, self).__init__(tuin)
self.name = "cgi-proxy/agency/get_agency_bargain_list"
        self.reqdata.method = "GET"
        self.reqdata.params = {}

def set_params(self, params):
	self.reqdata.params = params

如何获取到相应的接口信息呢?通过浏览器打开会请求该接口的页面,在network中可以查看到所有请求和响应包的格式和数据。
在这里插入图片描述

2.3测试用例实现

导入模块:接口定义库、接口请求和响应包的数据、测试用例基类和测试数据基类。
初始化:测试数据初始化准备req_data和resp_data、接口请求res = cgi.send()
断言:testcase.py中提供了很多实用的断言方法包括check_retcode、assert_equal和assert_等方法。

from ke.test_resources.cgi.bargain_info.GetAgencyBargainListCgi import GetAgencyBargainListCgi  # 导入cgi接口定义文件
from ke.testcases.cgitestdata.bargain_info.GetAgencyBargainListData import GetAgencyBargainListReqData, GetAgencyBargainListRespData      # 导入接口的抓包数据(请求和回包)
from ke.testcases.tscene import TBaseScene        # 测试用例基类
from newtown.servertest.tselector import TData    # 测试数据基类  

class GetAgencyBargainListTest(TBaseScene):
'''
    GetAgencyBargainListTest 获取机构砍价活动列表主用例
    '''
    owner = 'xxx'
    timeout = 5
    priority = TBaseScene.EnumPriority.High
    status = TBaseScene.EnumStatus.Design

def run_test(self):
        uin = "2692197731"                  # 不同环境uin不一样,测试专用机构账号
        agency_manager_info_resp_data = TData(GetAgencyBargainListRespData).get_test_param('MAIN') # 初始化响应
        agency_manager_info_req_data = TData(GetAgencyBargainListReqData).get_test_param('MAIN')   # 初始化请求
        cgi = GetAgencyBargainListCgi(uin)             # 接口初始化
        cgi.set_params(agency_manager_info_req_data)   
        res = cgi.send()                               # 请求接口
		self.check_retcode(cgi.name, res, 0)                   # 响应数据断言
		self.start_step("检查机构id是 %s" % agency_manager_info_resp_data['agency_id'])
		self.assert_equal('检查机构id', res['result']['items'][0]['agency_id'],agency_manager_info_resp_data['agency_id'])
		self.assert_equal('检查砍价活动id', res['result']['items'][0]['act_id'],agency_manager_info_resp_data['act_id'])

if __name__ == "__main__":
    	GetAgencyBargainListTest().debug_run()
2.4测试数据构造

测试数据包括请求数据ReqData和响应数据RespData
每个部分的数据又包括线上的online和测试环境的offline两套环境

#!/usr/bin/env python
#-*- coding: utf-8 -*-

#接口请求数据
GetAgencyBargainListReqData = {
"online": {
"a_id": 30099,
            "page": 0,
            "count": 10
    },
    "offline": {
"MAIN": {
"a_id": 30099,
            "page": 0,
            "count": 10
        },
    }
}

#接口响应数据
GetAgencyBargainListRespData = {
"online":{

    },
    "offline":{
"MAIN" :{
"act_id": 246,
            "agency_id": 30099,
            "course_id": 60047,
            "course_name": "测试课程包普通课程E",
            "industry_1st": 1002,
            "industry_2st": 2011,
            "industry_3st": 3060,
            "origin_price": 500,
            "term_id": 1000018223,
        },

    }
}

三、复杂场景测试

在腾讯课堂产品业务中,营销工具模块占了很大一部分,属于核心功能模块和用户反馈关注较多的模块。针对这一块的后台接口自动化就很有必要性。
举个例子,针对营销工具中的砍价活动这一部分。涉及到的接口较多,单条测试用例的执行只能做比较简单的收益不高的自动化。按照正常的逻辑来实现多条测试用例的联动,完成一个全流程的测试需要花费很多时间在等待数据状态变化上。所以,如何把这一部分的流程简单化,需要做到实时修改DB数据,实时联动多条用例达到一个可以覆盖真实场景的用例。另外,多条测试用例的联动对异常测试来说也是非常重要的。
未完待续!!!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39883139/article/details/98884728

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签