这篇文章想要讲的,的确是两件事情:
- 为什么测试环境的不稳定是必然的,怎么让它尽量稳定一点?
- 为什么测试环境比生产环境更复杂,怎么让它尽量简单一点?
此外,还会谈一谈对测试环境和生产环境的区别的理解。
这里是本文的主要观点:
- 测试环境与生产环境是两个不同的场景,测试环境的不稳定是必然的,在没有实现TiP(Test in Production)之前,当前我们能做的是尽量让它稳定一点;
- 测试环境比生产环境更为复杂,最核心的是要解决共振问题,即做好隔离能力,Mesh 是解决隔离问题的一个未来方向;
在 DevOps 领域,测试环境其实是介于 Dev 和 Ops 中间重叠的部分,一提到测试环境,打开就会说测试环境不够用、测试环境不稳定,尤其是在微服务化了之后,对测试环境的诉求与挑战也愈发明显。
从软件研发过程的角度来说(如上图),从左往右呈现一个漏斗模型,随着研发的阶段推进,复杂度和稳定性都在逐步收敛:
- 在开发和集成阶段,代码等变更是非常频繁的,在这个阶段里研发人员在不断的迭代、联调、验证等,从本质上来说,高复杂度和低稳定性是必然的,对于依赖的中间件等基础设施的不稳定,这是偶然的;
- 到了预发、灰度和发布阶段,变更已经趋于稳定,经过了前面阶段的洗礼,复杂度是相对低的,稳定性也能得到保证;
另一方面,如上图所示,生产环境只有一套,链路和应用间的调用关系比较清晰,但在测试环境中,因为涉及到多个项目的自测、联调、验证等,相当于千军万马过独木桥,很容易产生共振效应,影响所有人的研发,在这方面来讲,测试环境比生产环境要复杂很多,亟需解决隔离、低成本以及稳定的依赖这几个重要的问题。
测试环境不稳定的必然性
测试环境和生产环境的区别是什么?有的人说线下的容量没有线上大,有的人说线下没有真实用户,有的人说线下缺少生产的真实数据,等等,各种答案都有。在我看来,测试环境和生产环境的本质区别是:它们是两个不同的场景。对于生产环境,准确与稳定性最重要;对于测试环境,隔离、低成本和稳定的依赖最重要。
在日常的研发中,会面临诸多场景,涉及的测试环境总结如下:
- 开发环境(dev):开发或测试同学自己的电脑或服务器,非 Aone 管理的应用服务器
- 项目环境(project):关联到某个变更的环境,仅部署该变更对应的分支
- 单应用测试
- 多应用联调
- 性能测试:对该变更对应的分支做性能测试
- 日常集成环境(daily):我们最熟悉的 daily 环境&