分享实录 | 单人开发场景下的测试环境实践

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

00微信头图.png

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

本系列分享共有三节内容,本文整理自砧木的第二次分享《单人开发场景下的测试环境实践》。

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

《阿里巴巴测试环境管理概述》要点回顾

在正式开始本次分享之前,我们首先回顾一下上一次分享中我的同事金戟分享的要点。在测试环境管理中,我们主要遇到两个问题,第一个是本地与集群双向互通的问题,在阿里巴巴集团内部主要通过基于CNI(Conteinre Network Interface)机制改造Kubernetes的IP逻辑实现的“扁平化的内网IP”这个方法来解决,这种方式更适合大型集团企业。第二个问题是多人协作开发时,路由的可访问性控制问题,在阿里巴巴内部我们是通过“项目环境”与“隔离域”实现的。

程序员小黑的困扰:测试环境不稳定导致集成效率低下

本次分享,我们将把视角从阿里巴巴集团内部转向外部开发者,特别是广大开发者所在的中小团队,聊聊他们如何解决前文中提到的“本地与集群双向互通”的问题。

我们先来思考一个问题:在本地开发的时候,有哪些让你感到痛苦的事情?

为了帮助大家更好回忆,我们假象了一位主人公——程序员小黑。小黑所在公司采用了微服务相关的技术实践,公司的平台根据业务情况被划分为多个“服务”,小黑所在团队负责的是其中单独一个业务领域。小黑团队会使用平台中的一些公共服务,同时他们也会为平台中的其它服务提供标准的API,方便其它服务调用数据。

为了降低整个平台的运维成本,小黑公司使用了阿里云提供的Kubernetes服务来搭建他们的测试环境及生产环境,通过云效提供的项目协作“看板”管理项目的需求及迭代进度。同时云效也提供了DevOps相关的能力支持,打通了从代码开发到软件发布上线的端到端的过程。小黑公司基于这套DevOps体系,不断的对产品进行迭代和优化。

相对于采用“DevOps”之前,小黑公司的研发效能已经得到极大提升,但近期小黑却遇到了一些困扰。他发现,由于测试环境不稳定,让他浪费了大量的时间在“集成”这件事情上。

其实,团队中的每位成员都希望尽快完成本地开发的功能的验证工作,目前情况下,小黑团队成员只能先将代码提交到代码仓库,然后通过流水线将代码部署到测试环境,因此“代码提交”会变得非常频繁,也就意味着在大部分时间里,你的测试环境会处于更新、发布状态中,整个测试环境的可用性就会变得非常差。甚至有的时候,因为个别成员在本地开发完成后,对代码没有进行充分验证就进行了测试提交,导致整个测试环境“挂掉”。有时因为有紧急的需求需要快速上线,测试环境会被这些紧急变更独占。小黑只能在测试环境可用的短暂的时间里尽可能地去验证自己开发的功能,这就导致小黑最近情绪很低落。

小黑的困扰一:联调其它服务。

其实小黑的需求很简单,他希望在本地代码开发完成之后,能够尽可能快的跟其它服务进行联调,来验证他开发的功能是否OK,但是现在他唯一能依赖的就是那套“公共环境”。

01.png

在本地完成代码开发后,如何高效的与其它服务进行联调呢?经过分析发现,在本地进行联调效率最高,使用公共环境进行测试成本最低,两全其美的办法就是,在本地直接访问云上集群的环境进行测试。对这个“命题作文”,开发者和企业有很多不同的选择,除了在第一次分享中我同事介绍的方法外,我们还推出了一个更轻量的方式通过KT-Connect工具实现。

02.png

KT-Connect是阿里巴巴云效团队研发的面向Kubernetes的本地开发者辅助工具(已经开源),通过“Connect”命令可以实现一键连接云上任意的Kubernetes集群。连接完成之后,可以快速建立本地到集群的VPN网络,同时将Kubernetes集群的DNS解析能力整合到本地,开发者可以像在集群中一样可以直接通过PodIP,ClusterIP以及DNS域名访问到集群内的服务。

小黑的困扰二:其它服务调用我

在这个案例中,小黑既是服务的消费者,同时也会提供一些公共的API供其它服务调用。这时只打通本地到集群的服务,并不能完全解决小黑的问题,必须同时让集群中的服务可以访问本地的服务。

03.png

KT-Connect同样可以帮助我们解决这个问题,这就需要使用“Exchange”和“Mesh”命令。
Exchange(交换)命令通过在集群内部署代理容器,替换集群内的原有应用,并将所有对代理容器的请求直接转发到本地端口。这是一种“完全替换”,这就意味着在同一时间点,只有一位开发者可以将他本地的服务加入到集群中。为了解决这个问题,KT-Connect提供了第三个命令——Mesh(混合)。当我们在本地运营“Mesh”命令后,我们同样会把本地服务加入到集群里面,但是会保持原有的目标服务状态不变,并且本地服务会继承目标服务中所有的标签。依照K8S本身服务发现的原理,请求流量会被随机地转发到原有服务或本地的服务。同时配合Istio的流量规则,就可以让所有正常流量依然保持对原应用的访问,而只对一些有特殊标记的的请求转发到本地。从而可以实现在一套公用测试环境的基础上各自独立的完成本地的集成联调。

KT-Connect带来高效的测试体验

04.png

如前文所述,通过KT-Connect我们可以实现从本地到集群的双向互通。在团队里,其实还有很多“小黑”,我们可以看到这样一个场景:小黑A可以通过“Mesh”命令把本地服务加入到测试环境里,并且可以让集群中一部分特定的流量转发到本地,这样他可以与集群中的其它服务进行联调。小黑B通过“Connect”命令连接到集群,直接在本地进行测试。在某些情况下,小黑B需要依赖的服务刚好是小黑A正在开发的版本,小黑B只要按照Istio的流量规则设置可以调用小黑A服务的值,就可以跟小黑A的服务进行联调。对于小黑C,他既需要调用集群中的服务,又需要集群中的服务回调到本地,所以他在本地既运营了 “Connect”又运行了“Mesh”。如上所示,小黑团队中的所有成员的测试活动都是建立在一套公共环境的基础之上,但是彼此又都有一个相对独立的测试环境,具有很好的可用性。

KT-Connect背后的原理

KT-Connect背后有什么黑科技吗?答案是:没有。我们只是综合利用了两个大家在日常工作中都会用到的能力,通过Kubectl的端口转发可以实现将集群中服务的端口映射到本地,通过SSH协议建立本地与集群之间的隧道。
05.png

以“Connect”命令为例,了解一下KT-Connect背后的原理。如上图所示,当开发者在本地运行“Connect”命令后,首先会创建一个shadow pod实例,这个实例会运行“SSH Server”和“DNS Server”,当实例创建成功之后,就可以通过“port-forward”将代理容器的22端口转映射到本地,如2222端口。此时,就可以通过本地的2222端口建立与集群内部的连接。

06.png

“Exchange”和与“Connect”命令背后的原理类似,我们也会先创建一个代理容器,并通过“port-forward”将代理容器的端口映射到本地。然后根据Exchange的目标服务,判断将代理容器的哪一个端口的请求全部转发到本地的特定端口。

“Mesh”与“Exchange”的最大的差异在于“Exhange”会将原应用的Replicas(副本)直接降到0,会将集群内所有对原应用的流量全部转发到本地。而 “Mesh”则是在保持原有应用Pod不变的前提下,创建一个新的代理容器并且继承原应用的所有标签,并会增加一个随机的version标签。配合Istio的流量规则,可以让所有正常流量依然保持对原应用的访问,而只对一些有特殊标记的的请求转发到本地。从而可以实现在一套公用测试环境的基础上各自独立的完成本地的集成联调。

最后用《持续交付》中的一句话来总结今天的分享:集成通常是一个非常痛苦的过程。那么就应该在每次提交代码后就进行集成,而且应该从项目一开始就这么做。其实句话还可以做一个调整,我们提倡在代码提交之“前”就进行验证。

非常感谢大家的聆听,欢迎大家加入云效开发者交流群和KT-Connect工具用户群与我们交流。


【下期预告】

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


【关于云效】

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

相关文章
|
23天前
|
数据采集 监控 机器人
浅谈网页端IM技术及相关测试方法实践(包括WebSocket性能测试)
最开始转转的客服系统体系如IM、工单以及机器人等都是使用第三方的产品。但第三方产品对于转转的业务,以及客服的效率等都产生了诸多限制,所以我们决定自研替换第三方系统。下面主要分享一下网页端IM技术及相关测试方法,我们先从了解IM系统和WebSocket开始。
41 4
|
25天前
|
人工智能 JavaScript 前端开发
自动化测试框架的演进与实践###
本文深入探讨了自动化测试框架从诞生至今的发展历程,重点分析了当前主流框架的优势与局限性,并结合实际案例,阐述了如何根据项目需求选择合适的自动化测试策略。文章还展望了未来自动化测试领域的技术趋势,为读者提供了宝贵的实践经验和前瞻性思考。 ###
|
5天前
|
IDE 测试技术 开发工具
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南
在Python开发中,调试是提升效率的关键技能。本文总结了10个实用的调试方法,涵盖内置调试器pdb、breakpoint()函数、断言机制、logging模块、列表推导式优化、IPython调试、警告机制、IDE调试工具、inspect模块和单元测试框架的应用。通过这些技巧,开发者可以更高效地定位和解决问题,提高代码质量。
72 8
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南
|
23天前
|
测试技术 Python
探索软件测试的深度与广度:从理论到实践
在数字化时代,软件已成为我们生活中不可或缺的一部分。随着技术的不断进步和用户需求的多样化,确保软件质量变得尤为重要。本文将深入浅出地介绍软件测试的核心概念、类型及其在软件开发生命周期中的重要性。我们将通过实际案例,展示如何实施有效的测试策略,并探讨自动化测试的未来趋势,旨在为读者提供一套完整的软件测试知识体系,帮助提升软件质量和开发效率。
|
24天前
|
测试技术 Python
探索软件测试的奥秘:从理论到实践
在软件开发的宇宙中,软件测试犹如一颗璀璨的星辰,指引着质量的方向。本文将带你穿梭于软件测试的理论与实践之间,揭示其内在的逻辑和魅力。从测试的重要性出发,我们将探讨不同类型的测试方法,并通过实际案例分析,深入理解测试用例的设计和应用。最后,我们将通过一个代码示例,展示如何将理论知识转化为实际操作,确保软件质量的同时,也提升你的测试技能。让我们一起踏上这段探索之旅,发现软件测试的无限可能。
|
27天前
|
jenkins 测试技术 持续交付
自动化测试框架的搭建与实践
在软件开发领域,自动化测试是提升开发效率、确保软件质量的关键手段。本文将引导读者理解自动化测试的重要性,并介绍如何搭建一个基本的自动化测试框架。通过具体示例和步骤,我们将探索如何有效实施自动化测试策略,以实现软件开发流程的优化。
55 7
|
26天前
|
测试技术
探索软件测试的奥秘:从理论到实践
本文深入探讨了软件测试的基本概念、重要性、主要类型以及实施策略。通过分析不同测试阶段和相应的测试方法,文章旨在为读者提供一套完整的软件测试知识体系,帮助他们更好地理解和应用测试技术,确保软件产品的质量和可靠性。
51 4
|
28天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
62 1
|
29天前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
46 2
|
22天前
|
监控 搜索推荐 测试技术
电商API的测试与用途:深度解析与实践
在电子商务蓬勃发展的今天,电商API成为连接电商平台、商家、消费者和第三方开发者的重要桥梁。本文深入探讨了电商API的核心功能,包括订单管理、商品管理、用户管理、支付管理和物流管理,并介绍了有效的测试技巧,如理解API文档、设计测试用例、搭建测试环境、自动化测试、压力测试、安全性测试等。文章还详细阐述了电商API的多样化用途,如商品信息获取、订单管理自动化、用户数据管理、库存同步、物流跟踪、支付处理、促销活动管理、评价管理、数据报告和分析、扩展平台功能及跨境电商等,旨在为开发者和电商平台提供有益的参考。
28 0