作者|邹德龙
想法诞生
基于找靓机APP接入内部UITest框架,已累计了70+场景case和140+埋点验证case ,且已经投入业务上线的回归使用。同时现有的AB测试需求,虽经过前期的AB实验流程建设,人工验证流程在质量和效率上已有大大提升,但是投入的人力成本还是比较高,重复性极强,且验证的数据都是固定的,假设1个需求有ABC共3个分组,验证Android+IOS 两端,人力预计投入约8-10小时。那么有没有办法通过UI 自动化去提效,解决这种困境呢?
说干就干
1、协同大数据/组内同学确认AB测试验收的标准流程,梳理关键点和是否可自动化完成情况大致如下:
手机设备代理
本地环境host代理
配置接口刷新实验缓存数据(可实现)
首页_AB分组接口核对上报实验的接口(可实现)
AB场景对应的接口上报AB(可实现)
转化路径的执行(可实现)
AB切换后重复验证转化路径(可实现)
执行订单/支付脚本(可实现)
当前客户端处理AB流程:
2、设计思路诞生,和大数据同学确认数据以及方案可行。基于现有UITest框架, 在case执行基础上,补充python + request + 配置文件形式方便业务配置,同时在原有AB测试验收流程上添加:
接入企业微信机器人实时播报自动化整个验收过程
添加人工复审的SQL输出
3、流程解析
所有的实现都基于现有的UITest框架上面实现,同时流程中还存在暂无法避免的人工操作。
(1)数据准备,目前这些步骤还需手动配置,但只有测试环境创建实验和AB测试相关服务部署是重复性步骤。
(2)填写配置文件,主要是AB测试需求中所涉及的分组、实验ID、执行设备ID和企业机器人信息相关配置
# True:执行该分组 False:不执行该组
A = True
B = True
C = False
D = False
ab_id = 10xxx # AB实验ID
deviseId = 'xxxx-123-321--xxxxxxxxx' # 设备ID
# 调试机器人
webHookTest = 'xxx'
webHookTest_key = 'xxx'
(3)脚本执行,直接本地执行python文件即可。
# -*-coding:utf-8-*-
import os
import UiTest
from ZljUItest.ab_case import ab_regression_test
def test():
ab_regression_test.ab_test_b2c()
if __name__ == '__main__':
receivers = "xxxx" # 通知邮箱
root_path = os.path.abspath(os.path.dirname(__file__) + os.path.sep + "..") + os.path.sep
resource_mapping_path = ''
config_path = root_path + "config.yaml"
UiTest.run_ui(email=receivers, suit_file=__file__, project=root_path, os="android",
config_yaml=config_path)
AB实验自动化执行,企业微信自动发送通知:
(4)验收执行流程
断言config是否存在实验ID,保证AB实验配置是生效的。
def ab_config(self, ab):
"""
开启实验后,需要刷新实验的缓存数据(每次修改实验后,都要刷新才能生效)
:param ab: 实验ID
:return:
"""
url = "xxx" # API地址
response = requests.get(url)
code = response.status_code
text = response.text
ab_text = re.findall(r'"test_id":{}.*?0,'.format(str(ab)), text) # 正则取出上报的data数据
Logger().setlog(str(code))
Logger().setlog(str(ab_text))
# 转str
ab_text = str(ab_text)
if str(ab) in ab_text:
ab_text = ab_text.replace("['", "{").replace(",']", "}") # 替换相关字段
ab_text = json.loads(ab_text) # 转dist
Logger().setlog("打印配置文件获取的AB信息")
Logger().setlog(str(ab_text)) # 打印配置文件获取的AB信息
# ab_id = ab_text["test_id"]
Logger().setlog("ab_config配置接口成功获取到实验ID:{}".format(str(ab)))
# 企业机器人通知
ABPage().webhook_push(host=zljconfig.webHookTest, text="ab_config配置接口成功获取到实验ID:{},开始执行检查APP是否上报AB...".format(str(ab)))
return True
else:
Logger().setlog("ab_config配置接口获取实验ID失败:{}".format(str(ab)))
# 企业机器人通知
ABPage().webhook_push(host=zljconfig.webHookTest, text="实验{}未获取到".format(str(ab)))
return False
切换AB分组,自动覆盖全部AB的分组验证,首页_AB分组接口获取实验的实验分组/桶号/page_id/实验id,通过UITest重启APP(冷启动),APP启动时,埋点数据上报数据正确性检测以及上报路径时序检测。
if zljconfig.A:
ABPage().webhook_push(host=zljconfig.webHookTest, text="该实验存在A桶,开始执行A桶验证")
# 设备切成A桶
ABPage().switch_group_id(ab_id=ab_id, device_id=zljconfig.deviseId, hit_num='A')
# 重新启动APP加载配置
device.stop_app(package="xxxxx")
# 创建AB上报日志路径
log_path = ABPage().ab_get(ab_id=ab_id, clear=False)
# 启动APP
device.start_app(package="xxxxx")
time.sleep(10)
# 断言APP首页是否上报AB
assert ABPage().ab_assert(log_path, ab_id=ab_id, hit_num='A')
# 执行转化路径
# TransitionPath().b2c_one_path()
验收脚本执行完成后,结果和复核查询SQL通过企业微信机器人推送:
后续改进
初版本虽然已经实现可以使用,但是后续还有些值得优化的地方:
断言的地方,添加执行失败@伙伴通知功能
以配置文件形式去拼装执行转化路径和埋点上报页面,覆盖更多业务线。
接入jenkins,可视化修改配置文件和页面执行,让业务同学都能够快捷投入使用起来。
成果
目前通过数据分析,初版已实现效率约50%+提升,但是还只局限于APP首页上报的AB实验验证,取得初效如下表格分析,后续通过业务使用,会进行场景的添加以及脚本优化,同时支持IOS客户端。
写在最后
“工欲善其事必先利其器”,UI自动化是移动应用开发中重要的一环,实现过后我们不妨结合公司的业务去思考更多的落地场景,同时应用到测试工作中去提升效率以及赋能于其他伙伴,不再局限于核心流程的业务回归。
end