代码改变世界

找靓机AppUI自动化测试延伸

2021-04-27 09:10  zouhui  阅读(158)  评论(0编辑  收藏  举报

作者|邹德龙

想法诞生

基于找靓机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通过企业微信机器人推送:

后续改进

初版本虽然已经实现可以使用,但是后续还有些值得优化的地方:

  1. 断言的地方,添加执行失败@伙伴通知功能

  2. 以配置文件形式去拼装执行转化路径和埋点上报页面,覆盖更多业务线。

  3. 接入jenkins,可视化修改配置文件和页面执行,让业务同学都能够快捷投入使用起来。

成果

目前通过数据分析,初版已实现效率约50%+提升,但是还只局限于APP首页上报的AB实验验证,取得初效如下表格分析,后续通过业务使用,会进行场景的添加以及脚本优化,同时支持IOS客户端。

写在最后 

“工欲善其事必先利其器”,UI自动化是移动应用开发中重要的一环,实现过后我们不妨结合公司的业务去思考更多的落地场景,同时应用到测试工作中去提升效率以及赋能于其他伙伴,不再局限于核心流程的业务回归。

end