「单元测试产品体验样板间」是由蚂蚁集团技术风险团队&企业级应用设计团队联合举办,针对于单元测试产品发起的线下用户体验活动 ,旨在邀请相关领域的技术同学亲临现场互动交流,体验新产品,碰撞新想法!
单元测试产品体验样板间用户招募已开启,本次活动最终仅限30个线下体验名额,期待研发同学参加(具备Java开发能力、对单元测试场景有一定了解且有相关领域经验、对SaaS产品感兴趣或曾接触过相关软件),报名从即日开启,至11月18日截止,赶快到文末处报名抢占坑位吧!
单元测试旨在针对程序最小单位类、方法开展测试,充分的单测能更早发现代码BUG,降低问题的修复成本,是整个研发活动质量保障中重要的一环。而在企业内部,单测开发耗时多,运维成本高,极大影响全流程研发效能,如何提升单测用例的开发效率是亟待解决的难题,下面为大家分享下此次测试产品在测试用例自动生成领域的探索和蚂蚁企业内的大规模投产实践。
一. 用例自动生成的落地挑战
测试用例自动生成,在学术界也是热门研究方向,包括Fuzzing、符号执行等研究方向也在企业内有一定的尝新和实验,但是如何将学术成功引入工业化,实现企业级的大规模应用,仍然存在明显问题和挑战:
挑战1-高质量
高质量的用例效果是实现企业应用的前提,这里采用业内常规使用的两个指标进行度量:一是覆盖率,能在复杂业务逻辑的代码上均达到较高的覆盖率水平;二是有效性,一个合格的用例应包含对应的Assert,即对预期流程的断言校验,能自动识别程序逻辑问题。
挑战2-低运维
用例生成除了达成高效果的用例生成外,让用户能便捷上手,轻松维护产出的自动化用例,如简单的使用模式、可持续的用例管理、失败用例的排查效率等,也是产品化建设的要求。
挑战3-易整合
单元测试是整体质量保障中最基础的一环,而在CICD持续交付流程不断完善的今天,代码变更的越来越频繁,为实际发挥单测用例的质量保障能力,需要实现企业内的CICD能力进行整合,才能不改变研发流程外,进行可持续单测交付。
二. 产品落地方案
整体架构
为了能大规模投产使用单测产品,我们基于企业内部的研发特性,设计了一整套的全流程的用例生成、保鲜汰换、低成本运维管理的产品化能力,同时底层构建相应的平台化能力,屏蔽生成复杂度,提供给用户多场景快速便捷、持续运维支持,协同开发者提升单测质量防线的建设。
接下来我们针对落地方案进行进一步的详细说明。
用例生成技术
SmartUnit底层技术采用了动态多目标搜索作为主体算法框架,结合程序分析、符号执行等技术共同完成从0到1进行用例生成。
自动生成的用例可以在不借助人工的输入下,生成具有校验能力的可执行用例,同时我们也在探索进行语义数据结合,通过挖掘业务系统真实流量数据中蕴含的场景和规律,指导用例生成,提升用例代码可读性。
下面是一个经过语义数据输入后,用例可读性提升的案例:
- 下一是无语义输入的情况下,进行对象的简易模拟;
- 下二是通过真实业务流量数据输入后,生成的具有丰富业务语义的Mock对象,大大提升的代码的可读性。
无干预-运维成本降低
针对用例自动生成全流程管理,建立相关无干预能力,降低用例全生命周期的运维成本。
- 用例生成高稳定高吞吐
为提升稳定性和吞吐性能,构建了集群化的能力,来支持多应用生成、租户多场景、技术栈多匹配兼容,在执行层面实现编排任务流执行、并发执行和数据监控,实现企业级应用规模常态化用例自动生成。
- 用例汰换自动更新
对于难点的用例保鲜汰换,我们建立一套规范流程支持失败用例的精细化汰换、变更用例的及时补齐能力,基于自动更新的策略,封装了相关操作,实现回归老用例和变更新用例的及时保鲜。
- 用例失败排查定位
针对失败用例也开启了相应的定位排查能力,采取低优先级的人工规则降噪,并结合变更diff分析、异常堆栈时序、用例Trace等进行可疑频谱分析,实现了90%的用例降噪,极大降低对于失败用例的排查成本。
整合CICD-开发模式升级
测试用例的持续运维,是开发同学的一大痛点。在业务压力重、迭代频繁的情况下,我们也结合蚂蚁的DevOps流程,基于Pipeline组件,构建可持续运维能力,支持低人工进行用例的自动保鲜汰换。
全流程自动化降低了用户运维成本,用户仅关注用例执行报告推荐的失败用例,针对失败用例相关代码进行修复即可,提升整体研发效率。
三. 企业级落地效果
目前用例自动生成平台共接入应用1000+,用例生成任务共触发2W+次,共自动产出用例300W+,达到的覆盖率水平在60%左右,预估能降低60%UT研发成本。用例自动生成能力在蚂蚁集团、阿里集团十几个BU接入使用,同时,我们也不断打磨产品化能力,赋能开发者一起提升研发效能。
效果1-覆盖率提升
单测覆盖率偏低带来风险后移、排查成本上升问题。现在无需进行人工开发,直接使用用例自动生成平台能力,就可以实现单测覆盖率(平均行覆盖率)≥ 60%以上,部分系统更是达到了80%+。
以下是挑选14个系统行覆盖率比对情况:
- 历史存量手写用例的覆盖率,为橙色,平均覆盖率54%;
- 自动生成用例的覆盖率(绿色)补充至65%,与历史存量手写用例合并汇总覆盖率(蓝色)达到81%;经过自动生成的单测补充,覆盖率提升了25%+,提升效果显著。
效果2-问题发现
单测覆盖率的提升,本质上也是为了更好的发现问题。自动生成的用例,通过对应Assert断言来发现问题,如下是一个自动生成的用例样例,包含用例三要素Mock对象、方法调用,和核心的Assert校验。
而实际生成的Assert效果如何,基于了公司内部代码疫苗平台,评估目前单系统断言有效性达到60%+。
- 问题发现效果实战
在内部代码共创活动中,通过变更PR自动用例生成,针对用户提交的31个代码PR,其中67%的PR发现了问题,共发现34个问题。问题发现类型涵盖以下场景:
- 问题发现能力场景
自动生成的测试用例集中在2个场景下发现代码逻辑问题:一是回归测试,当代码进行变更时,回归执行发现逻辑差异;二是异常探测,针对新代码基于异常路径搜索,探测新代码中是否存在异常问题。目前两部分的能力已经在蚂蚁多团队使用,提前识别风险问题,协助开发者提升代码质量。
四. SaaS产品体验邀请
目前单元测试产品已在蚂蚁集团、阿里集团、外部金融机构等客户中使用,目前已接入 1000+ 大型业务系统。
在产品投入使用过程中,我们也收到外部用户对单测自动生成的使用诉求,因此我们将举办「单元测试产品体验样板间」线下产品体验活动,欢迎感兴趣的开发同学前来体验: