分享实录 | 阿里巴巴测试环境管理实践概述

简介: 在软件研发过程中,“测试环境”是部署最频繁、也是开发者使用最频繁的一种运行环境,稳定而易用的测试环境能够极大提高开发者的工作效率和幸福感。为更好的将阿里巴巴在测试环境管理方面的实践和经验跟广大开发者分享,《云效说码》策划了《阿里巴巴Kubernetes测试环境开源工具箱》系列直播视频,由阿里巴巴技术专家林帆(金戟)和郑云龙(砧木) 来为大家讲述。

00-微信头图.jpg

【以下为分享实录,有删节】

测试环境管理之困

01.jpg

互联网产品的服务通常是由 Web 应用、中间件、数据库和许多后台业务程序组成,一套运行环境就是一个自成一体的小生态。部署软件产品的正式发布版本,为用户提供持续可靠的服务的环境为“正式环境”,而开发者用于日常的开发和验证的运行环境,就是我们说的“测试环境”,它是包含完成软件测试工作所必需的计算机硬件、软件、网络设备、历史数据的总称。

我们为什么要关注“测试环境”呢?因为测试环境出故障的几率非常高,大大影响软件研发的效率,这主要是由于由于频繁的版本变更,以及部署未经充分验证的代码等因素引起的。此外测试环境也是开发者使用最频繁的一种环境,数据表明,测试和联调任务通常占开发者日常工作时间的50%以上,稳定而易用的测试环境能够极大提高开发者的工作效率和幸福感。

理想的测试环境是怎样的?我们认为理想的测试环境需要做到以下几点:

一、本地直连,双向访问互通。开发者的大部分工作是在本地(自己的电脑)中完成的,然后通过测试环境验证所做的工作是否符合预期。如果“本地”和“测试环境”之间,不能够互通的话,开发者要验证自己开发的软件功能就会变得十分困难。

二、独占式随意使用,可重启,可调试,可断点。当团队有多名开发者进行多人并行开发的时候,如果共用一套测试环境就会出现相互干扰的情况。比如当我正在重启测试环境的时候,就可能影响到其它开发者的测试工作。因而理想的测试环境应该是“独占式”的,你使用你的环境,我使用我的环境,彼此不干扰。

三、多人随意组合协作,多服务联调不串流量。当多位开发者在同一个项目上进行合作的时候,开发者之间又是希望互通的。比如我的一个请求,希望调用对方本地的一个服务。同样对方也可以调用我本地的服务。同时,又希望非项目内的开发者的请求不要进来,即做到多服务联调不串流量。

四、多个依赖服务版本同时在线,想测哪个随时切换。当进行大版本更新的时候,我们可能既要测试新版本的兼容性,又要测试老版本的兼容性, 这就要求多个依赖服务版本同时在线,并且可以随时切换。

简单总结一下,理想的测试环境应该是:自由连接、随时可用、互访可控。

那么现实中的测试环境又是怎样的呢?所谓“理想很丰满,现实很骨感”,在一线工作的开发者可能会发现,真实的测试环境并非这么理想。

一、在中小企业,本地的开发机往往是不具有公网IP的机器,大多会使用内网IP地址,这样测试环境要回到本地环境时候是不通的。特别是在 在Kubernetes集群中,每个Pod都会被赋予一个Cluster IP,Cluster IP是一个在Kubernetes集群中特有的内网IP,我们在本地访问Cluster IP也是调不通的。这就造成了本地/集群双向均不通。

二、在中小企业,测试环境通常是共用的,这就会造成前文提到的相互干扰、调用和消息互串等问题。
三、如果开发者想独立拉起一套专用测试环境,不仅费时费力,而且资源成本也是难以招架的。

总之,现实中的测试环境:无法直连、稳定性差、流量混杂。

阿里巴巴的测试环境实践

以上提到的测试环境管理之困,总结一下主要有两点:一是本地和集群之间网络互通的问题;一个是多人协作开发时,路由的可访问性控制问题,比如谁和谁相连,谁和谁不相连,怎样做到相互间不干扰这些问题。

在阿里巴巴内部,我们主要通过两个机制来解决以上痛点:扁平的内网IP和项目环境。

扁平的内网IP主要是基于CNI(Conteinre Network Interface) 机制改造Kubernetes的IP逻辑实现的,可以使集群中的每个Pod分配到的IP与本地机器分配到IP处于一个大的网络环境下,这样就可以解决本地环境和集群之间互通的问题。但是这种方式实施起来比较复杂,而且通用性不高,因为每个企业内部的网络情况都不同,本次分享对这个方法不做详细的展开。

下面我们重点讲解“项目环境”。项目环境是基于RPC、消息中间件的虚拟环境,从表面上看,每个项目环境都是一套独立完整的测试环境,由一系列服务组成集群,而实际上,除了个别当前使用者想要测试的服务,其余服务都是通过路由系统和消息中间件虚拟出来的,指向公共基础环境的相应服务。

02.jpg

如上图所示,在某个开发项目中,我们有公共基础环境和三个独立的项目环境(项目环境)。服务A、服务B、服务C、服务D共同组成了完整的公共基础环境,在项目环境-2中只部署了“服务C”,但对于项目环境-2的使用者而言,他可以通过路由调用公共基础环境中的其它服务,因此他会认为项目环境-2就是一个完整的独立的测试环境。同样的道理,对于开发者而言,他们认为项目环境-1和项目环境-3也同样是完整的独立的测试环境。

我们创建一套“项目环境”肯定是比创建一套包含所有服务的测试环境的成本要低。本质上是基于消息路由的控制,实现集群中部分服务的复用。在这种机制下,许多外表庞大的独立测试环境实际只需要消耗极小的额外基础设施资源,即使给每个开发者配备一套专用的测试环境都是可行的。

03.jpg

为进一步提升测试效率,我们又捣鼓出一种开脑洞的玩法:将本地开发机加入项目环境。在阿里巴巴集团内部,由于开发机和测试环境都使用内网IP地址,稍加变通其实不难将特定的测试环境请求直接路由到开发机。这意味着,使用项目环境的开发者,在进行一项测试时,其服务调用链路上的服务,既可以来自公共基础环境,也可以来自项目环境,甚至来自本地环境。现在,调试集群中的服务变得非常简单,再也不用等待漫长的流水线构建,就像整个测试环境都运行在本地一样。

通过以上介绍的阿里巴巴关于测试环境的解决方案,能给开发者带来怎样的测试体验呢?

04.jpg

  • 开发者会觉得自己坐拥整个服务集群,所有测试服务IP地址都可以由本地直接访问,随时进行断点、单步调试、重新部署服务等操作,而丝毫不会影响到其他人;
  • 当多人协作研发软件时,每位开发者同一时刻只能属于同一个隔离域,同一个隔离域里面的服务相互可见,并且当出现服务调用的时候,会优先调用隔离域里面的服务。不同隔离域里面的服务相互之间不可见,是互不影响的;
  • 由于我们是通过“染色”(打标签)的方式实现的隔离,这种隔离方式非常的灵活,假如某位开发者前面在跟第一个项目进行联调,调试结束后,他想把该服务放入第二个项目中进行调试,他只需要把自己的服务从一个项目环境退出,进入另一个项目环境即可,实现灵活组队协作。

总结

我们将测试环境管理遇到的问题归纳为两个主要问题,第一个是本地与集群互通互联的问题。在阿里巴巴集团内部主要通过基于CNI机制改造Kubernetes的IP逻辑实现的“扁平化的内网IP”这个方法来解决,这种方式更适合大型集团企业。对外,我们也推出了一个更轻量的开发解决方案,主要通过kt-connect这个工具实现,kt-connect是开源免费的,由阿里云·云效提供技术支持,在下一节的分享中我们会详细介绍该工具的使用。

05.jpg

第二个问题,是关于路由的控制,在阿里巴巴内部我们是通过“项目环境”与“隔离域”实现的。对外我们也推出了一个开源解决方案,主要通过kt-connect和kt-virtual-environment这两个开源工具来实现,具体方案会在本系列分享的第三节内容中讲述。


【下期预告】

【直播日期】4月22日 16:00
【直播主题】单人开发场景下的测试环境实践
【直播讲师】郑云龙 阿里巴巴技术专家
【观看方式】云效开发者交流群直播(钉钉群号:群号:23362009)


【关于云效】

云效,企业级一站式DevOps平台,源于阿里巴巴先进的研发理念和工程实践,致力于成为数字企业的研发效能引擎!云效提供从“需求 ->开发->测试->发布->运维->运营”端到端的在线协同服务和研发工具,通过人工智能、云原生技术的应用助力开发者提升研发效能,持续交付有效价值。

相关文章
|
4天前
|
测试技术
软件测试的艺术:探索式测试的实践与思考
在软件开发的广阔海洋中,测试是确保航船稳健行驶的关键。本文将带你领略探索式测试的魅力,一种结合创造性思维和严格方法论的测试方式。我们将一起揭开探索式测试的神秘面纱,了解其核心概念、实施步骤和带来的效益。通过实际代码示例,你将学会如何将探索式测试融入日常的软件质量保证流程中,提升测试效率与质量。
|
11天前
|
敏捷开发 人工智能 Devops
探索自动化测试的高效策略与实践###
当今软件开发生命周期中,自动化测试已成为提升效率、保障质量的关键工具。本文深入剖析了自动化测试的核心价值,探讨了一系列高效策略,包括选择合适的自动化框架、设计可维护的测试脚本、集成持续集成/持续部署(CI/CD)流程,以及有效管理和维护测试用例库。通过具体案例分析,揭示了这些策略在实际应用中的成效,为软件测试人员提供了宝贵的经验分享和实践指导。 ###
|
10天前
|
机器学习/深度学习 人工智能 jenkins
软件测试中的自动化与持续集成实践
在快速迭代的软件开发过程中,自动化测试和持续集成(CI)是确保代码质量和加速产品上市的关键。本文探讨了自动化测试的重要性、常见的自动化测试工具以及如何将自动化测试整合到持续集成流程中,以提高软件测试的效率和可靠性。通过案例分析,展示了自动化测试和持续集成在实际项目中的应用效果,并提供了实施建议。
|
11天前
|
Java 测试技术 持续交付
探索自动化测试在软件开发中的关键作用与实践
在现代软件开发流程中,自动化测试已成为提升产品质量、加速交付速度的不可或缺的一环。本文深入探讨了自动化测试的重要性,分析了其在不同阶段的应用价值,并结合实际案例阐述了如何有效实施自动化测试策略,以期为读者提供一套可操作的实践指南。
|
1天前
|
机器学习/深度学习 人工智能 自然语言处理
智能化软件测试:AI驱动的自动化测试策略与实践####
本文深入探讨了人工智能(AI)在软件测试领域的创新应用,通过分析AI技术如何优化测试流程、提升测试效率及质量,阐述了智能化软件测试的核心价值。文章首先概述了传统软件测试面临的挑战,随后详细介绍了AI驱动的自动化测试工具与框架,包括自然语言处理(NLP)、机器学习(ML)算法在缺陷预测、测试用例生成及自动化回归测试中的应用实例。最后,文章展望了智能化软件测试的未来发展趋势,强调了持续学习与适应能力对于保持测试策略有效性的重要性。 ####
|
1天前
|
敏捷开发 前端开发 Java
软件测试中的自动化测试框架选择与实践
在当今软件开发生命周期中,自动化测试已成为提升软件质量和开发效率的关键手段。本文旨在探讨自动化测试框架的选择标准及其在实际项目中的应用实践。通过对主流自动化测试框架的分析比较,结合具体案例,本文将阐述如何根据项目需求和团队特点选择合适的自动化测试工具,并分享实施过程中的经验教训。
8 1
|
11天前
|
Web App开发 敏捷开发 测试技术
探索自动化测试的奥秘:从理论到实践
【10月更文挑战第39天】在软件质量保障的战场上,自动化测试是提升效率和准确性的利器。本文将深入浅出地介绍自动化测试的基本概念、必要性以及如何实施自动化测试。我们将通过一个实际案例,展示如何利用流行的自动化测试工具Selenium进行网页测试,并分享一些实用的技巧和最佳实践。无论你是新手还是有经验的测试工程师,这篇文章都将为你提供宝贵的知识,帮助你在自动化测试的道路上更进一步。
|
11天前
|
敏捷开发 Java 测试技术
探索自动化测试:从理论到实践
【10月更文挑战第39天】在软件开发的海洋中,自动化测试是一艘能够带领团队高效航行的船只。本文将作为你的航海图,指引你理解自动化测试的核心概念,并分享一段实际的代码旅程,让你领略自动化测试的魅力和力量。准备好了吗?让我们启航!
|
16天前
|
测试技术 API Android开发
探索软件测试中的自动化框架选择与实践####
本文深入探讨了软件测试领域内,面对众多自动化测试框架时,如何依据项目特性和团队需求做出明智选择,并分享了实践中的有效策略与技巧。不同于传统摘要的概述方式,本文将直接以一段实践指南的形式,简述在选择自动化测试框架时应考虑的核心要素及推荐路径,旨在为读者提供即时可用的参考。 ####
|
21天前
|
NoSQL 测试技术 Go
自动化测试在 Go 开源库中的应用与实践
本文介绍了 Go 语言的自动化测试及其在 `go mongox` 库中的实践。Go 语言通过 `testing` 库和 `go test` 命令提供了简洁高效的测试框架,支持单元测试、集成测试和基准测试。`go mongox` 库通过单元测试和集成测试确保与 MongoDB 交互的正确性和稳定性,使用 Docker Compose 快速搭建测试环境。文章还探讨了表驱动测试、覆盖率检查和 Mock 工具的使用,强调了自动化测试在开源库中的重要性。
下一篇
无影云桌面