测试环境稳定性治理

简介: 干货

前言

前几天在某个微信群里看到有同学在问测试环境治理的问题,正好我在之前的公司负责过相关的技术项目,在这方面有一定的实践经验,就解答了她的一些疑惑。


今天看书时候突然想到了这件事,发现这几年大家都在讲测试开发、测试效能、精准测试、敏捷测试、全链路压测等等很多高大上的技术实践和理念,但很少有人关注到测试环境稳定性的这种存在于我们日常工作中,困扰我们工作进度和心态的细节问题(至少对于测试同学来说)。


我并不是要表达上述的一些技术实践空泛或者什么(我自己本人就一直在写性能测试&全链路压测和稳定性保障相关的技术文章),但业内目前确实存在一些为了证明测试价值和在技术链上不被鄙视而刻意为之的炫技行为。目前能搜到或者说我个人看到的关于测试环境稳定性治理的文章,仅有阿里和滴滴在这方面的一些实践方法论(链接见下方)。


所以呢,这篇文章我不会去讲一些看起来很厉害的技术,而是和大家聊聊,我之前负责测试环境稳定性治理时候,面临的种种问题和痛点,我是如何梳理和分析,并尝试去解决这些问题的过程。附链接:

阿里巴巴线下环境稳定性治理

滴滴在测试环境上的探索和实践


项目背景和痛点

先交代下背景吧,这样能更好的理解做测试环境稳定性治理的出发点和治理方案为什么要如此设计。我会从业务需求和技术现状两个方面来说明当时技术团队面临的痛点。


业务需求

当时公司业务处在高速发展期,除了日常的版本迭代之外,同时可能还并行着好几个独立项目(其实就是需求排不进版本迭代,需求评审时候被PK掉了,又搞了一个独立项目的名义进行需求交付)。由于线上发布和灰度的时间节点各不相同,且每个独立项目和日常版本迭代涉及到的业务域以及背后的应用各不相同,有重叠又有新建的服务,因此每个项目都需要不同的测试环境来保证需求交付不受影响。


技术现状

聊完了业务需求背景,再来看看整个技术团队和体系当时面临的问题:

  1. 整体的需求研发测试交付体系是从Dev-Test-Pre-Pro四个阶段;

   Dev:即开发环境,一般由开发自己负责日常维护;

   Test:测试环境,也是本文的重点讨论对象,一般由测试维护;

   Pre:即预发环境或灰度环境,是线上正式发布的最后一个验证环节;

   Pro:我们所理解的生产环境&线上环境,所有外部的用户都可以访问;

  1. 测试环境有十几套,每套环境几乎都有独立的数据源,且表结构和数据各不相同;
  2. 所有应用都部署在阿里云上面,交易业务应用是ECS的虚拟机,社区业务应用是基于Isito的容器化;
  3. 有跨境和国际交易业务,是单独一个BU,但业务逻辑和应用调用关系上又强依赖国内的部分交易业务和应用;
  4. 微服务架构下各服务之间依赖关系复杂,但服务发布都是不同的测试负责,经常出现A测试同学测试过程中报错,结果是B同学在做服务发布。或测试过程发现异常,排查很久发现原因是做了DDL变更或者测试数据被使用了导致的各种问题;
  5. 需求越来越多,需要的测试环境越来越多,但搭建一套环境的成本太高,运维不愿意联调,测试不愿意验证,都想要现成可用的东西来完成各自的工单和任务;


面临的痛点

出于上面的业务需求和技术现状,对技术团队来说,最大的痛点有下面几点:

  1. 环境太多,云资源成本和日常维护成本太高;
  2. 发布流程太过随意,消息不及时同步导致出现各种异常;
  3. 需求太多导致大部分时间耗费在环境维护和异常问题排查方面;
  4. 需求多任务紧要求更多的测试验证和维护环境占用了大量人力和时间资源的矛盾;
  5. 多套数据源导致最终线上发布时DDL变更频繁,出现缺少字段或字段格式不正确等情况;
  6. 为了保证各自项目交付,各个项目Owner甚至开始出现“先上车后补票”抢占环境的操作;
  7. 研发和测试都有测试环境的变更权限,服务的发布和数据库的变更不受控制,“走心发布”随意而为;


上述描述的现状和痛点,当时导致了不少的线上故障,最终避无可避的,环境稳定性治理落到了测试的头上(这里不讨论应该运维负责环境稳定还是谁使用谁负责的话题)。


分析过程及治理规划

针对上述的种种问题和痛点,我用了一周的时间做调研分析和评估,最终落地了环境稳定性治理规划和方案。下面是我的分析评估和治理规划,仅供参考。


调研分析过程

通过调研和访谈以及我自己工作过程中发现的种种问题,我抽象总结出了几个共同点:

  1. 环境多成本高维护成本大;
  2. 造轮子和重复建设现象严重;
  3. 流程不规范且无人遵守默认的原则;
  4. 环境资源竞争日趋激烈,没有较好的协调机制;
  5. 沟通成本大,信息同步延时高甚至丢包现象严重;
  6. 环境问题发现定位排查手段原始,部分同学缺乏相关技能;


稳定性治理规划

调研分析出上述几点共性问题后,我输出了如下的稳定性治理规划:

项目名称

测试环境稳定性治理

项目目的

  1. 降低测试环境不稳定因素,提升环境可用SLA;
  2. 让测试同学有更充裕的时间做自己专业的事情;
  1. 快速交付稳定可用的测试环支撑业务的快速发展;

项目目标

短期目标:规范变更流程,降低维护成本,打通底层数据,变更权限收口;

长期目标:10分钟拉起一套新环境,半天内交付稳定可用的测试环境并验收通过;

项目时间节点

整体时间节点:2021年1月1日-2021年6月30日

阶段目标Deadline:

规范变更流程:2021年1月31日

降低维护成本:2021年2月28日

打通底层数据:2021年3月31日

变更权限收口:2021年4月30日

测试环境容器化:2021年5月31日

环境资源下线回收:2021年6月30日


落地过程的一些典型案例

测试环境稳定性治理在落地的过程中,做了很多的技术优化以及跨团队的协调沟通,每个阶段都会遇到很多挑战和问题。当然,解决问题的过程中,个人也学到了很多新的技能,和不同的角色沟通协调过程中也学会了从不同的维度和角色的角度上去思考解决问题。下面是六个不同阶段中,典型的治理案例和我个人的思考收获。


1-规范变更流程

这里的变更除了服务发布、参数配置的变更之外,还有测试环境的DDL变更。典型的案例有:

  • 服务发布没有限制:通过发布平台设置服务发布时间窗口,和各研发及测试团队协商沟通确认(降低任意发布带来的服务不可用);
  • 任何人任何时间都可以发布:每个应用或业务域应用合集指定服务owner,服务发布需要在发布平台经过owner二次确认才可以执行发布流程;
  • 信息不同步&沟通成本高:建立专项的服务发布信息同步群,某应用需要发布,自动艾特对应的owner进行通知确认(可设置免打扰,但带来的影响需要owner自己负责);

收获:很多时候,运维和DBA也是希望能规范发布和变更流程的(这样他们的工单和任务量会减少,能提效)。但如果业务方不配合,就很难推进。如果涉及到类似的事情,可以找运维和DBA负责人一起协调推动,团结相关的利益团体,反而能提高整体的进度和效果。


2-降低维护成本

  • 环境多维护成本高:收敛环境数量,将重复造轮子部分抽象成公用的部分,我当时采用的方案是搭建stable环境,抽取公用服务和基础设施,版本迭代和独立项目,只需要部署各自涉及的应用(这样也能避免不同项目遇到公共应用时,便于部署不同分支的代码);

image.png

Stable环境规划图(仅做示意,已脱敏)

  • 环境资源竞争激烈:版本迭代固定占用某个环境,独立项目根据提测时间和上线发布时间做资源协调。如果有同一天发布上线的,根据提测时间,各自拉取对应分支到同一个环境,后续的项目代码分支合并到最早提测的分支上进行测试(一方面降低了环境竞争的问题,另一方面测试资源和环境维护范围更集中);


3-打通底层数据

前面提到了多套测试环境多套数据源,这样会导致下面几点有趣的现象:

  • 多个测试环境的表结构变更,需要提多次DDL工单,DBA同学任务量大;
  • 假设测试过程中测试环境切换,变更就要重新进行,很容易遗漏或者变更有误;
  • 即使有专门测试数据预埋工具,但多环境多数据源会导致数据准备更耗时,加大复杂度;
  • 不同环境不同数据源,自动化回归的时,测试case和数据可能要进行适配,耗时费力;
  • 即使多个项目同时进行,但最终发布线上仅是一套环境和数据源,这样会导致频繁变更带来的线上风险概率;

针对这些现象,我是怎么做的呢?

首先,选择一个环境作为基准环境,所有的DDL变更都先变更到基准环境,然后自动变更到其他环境的数据源上;

其次,stable环境落地,环境发散现象会逐渐收敛,搭建维护变更成本降低后,反而有时间资源做专门的优化工作;

然后,变更权限和入口收敛,通过统一的工单系统进行,降低整体的变更混乱现象,所有变更有迹可循有记录可查;


4-变更权限收口

上面第三部分“打通底层数据”实际上已经介绍过变更权限收口了,这里我想分享的是之前做环境治理时候,和DBA负责人的一次聊天过程:

我:XX大佬,我要搞测试环境稳定性治理,希望减少随意的表结构变更和让底层数据保持一致,需要你的帮助;

DBA负责人:那可真是太好了,我一直想干这个事情,但我去推业务那边一直不搭理我,阻力很大。。。

我:那你看我们合作怎么样,我去和业务研发以及测试协调这个事情,你把底层的技术规范搞定?

DBA负责人:没问题,权限收口,表结构变更统一走工单,降低变更频次,规范数据库和SQL规范,我来搞定;

我:那行,你先准备相关的技术方案和规范,我们先挑一个环境试点,业务方我去沟通,好了我们就开始搞;

DBA负责人:可以,有啥需要我帮忙的尽管说,做这个事情对我们DBA也是个好事情。。。

分享上面这个对话过程,实际上要表达的是:很多时候我们工作中面临的痛点,也是其他人想解决的问题,寻求利益共同体,协作达成一件事,比孤军奋战更轻松,达成的效果也会更好。


5-测试环境容器化

谈到测试环境容器化,又是另一个故事了。

当时基础架构一直想推业务线接入容器,但一直很难推下去,理由也很正当:“业务迭代需求太多,没时间没资源接,而且稳定性也是要考虑的”。正好我在牵头做测试环境治理,希望能快速拉起环境和服务(ECS虚拟机部署服务太麻烦了,速度还慢),结果聊着聊着,一拍即合。我负责和业务方沟通,基础架构提供技术解决方案。

这里要补充说明下,不是我有多高的职位和权利,才能去和业务方沟通。而是测试环境的痛点已经影响到整个技术团队的需求迭代研发交付了,大家即使不太乐意,但这个问题不解决大家都很痛。


6-环境资源下线回收

按照整体的治理规划,完成上述步骤后,就可以开始做环境割接,即:

搭建好stable环境,测试环境以容器化搭建,给业务方交付一套可用的测试环境,就下线回收一套ECS的虚拟机环境。同时相关的权限收口以及变更管理规范,沟通协调机制在不断的落地和推进过程中,也能不断解决环境使用过程中的种种痛点。

当然,环境割接过程中,有几个点需要注意:

  1. 割接的时间节点需要和运维DBA以及业务方明确,不可随意下线;
  2. 环境割接不可一刀切,建议先关机,观察一周后再下线,避免遗漏的业务方有依赖而导致其他问题;
  3. 环境治理和技术改造方案,在开始前一定要做好调研,坚持推进,否则很容易被遇到的困难和组织架构变更导致项目流产;


7-其他优化手段

整个测试环境稳定性治理过程中,除了上述的一些案例和技术方案之外,还有下面的一些技术优化手段,比如:

  1. 服务不可用订阅通知;
  2. 服务发布通知功能上线;
  3. 环境不可用常见问题及解决方案培训分享;
  4. 成立专门的虚拟小组,每个域指定负责该域的测试owner;
  5. 整个各个业务线的自动化测试框架和方式,提供统一的技术方案;
  6. 测试环境接入日志监控告警,从服务层-DB层,监控告警做到自动化和透明化;
  7. 环境和服务不可用时长纳入故障SLA计量维度,定时复盘和分析,并不断落地改进;


总结回顾

环境治理是个很复杂和碎片化的技术项目,同时也是团队协调以及人的问题。我要向大家分享的内容总结如下:

核心:定义问题-提出规划-制定方案-争取资源-推动落地;

技巧:寻求利益共同体一起协作,主动向上寻求帮助,切忌单打独斗;

过程:流程规范-权限收口-降低block因素-基础技术设施建设-技术轮子整合-长期坚持演进;

目录
相关文章
|
7月前
|
IDE Java 测试技术
使用JUnit进行单元测试:提高Java Web应用的稳定性和可靠性
【4月更文挑战第3天】本文介绍了JUnit,一个广泛使用的Java单元测试框架,由Kent Beck和Erich Gamma创建。JUnit核心特性包括注解、断言、测试套件、测试监听器和异常测试。在Java Web应用中,单元测试主要针对模型层。使用JUnit测试涉及设置环境、编写测试类、标记测试方法及运行和分析结果。单元测试能提早发现问题、简化调试、保证代码质量、促进重构并作为实时文档。掌握JUnit对提升软件质量和效率至关重要。
136 0
|
1月前
|
运维 Prometheus 监控
如何在测试环境中保持操作系统、浏览器版本和服务器配置的稳定性和一致性?
如何在测试环境中保持操作系统、浏览器版本和服务器配置的稳定性和一致性?
|
2月前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
1月前
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
38 1
|
1月前
|
存储 监控 前端开发
如何确保测试脚本的稳定性和可靠性?
确保测试脚本的稳定性和可靠性是保证性能测试结果准确有效的关键
|
2月前
|
存储 监控 网络协议
服务器压力测试是一种评估系统在极端条件下的表现和稳定性的技术
【10月更文挑战第11天】服务器压力测试是一种评估系统在极端条件下的表现和稳定性的技术
150 32
|
3月前
|
测试技术 UED 开发者
软件测试的艺术:从代码审查到用户反馈的全景探索在软件开发的宇宙中,测试是那颗确保星系正常运转的暗物质。它或许不总是站在聚光灯下,但无疑是支撑整个系统稳定性与可靠性的基石。《软件测试的艺术:从代码审查到用户反馈的全景探索》一文,旨在揭开软件测试这一神秘面纱,通过深入浅出的方式,引领读者穿梭于测试的各个环节,从细微处着眼,至宏观视角俯瞰,全方位解析如何打造无懈可击的软件产品。
本文以“软件测试的艺术”为核心,创新性地将技术深度与通俗易懂的语言风格相结合,绘制了一幅从代码审查到用户反馈全过程的测试蓝图。不同于常规摘要的枯燥概述,这里更像是一段旅程的预告片,承诺带领读者经历一场从微观世界到宏观视野的探索之旅,揭示每一个测试环节背后的哲学与实践智慧,让即便是非专业人士也能领略到软件测试的魅力所在,并从中获取实用的启示。
|
6月前
|
负载均衡 Java 测试技术
性能测试与负载均衡:保证Java应用的稳定性
性能测试与负载均衡:保证Java应用的稳定性
|
6月前
|
监控 Shell 测试技术
一篇文章讲明白MonkeyAPP压力稳定性测试
一篇文章讲明白MonkeyAPP压力稳定性测试
420 1
|
6月前
|
JSON 测试技术 API
API接口测试指南:确保接口稳定性与可靠性的实践
API接口测试是确保软件产品质量的重要组成部分。通过遵循本指南中的测试步骤和最佳实践,开发者可以有效地验证API的功能、性能和安全性,从而提升软件的整体质量和用户满意度。