软件测试中的服务虚拟化

ThoughtWorks洞见 2021-02-23 20:59

微服务测试中会遇到诸多难题:测试环境被多个团队共同使用,测试数据准备需要花费大量时间,某些服务部署或网络等问题,导致测试环境不稳定以及版本不匹配。可以使用服务虚拟化(Service Virtualization)技术来解决以上这些问题。


最近几年虽然微服务十分火热,但是仍然有不少人不喜欢微服务,甚至抵制它。其中最主要的原因就是其成本高,难度大。对于难度大,主要是遇到了一些不容易解决的问题,而在这些问题中,其中包括以下三个和测试数据以及测试环境相关的问题:

问题一:测试环境被多个团队共同使用

在大规模的微服务系统中,某些核心服务很多时候都是会被多个团队在共同调用,并且它可能也有多个依赖服务。而当一个服务的某个测试环境被多个团队(服务)共同使用的时候,主要会存在以下两个困难点。
  1. 同一测试数据可能会被不同的团队修改。有些团队通过创建多套测试环境来解决这个问题,但是这样的成本很高。对于很多技术强大的互联网公司,可以通过Docker等技术手段来降低一些成本,但是对于很多传统企业来讲,高成本的多环境很难实施。 

  2. 同一测试数据可能被其他团队占用,所谓的占用就是一个测试数据一旦不小心被某个人使用了,他可能按自己的场景在进行使用,这个时候你去用它,很可能受到影响而得不到自己想要的结果。


问题二:测试数据准备需要花费大量时间

当测试一些业务不是很复杂的系统时,准备测试数据也许不是一件困难的事情。但是在一些传统行业的复杂系统中,准备测试数据是一项非常困难的事情,比如在银行,保险,通信等复杂系统中。
我曾经测试过一个保险系统,要在测试环境中准备一套数据甚至需要几个小时,因为整个系统的业务非常复杂,数据库设计也非常复杂,而且还是遗留系统,几乎没有人懂得如何直接操作数据库来准备数据。所以准备数据就必须通过使用应用系统本身来创建。而系统本身是基于MainFrame的,而且UI全部是Console下的UI,操作十分繁琐和复杂,导致创建一套测试数据需要花费很长时间。很多银行和保险公司的核心系统到现在也是保留这样的模式。 
因此在这样的传统行业中的遗留系统中,测试数据的准备是一个非常大的问题, 
其次很多系统中,测试数据一旦使用了,状态就会改变,从而不能重复使用。所以再次测试就需要重新创建测试数据,这也是一个常见的严重的问题。

问题三:服务部署或网络等问题导致测试环境不稳定以及版本不匹配

这个也是经常会遇到的情况。对于一些稳定而没有什么变化的系统,也许这不是一个问题,但是对于一些正在开发过程中,或者有大量修改或者本身不稳定的系统中,这个问题就十分常见。
对于服务部署和网络的问题,主要是指依赖的服务正在部署或者与依赖服务之间的网络出现问题而导致依赖服务不可用。其次是依赖服务的正在调试,而调试的过程中,服务本身的一些状态可能在不停的改变。或者依赖服务存在Bug,导致服务也存在问题。最后也许消费端只需要版本1.0依赖服务,但是测试环境中已经部署了2.0版本的服务,导致服务对消费端来讲也不可用了。

解决方案:服务虚拟化

可以使用服务虚拟化(Service Virtualization)技术来解决以上这些问题。下图是服务虚拟化的简单示意图:
服务虚拟化看起来虽然简单,但是其实现已经做到非常丰富的功能,比如Hoverfly等,从而解决上面那一系列问题。

Hoverfly

Hoverfly是一个开源免费(Apache 2)的服务虚拟化的一个工具,其虚拟数据是可以复用的Json格式的Simulation。它是基于 Go开发的,轻巧,高效。同时支持Python和Java进行扩展,也提供REST API来对其进行控制。并且暂时提供模拟网络延迟,随机错误和限定速率。但是其支持的协议有限,暂时只支持HTTP和HTTPS。但是其最重要的是其支持六种工作模型,它们分别是:Capture模型,Simulate模型,Spy模型,Synthesize模型,Modify模型,Diff模型。
通过这六种模型,基本可以实现服务虚拟化的各种功能。首先,通过Capture模型可以获取到在手工测试和系统正常使用的情况下,各种服务的交互数据,然后再进行分析和修改,可以获得更多类型的数据。
将这些数据通过Spy、Synthesize、Modify和Simulate模型进行不同类型的服务虚拟。不同的团队可以根据基础类型数据快速定制自己团队的私有虚拟数据集,并且还可以根据不同版本的服务,定制不同版本的虚拟数据集,从而隔离了不同版本服务之间的数据,避免了不同团队之间的的测试数据冲突。

为什么要选择Hoverfly?

首先服务虚拟中心化,它是基于Proxy模型的,所以在它只要加一台机器搭建一个代理服务。其次它是非侵入式的,它是不需要改动被测系统的代码或者配置的,而只需要改动JVM自己的或者是操作系统的Proxy配置。然后其灵活性很高,它支持各种模型,使用非常方便。最后它是开源软件,所以如果需要一些定制化功能,还可以根据自己的需求对其进行二次定制化开发。

总结

随着传统Stub和Mock服务技术的发展,以及微服务系统开发中对于服务测试的各种问题和需求,服务虚拟化孕育而生。服务虚拟化是对Stub以及Mock技术的提升和系统化,功能更为强大,从而可以更加容易使用和定制化,以便满足服务测试的各种新需求,解决各种新出现的问题。

- 相关阅读 -

ThoughtWorks的敏捷测试

软件测试新趋势


- 直播推荐 -


点击【阅读原文】可至洞见网站查看原文&绿色字体部分的相关链接。

本文版权属ThoughtWorks公司所有,如需转载请在后台留言联系。