1.5.2隔离
隔离指不同的测试活动(包括不同的测试运行批次)之间要尽量做到不相互影响。在有些团队里,自动化的功能回归测试和其他日常测试(例如探索性测试)都在同一个测试环境里进行,相互干扰非常大。
相比“三斧子半”里的其他几个(高频、用完即抛、不自动重跑),隔离的重要性是比较容易理解并被广为接受的。隔离的好处有如下两点。
减少噪声:减少多个测试批次运行时彼此影响导致的用例失败。
提高效率:会产生全局性影响的测试,可以在多个隔离的环境里并发执行。
测试隔离的具体策略要根据技术栈、架构、业务形态来具体分析,选择最合适的技术方案。测试隔离一般可以分为硬隔离和软隔离两种。硬隔离和软隔离之间并没有一个清晰的界限:硬隔离偏属物理层,一般通过多实例实现,例如,消息队列和数据库的多个物理实例;软隔离偏属逻辑层,一般通过多租户(Multi-tenancy)和路由(Routing)实现,例如同一消息队列里的不同命名空间、同一数据表里标志位的不同取值、API调用和消息体上的流量标志位等。
一般来说,硬隔离在架构上比较简单,对应用代码入侵较小,应用代码和测试代码需要的改造较小。软隔离由于偏属逻辑层,应用代码和测试代码需要有一定的感知,对架构有较多的入侵,设计的复杂度较高。但硬隔离通过多实例实现,成本较高。测试隔离的种类如图1-2所示。一个团队在不同的发展阶段可以用不同的策略组合。当团队和系统规模较小时,不妨以硬隔离为主;当团队和系统规模变大后,团队已经有资源和能力驾驭较复杂的架构,同时成本问题也日趋凸显,这时可以逐渐建设起软隔离。
▲图1-2测试隔离的种类
软隔离的终极形态是TestinginProduction(TiP),依靠完善的隔离机制,直接复用生产环境的资源和服务搭建测试环境,如图1-3所示。
▲图1-3TiP
TiP是测试环境的终局,这是因为线下环境的某些局限性是无法避免的。
线下环境的容量有限。生产环境的容量往往是线下环境的几十、几百倍。单单是生产环境里的冗余容量和使用率波动的峰谷之间的量,就足以满足我们对线下环境的容量需求了。
上下游支持力度不够。线下环境稳定性经常受到上下游系统稳定性的影响。这些上下游系统也是线下环境。当这些上下游系统出现问题时,虽然也可以给相关团队报故障,但响应速度和支持力度比不上生产环境。如果把测试环境与上下游系统的生产环境集成,支持力度就不再是问题了。
线下环境和生产环境不一致。不一致不仅包括被测系统(SystemUnderTest,SUT)自身的一些配置,也包括上下游系统的版本和配置。把SUT和上下游系统的生产环境集成,能够最大限度地减少这种不一致。