导语 根据测试金字塔理论,自动化收益由高到低依次是单元测试,API接口测试和UI测试。其中单元测试的主体一般是开发人员,API接口测试和UI测试的主体是测试人员。相比迭代变化快、编写成本高而且运行耗时长的UI测试,API接口测试的ROI要高得多,是最适合测试人员做自动化测试的地方。本文基于此点考虑,重心放在基于QT4S和业务相结合,探讨最有效用和最能解决业务痛点的一些心得和总结。
后台测试一般会分为接入层的测试和逻辑层的测试。自动化测试实施在接入层,还是逻辑层,或者都需要,是测试人员需要考虑的问题。后台架构比较简单,且很少依赖第三方的产品,做接入层的自动化测试比较常见;对于后台架构比较复杂,有较多第三方依赖的产品,做逻辑层的自动化要更容易一些。
先看一下腾讯课堂的业务逻辑,分为前端、cgi接口、逻辑svr三大部分。目前的考虑是做接入层的自动化,覆盖主流程上常用的模块。
QT4S,即Quick Test for Server,是基于QTA框架的面向后台测试的自动化解决方案。基于QT4S架构实现的后台接口测试,该框架封装好了消息(Message)处理、通道(Channel)连接和常用的测试框架,我们只需要关注自己的业务逻辑代码上的实现和封装。
ke------------------------------------------------产品模块
----- conf----------------------------------------配置相关(账号和环境)
-----kelib----------------------------------------自定义库(后台PB文件)
-----test_resources--------------------------接口定义
-----testcases---------------------------------测试用例
--------------------------cgitest----------------测试用例脚本编写(初始化、请求,检查返回)
--------------------------cgitestdata----------测试用例数据(请求和回包数据)
拿到一个接口的完整信息,包括接口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中可以查看到所有请求和响应包的格式和数据。
导入模块:接口定义库、接口请求和响应包的数据、测试用例基类和测试数据基类。
初始化:测试数据初始化准备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()
测试数据包括请求数据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数据,实时联动多条用例达到一个可以覆盖真实场景的用例。另外,多条测试用例的联动对异常测试来说也是非常重要的。
未完待续!!!
文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib
文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang
文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些
文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器
文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距
文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器
文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn
文章浏览阅读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
文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql
文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...
文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120
文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数