要黑盒测试微服务内部服务间调用,我该如何实现?

发表于:2020-2-26 14:36

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:梁桂钊    来源:服务端思维

分享:
  单体系统和微服务的区别在于,一个单体系统是一个大而全的功能集合,每个服务器运行的是这个应用的完整服务。而微服务是独立自治的功能模块,它是生态系统中的一部分,和其他微服务是共生关系。随着微服务架构的普及,我们遇到了许多服务之间相互依赖。那么,我们需要对其进行模块测试就有点力不从心了。例如,我们的模块中存在服务 A 内部依赖于服务 B,而整个模块又依赖于服务 C,如图所示。
  那么,针对微服务的内部服务依赖,我们如何实现测试呢?
  事实上,我们由两种方案。第一种方案,我们将所有依赖的服务都进行构建与打包,然后统一部署进行测试。但是呢,这种方案过于复杂,且可能会可能演变成集成测试。因此,第二种方案通过虚拟化服务进行 API 仿真就显得更加合适了。对此,Hoverfly 作为一种新的服务虚拟化工具,可以模拟 HTTP 和 HTTPS 服务。Hoverfly 会启动一个代理,并使用存储的内容对请求进行响应,而这个响应和真实服务针对特定的请求产生的响应完全一致。如果整个流程能被正确地执行,并且存储地响应和真实服务一致,则 Hoverfly 可以完美地模拟真实服务。
  读者可以通过官方教程进行安装,链接:https://hoverfly.readthedocs.io/en/latest/pages/introduction/downloadinstallation.html。
  本文的示例教程以开放在 github,可以下载运行,链接:https://github.com/lianggzone/hoverfly-samples
  其中最为核心的是 hoverfly-provider 服务提供一个 API 接口,通过 http://localhost:8080/health 提供服务。
@RestController
public class HealthController {
@RequestMapping(value = "/health")
public HealthVO getHealthInfo() {
HealthVO healthVO = HealthVO.builder()
.msg("OK")
.timestrap(System.currentTimeMillis())
.build();
return healthVO;
}
}
  而另外一个 hoverfly-service 服务通过 RestTemplate 进行内部服务调用,并通过 http://localhost:8089/health 提供服务。
@Component
public class HoverflyProxy {
@Autowired
private RestTemplate restTemplate;
public HealthVO getHealthInfo(){
String url = "http://localhost:8080/health";
HealthVO healthVO = restTemplate.getForEntity(url, HealthVO.class).getBody();
return healthVO;
}
}
@RestController
public class HealthController {
@Autowired
private HoverflyProxy hoverflyProxy;
@RequestMapping(value = "/health")
public HealthVO getHealthInfo() {
return hoverflyProxy.getHealthInfo();
}
}
  现在,准备好必要的工作后,我们来聊一聊如何使用 Hoverfly 进行虚拟化服务。首先,我们需要启动 Hoverfly。
  hoverctl start
  Hoverfly 启动后,提示其代理端口和管理台端口,如图所示。
  然后,我们将 Hoverfly 切换成捕获模式。
  hoverctl mode capture
  我们启动 hoverfly-provider 服务和 hoverfly-service 服务,进行 http://localhost:8089/health 接口调用。注意的是,这里,我们需要指定 Hoverfly 作为代理。
  curl localhost:8089/health -H "Content-Type: Content-Type" --proxy localhost:8500
  此时,我们通过指定 proxy 参数,请求会首先转发到 Hoverfly 代理服务,然后再被转发到真正的业务服务,而响应接受过程也是如此。
  最后,我们采集足够多的样本后,就可以切换到仿真模式。
  hoverctl mode simulate
  在仿真模式下,我们再次发起相同的请求。
  curl localhost:8089/health -H "Content-Type: Content-Type" --proxy localhost:8500
  Hoverfly 会将之前记录袭来的请求来响应业务结果。
  那么,我也可以通过其控制台进行查看。
  事实上,一旦 Hoverfly 存储了请求和响应的数据,我们就不需要访问真正的业务访问,做到真正的仿真测试。次数,我们可以通过如下命名导出结果文件 simulations.json。
  hoverctl export simulate.json
  然后,根据持续集成和持续测试的规格标准,进行配置文件依赖的初始化即可。(这里,可以通过 hoverctl import simulations.json 执行)

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号