精准测试实践

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程​https://www.captainai.net/troubleshooter

一、背景

什么是精准测试?通常研发提测的需求有代码变更,针对研发的代码变更点以及关联点进行测试,我们称之为精准测试。

版本提测后,开发往往会说,影响范围比较大,做个主链路或者全量回归吧,我只改了几行代码,为什么要回归这么长时间?等等。

测试完成后,测试往往会说,测试保证测试用例全部执行到位,考虑不到的没办法。

代码改动后的影响范围评估,以及测试完成后的覆盖面评估是个难题,目前大部分是依靠个人经验和业务熟悉度判断大概的范围。

这种评估方式以主观判断为主,缺乏数据支撑,希望能有系统工具提供客观数据,基于数据进行量化评估。

产品迭代越来越多,代码改动会对产品已有功能产生影响,除了依赖 CI 的自动化测试,人工回归也必不可少,其成本和效率需要考虑。

为了保证质量,完美的回归测试是全流程覆盖,但是改动五分钟回归两小时,测试成本巨大,还会有很多无效测试。

理想的回归测试是覆盖修改的内容,用有限的操作发现全部的问题。

如果能建立代码与用例的映射关系,当代码发生改动时推荐出关联的用例,就能让测试更精准地回归,降低成本,提高效率。

用例和代码的双向追溯

精准测试提出了测试用例和代码的双向追溯,它也是精准测试核心技术之一。即运行一个测试用例后,精准测试可以通过程序自动的记录和显示这个测试用例执行的代码。

如果测试人员关注某一些代码行,它可以追溯出哪些测试用例在运行过程中运行过这段代码。通过这个技术特性,测试工程师的每个测试用例都可以进行量化分析和统计,这些量化数据既可以用来对测试工程师进行工作的考量,也可以提供开发人员和测试人员之间进行信息化的交流。

双向追溯技术记录了每个测试用例对应的程序内部的执行细节,细致到每个条件、分支、语句块的执行情况。开发人员可以通过双向追溯的结果去理解程序逻辑,进行软件维护以及进行可一致性的修改。开发和测试可以顺利交流,增加测试和开发的交流效率。

正向追溯:开发人员可以看到测试人员执行用例的代码细节,以方便进行缺陷的修复,测试数据可以直接为开发调试提供依据,快速定位并修复缺陷。

逆向追溯:测试人员通过修改的源代码快速确定测试用例的范围,极大减少回归测试的盲目性和工作量,快速修订测试用例,达到测试覆盖率最大化。

二、美团解决方案

正向追溯

正向追溯的核心是将测试用例和代码关联起来,建立用例代码库,这是推荐回归用例的基础,是重中之重。

将测试用例和代码关联起来的核心是动态调用链,要获取动态调用链就需要 Agent 注入应用,采集应用运行时数据。

人工维护,每个用例对应了哪个接口。

逆向追溯

利用ASM技术,分析字节码,从Controller入口开始,分析每个Controller的调用链。存储到数据库中。

代码覆盖率

以上的正向追溯和逆向追溯只解决了我们要测什么的问题,没有解决测的怎么样的问题。代码覆盖率就直观地回答了这个问题。

产研流程的改变

我们把业务流程全部抽象为算子的编排,所有的产研流程都是基于算子来做。

PM在做业务调研时,会先看其他模块的业务流程,来启发灵感,做需求设计。

研发在做技术方案评审时,都是以算子为最小粒度,本次需求要修改哪些算子,新增哪些算子,对哪些图的编排有调整。同时,每一个算子,都有一个完整的测试用例。

QA在做测试方案评审时,也是以算子为基本测试粒度,本次需求研发修改了哪些算子,这些算子影响了哪些图,QA要对所有被影响的图进行回归测试。

我们也遇到同样的问题,研发不愿意花时间梳理影响范围,导致每次QA都要全量回归。一方面浪费时间,一方面容易漏掉重点。

我们搞了一个影响范围自动生成的服务。

我们通过ASM解析字节码,能得到每一个算子的调用链,有了算子--方法的映射关系。

再通过解析DAG图,能得到每一张图调用的所有算子,有了图--算子的映射关系。

两者结合,能得到一张图,所有的调用链路,有了图--算子--方法的映射关系。

再利用代码diff能力,知道本次提交修改了哪些类的哪些方法。

根据图--算子--方法的映射关系,反向找出来,这次代码修改了哪些算子,影响了哪些图。

存在的问题

  • 静态字节码分析会分析出很多无用的调用链。
    类似get、set方法,只能通过手工加白名单的方式,来排除。
  • 静态字节码分析会出现断链的情况。
    1. 类似Spring的AOP,无法分析出来。
    2. 运行时确定类型的,无法分析出来。类似工厂方法。

    XXFactory.getInstance(param);

    class XXFactory{

        getInstance(param){

            if(param = xx){

               return new A;

            }

           if(param = yy){

               return new B;

            }

          }

    }

与我们的不同

我们不存在算子和Dag图的概念,所以不需要算子到图这一层的映射关系。直接从API入口开始分析,建立代码调用链映射即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值