zoukankan      html  css  js  c++  java
  • 找靓机AppUI自动化测试延伸

    作者|邹德龙

    想法诞生

    基于找靓机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

    
    
  • 相关阅读:
    Laravel学习之旅(一)
    telnet模拟邮件发送
    学习CodeIgniter框架之旅(二)继承自定义类
    学习CodeIgniter框架之旅(一)自定义模板目录
    MySQL主从复制实现
    coreseek增量索引
    锁(MySQL篇)—之MyISAM表锁

    php文件锁
    进程与线程
  • 原文地址:https://www.cnblogs.com/finer/p/14811700.html
Copyright © 2011-2022 走看看