阿里巴巴CI:CD之分层自动化实践之路

本文涉及的产品
云效 DevOps 流水线,基础版人数 不受限
云效 DevOps 测试管理,基础版人数 不受限
云效 DevOps 代码管理,基础版人数 不受限
简介: 6月29日,在首届阿里巴巴研发效能嘉年华上,阿里巴巴高级产品经理金桐带来“分层自动化实践之路”的演讲。本文从为什么要做自动化开始谈起,进而对分层自动化单元测试、业务服务层测试和UI测试进行优劣势分析,最后重点分享了阿里分层自动化的实践,包括工具分层和流程优化等。
6月29日,由阿里云研发协同RDC、阿里云云效和云栖社区联合举办的“首届阿里巴巴研发效能嘉年华”上,阿里巴巴高级产品经理金桐带来“分层自动化实践之路”的演讲。本文从为什么要做自动化开始谈起,进而对分层自动化单元测试、业务服务层测试和UI测试进行优劣势分析,最后重点分享了阿里分层自动化的实践,包括工具分层和流程优化等。

 

直播视频请点击

随着云计算、大数据、AI智能等前沿科技的发展,传统的研发速度越来越难满足企业快速发展的需求,研发效能也成了继商业模式、技术突破之后的另一核心竞争力。分层自动化测试倡导的就是将系统分层,不同层次需要用合适的自动化方法进行测试的一种测试策略。本文从大家熟知的单元测试、业务服务层的测试及UI自动化测试,进行优势和劣势的分析,同时从执行速度、维护成本、测试方法、完成优先级、覆盖范围及实施团队等多个维度,为大家提供一套分层自动化实施解决方案,最后重点分享了阿里分层自动化的实践,包括工具分层和流程优化等。一起来了解下吧:

 

自动化

为什么要做自动化?

手工测试效率低下,发布频繁,回归量大、成本高,重复劳动很枯燥。自动化测试,就是用机器执行替代测试手工操作的一种测试方法,能够帮助测试人员从重复、枯燥的手工测试中解放出来,从而节省人力、时间或硬件资源。

节约劳力为(N-1)M,M为此项工作单次需要投入的资源,N为此项工作需要重复工作的次数。

自动化的烦恼

如果自动化这么好,为什么大家没有全部做自动化呢?特别是对于初创公司,自动化测试非常少,原因大致如图。

d192cbea7e371c0622168e01a8a7ca7cc8cd836d

上图不难看出,阿里该部门这一周的自动化失败次数不仅没有与发现bug数成正比,还浪费了测试人员41次自动化失败的排查时间,而这些时间对于做自动化查bug的初衷,都是无意义之举。

为什么外部环境、业务变更、应用环境问题、执行机问题、数据问题、框架问题这些都能引起这么多失败呢?而单单真正查出bug的概率这么低呢?

结合我们的多年自动化实践与总结,自动化存在如下图这些缺点:

b18be5b53787b1b2e25c621fe8cd6f842d07bb0b

总结来看,自动化的烦恼包括以下四方面:

成本高:

人员成本高:基本要懂某种自动化框架的代码语言,要有一定的编码能力,同时代码逻辑要清晰,否则如何能保证合理性、逻辑性、业务性与健壮性这些大大影响自动化成功率的因素?如何能保证自动化测试脚本本身没有bug?

环境成本高:开发环境、运行环境、调度环境等等,接触过代码的同学都知道,一次环境的安装,没有大半天甚至一天是完不成的。同时要让自动化对接到项目自动化流程中,或定时监控等,还需要再开发调度平台,这些成本对于从0到有的测试组,甚至是一家公司,将会是多大?需要投入多少人日的工作量可以完成这些?

效果差:

从图1分析就知道效果如何,然而图1还只是阿里某部门单周的一个采样,就已经浪费了41次排查时间,这样的自动化测试,若运行一年,那效果又会如何?能确保后面没有这些干扰的失败吗?失败次数可以和bug数成正比吗?

覆盖率低:

经常有同学抱怨自动化的覆盖率低,很多分支和逻辑无法覆盖,这大部分原因是这些同学的理解偏差,很多人都将UI自动化作为自动化测试的全部。然而没有一种自动化测试框架可以覆盖一个系统的所有功能点的测试,所以出现自动化覆盖率低的观点。那该如何提高自动化的覆盖率呢?

及时性:

其实从图1中的10次业务变更引起的自动化失败,就是这一缺点的佐证。所谓业务变更,是指正常的项目变更,但脚本未及时更新引起的自动化失败。这种失败恰恰又证明自动化测试是有用的,只要测试覆盖到的内容,一旦有变,自动化就能测试出来。那如何提高我们的脚本及时性呢?

自动化的追求

730d5277a3e0a34c2a2e040c5ae2d75576921f26

面对上述那些问题,我们不禁自问:做自动化测试真的有必要吗?如果有必要,那如何降低这些成本,如何提高测试效果呢?经过不断的实践,我们引入了分层自动化测试的策略。

 

分层自动化

8f2a67cd7dbe44b4a7850f1325ac4dfe8dbe5c5d

提到分层自动化,就会想到自动化经典的金字塔,第一层UI层针对页面系统,第二层服务层针对于业务集成,最后底层单元测试针对底层服务等。

分层自动化的特点比较如下:

  • Unit(单元/底层服务):

它可以通过mock框架,模拟各种异常场景,外部依赖最少,且可以做到测试粒度到最小的一种测试方法。也因为依赖少,可方便随时随地执行,也让问题排查很简单。这是一切测试的地基。优点是可到最小可测单元、其功能明确,特定条件、特定场景均可测,测试性价比很高,缺点是基本依赖开发同学去做,开源工具多、测试代码多,要想全覆盖,需要投入较多时间;

  • Service(接口/集成服务):

它是单元组装、功能组装、条件组装、场景组装的集合,要求测试人员对系统的结构和系统间的调度非常清楚,同时要了解接口逻辑关系,否则接口测试代码很容易遗漏一些异常场景。因此,我们需要测试人员的场景设计、构造测试数据、应用环境部署、同时也依赖接口单元的质量。同时,这一层由于含有一些业务逻辑和多接口的一个集成,所以相对单元测试来说,多了一些外界依赖,导致问题定位不会有单元测试层那么准确。因此,维护和问题排查上的投入会比单元测试多一些。

  • UI(系统/页面):

它是最常见的黑盒自动化测试场景,能覆盖的场景全面、条件全面、环境全面,最接近用户。但也因为测试范围全面,对测试人员、自动化脚本的健壮性等要求也会相对全面,需要考量场景设计能力、全面测试能力、框架选型成功、相关环境部署、业务逻辑清晰、功能测试边界、依赖底层质量。因此,只要有一环薄弱,就会大大增加自动化的失败率,而排查成本也因为环境太多太复杂而成倍增加。

以上就是分层自动化的主体三层,由此可见,分层自动化测试倡导的就是,将系统分层,根据层次特点用合适的自动化方法进行测试的一种测试策略。某个项目如何用自动化覆盖,根据项目技术特点与项目属性,设定合理的自动化测试补充与整个产品的自动化测试保障体系的结合保障。

fed22af88a5982a563511e5cf72e6368554f6620

除了分层方法与建议外,还有分层投入比,究竟花了多少时间作单测、多少时间作接口和UI?我们清楚知道,根据(N-1)M的劳力节约公式,不是所有项目都需要做自动化测试,主干核心、业务稳定、项目周期长和重复工作多的项目是需要做项目自动化测试的,图中展示了Google产品分层自动化投入比,它是比较完美的,当我们底层建设很完善的时候,上层建筑的确可以花费较少时间,维护成本也会相对降低。我们目前达不到,但可向这个比例去发展。

 

阿里分层自动化的实践

阿里巴巴分层自动化在经过策略的沉淀调整后,又经历了长期的工具与流程实践,并从自动化成本和效果这两个重要缺点上突破,进行分层自动化工具和项目流程的双重革命,最终达到业内领先的研发测试比。

首先,分层自动化工具革命

自动化测试框架,无论UI,接口还是单元,外部开源框架、收费软件等很多,各有利弊。阿里测试综合多种框架的实践,对其进行改良与创新,突破了传统自动化框架的众多难题,大大降低了自动化的成本、提升了自动化效果。如下图所示的四款重要工具,AUI主攻UI自动化,SAT主攻接口自动化,Amon主攻单元测试,以及Perf主攻性能,在传统测试框架基础的弱点上进行全面攻克与改造,最终实现鸟枪换大炮,全面提升测试工作效率。

4b1c961d0b18900ddf7d222e921441929adfe3be

1792420da37f13f65bef4b1591d96359373f5942

  • UI自动化—AUI:

4e9cfbc4f50df23867a3a2bfa192b84f2b6b369f

  • 接口自动化—SAT:

d74df6c542a4e3c1a873fa7e47559eb6600d0f71

  • 单测—Amon:

39ef89471276e798bf2bf4038735b4e2ce8edcf3

不仅如此,阿里云效还从需求-开发-测试-发布整个项目流程中可工具化、平台化的手工工作,全面进行工具化、平台化的改造,如图所示。

9ba07736b25788fd2a2dc6b7e050ae588d53cc5f

开发环节:从拉分支开始,到自测的部署环境与单元测试,全部平台工具化。一键拉分支、一键部署、一键触发单测集成,不到喝杯咖啡的时间,即可查看环境部署结果和findbugs、PMD、Sonar等代码扫描结果。

测试环节:手工测试中有用例和缺陷两款主打产品,平台沉淀,无需再做一些文件传输,加上前面介绍的分层自动化相关测试平台与工具,在自动化测试工作上的效率提升,最终实现整体测试工作的平台与工具化。

其次,项目流程革命

除了单个工具的成本减少与效果提升,云效还优化了项目流程。如下图是我们常见的项目流程,其中自动化测试工作经常只有单一自动化测试框架进行测试。

ffb3336f73c50dd2631018acb2271990fc39b95e

这样的流程,经过长期实践发现,研发测试比最多提升到3:1,是否还有改进空间呢?

我们再看这些流程,可以看到测试工作,尤其是自动化测试工作,独立于开发项目流程。这种流程带来最直接的问题就是自动化发现问题不及时,对于开发自测项目也没有很好的介入保障,同时全手工触发,人为因素影响非常大,这是限制开发测试比大幅提升的重要原因。

假设我们的项目在合理运用分层自动化的测试策略后,并将其触发-问题排查-结果反馈都平台化地纳入到整个需求-开发-测试-发布这个项目流程中,会产生什么样的效果呢?

78889e73b6abef00d61a95f4f19a7a8a878aa0ba

图为阿里项目分层自动化持续集成完整示意图,我们多了集成自动化平台,该平台可以把分层自动化工具串联在一起,去做整个持续集成、持续交付操作,让工具具备了平台能力。不仅如此,我们还将分层自动化测试纳入到了拟发布流程中,开发同学提交环境部署后,会自动提交自动化测试,不需要测试同学介入,如果失败了才会通知测试人员排查,完全做到了CI/CD的理想效果。

bbbb45903b088de9aab3997d6546833436457eff

项目集成可以使用,那么日常的产品回归也可以用,图为阿里产品分层自动化持续集成完整示意图,集成自动化给日常回归产品做了赋能,将分层自动化工具平台和集成自动化串联,去保证日常产品质量的回归。

通过流程优化,在各个方面都得到了很大益处:

  • 阿里内部:大幅提高研发测试比,减少重复劳动带来的加班,更多高效工具的诞生
  • 研发:单测成本降低,覆盖率可视化,自测有保障,故障降低
  • 测试:测试要求降低,重复工作减少,增加工作成就感,各种工具诞生
  • 云效客户:企业快速赋能,提高研发测试效率,快速掌握阿里内部高效测试流程

使用这套体系,B2B研发测试配比达到了8:1,部分产品线13:1,却全年无故障。

相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
SVN版本控制系统
SVN是现在软件开发之中的主流软件版本控制工具,在工作之中利用SVN可以有效的解决多人开发的代码管理问题,本课程将为读者讲解SVN服务器的配置以及基于MyEclipse的SVN客户端插件的配置与使用,并且在讲解之中着重讲解了冲突的产生于解决。
相关文章
|
10天前
|
运维 监控 Devops
DevOps实践:自动化部署与持续集成的融合之旅
【10月更文挑战第7天】在软件开发领域,DevOps已成为一种文化和实践,它倡导开发(Dev)与运维(Ops)之间的协作与整合。本文将引导读者了解如何通过自动化部署和持续集成(CI)的实践来提升软件交付的速度和质量。我们将探讨一些实用的工具和技术,以及它们是如何帮助团队高效地管理代码变更、测试和部署的。文章将不包含代码示例,但会详细解释概念和流程,确保内容的通俗易懂和条理性。
114 62
|
10天前
|
运维 监控 Devops
DevOps实践:持续集成与部署的自动化之旅
【10月更文挑战第7天】在软件开发领域,DevOps已成为提升效率、加速交付和确保质量的关键策略。本文将深入探讨如何通过实施持续集成(CI)和持续部署(CD)来自动化开发流程,从而优化运维工作。我们将从基础概念入手,逐步过渡到实际操作,包括工具选择、流程设计以及监控和反馈机制的建立。最终,我们不仅会展示如何实现这一自动化流程,还会讨论如何克服常见的挑战,以确保成功实施。
50 9
|
6天前
|
缓存 监控 数据可视化
利用GitLab CI/CD自动化您的软件开发流程
【10月更文挑战第10天】GitLab CI/CD 是 GitLab 内置的持续集成和持续部署工具,通过编写 .gitlab-ci.yml 文件,可以自动化构建、测试和部署应用程序的过程。本文介绍 GitLab CI/CD 的核心优势、实施步骤及在现代开发中的应用,帮助您提高开发效率和软件质量。
|
8天前
|
运维 监控 测试技术
构建高效运维体系:从监控到自动化的实践之路
【10月更文挑战第9天】 在当今信息技术飞速发展的时代,运维作为保障系统稳定性与效率的关键角色,正面临前所未有的挑战。本文将探讨如何通过构建一个高效的运维体系来应对这些挑战,包括监控系统的搭建、自动化工具的应用以及故障应急处理机制的制定。我们将结合具体案例,分析这些措施如何帮助提升系统的可靠性和运维团队的工作效率。
25 1
|
10天前
|
存储 运维 监控
高效运维管理:从基础架构优化到自动化实践
在当今数字化时代,高效运维管理已成为企业IT部门的重要任务。本文将探讨如何通过基础架构优化和自动化实践来提升运维效率,确保系统的稳定性和可靠性。我们将从服务器选型、存储优化、网络配置等方面入手,逐步引导读者了解运维管理的核心内容。同时,我们还将介绍自动化工具的使用,帮助运维人员提高工作效率,降低人为错误的发生。通过本文的学习,您将掌握高效运维管理的关键技巧,为企业的发展提供有力支持。
|
12天前
|
Web App开发 设计模式 测试技术
自动化测试框架的搭建与实践
【10月更文挑战第5天】本文将引导你理解自动化测试框架的重要性,并通过实际操作案例,展示如何从零开始搭建一个自动化测试框架。文章不仅涵盖理论,还提供具体的代码示例和操作步骤,确保读者能够获得实用技能,提升软件质量保障的效率和效果。
|
6天前
|
Web App开发 Java 测试技术
一、自动化:web自动化。Selenium 入门指南:从安装到实践
一、自动化:web自动化。Selenium 入门指南:从安装到实践
15 0
|
19天前
|
机器学习/深度学习 人工智能 运维
构建高效运维体系:从自动化到智能化的演进
本文探讨了如何通过自动化和智能化手段,提升IT运维效率与质量。首先介绍了自动化在简化操作、减少错误中的作用;然后阐述了智能化技术如AI在预测故障、优化资源中的应用;最后讨论了如何构建一个既自动化又智能的运维体系,以实现高效、稳定和安全的IT环境。
46 4
|
10天前
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
32 4
|
10天前
|
运维 jenkins 持续交付
自动化部署的魅力:如何用Jenkins和Docker简化运维工作
【10月更文挑战第7天】在现代软件开发周期中,快速且高效的部署是至关重要的。本文将引导你理解如何使用Jenkins和Docker实现自动化部署,从而简化运维流程。我们将从基础概念开始,逐步深入到实战操作,让你轻松掌握这一强大的工具组合。通过这篇文章,你将学会如何利用这些工具来提升你的工作效率,并减少人为错误的可能性。