51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 889|回复: 0
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-8-10 16:03:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单体系统和微服务的区别在于,一个单体系统是一个大而全的功能集合,每个服务器运行的是这个应用的完整服务。而微服务是独立自治的功能模块,它是生态系统中的一部分,和其他微服务是共生关系。随着微服务架构的普及,我们遇到了许多服务之间相互依赖。那么,我们需要对其进行模块测试就有点力不从心了。例如,我们的模块中存在服务 A 内部依赖于服务 B,而整个模块又依赖于服务 C,如图所示。

那么,针对微服务的内部服务依赖,我们如何实现测试呢?
  事实上,我们由两种方案。第一种方案,我们将所有依赖的服务都进行构建与打包,然后统一部署进行测试。但是呢,这种方案过于复杂,且可能会可能演变成集成测试。因此,第二种方案通过虚拟化服务进行 API 仿真就显得更加合适了。对此,Hoverfly 作为一种新的服务虚拟化工具,可以模拟 HTTP 和 HTTPS 服务。Hoverfly 会启动一个代理,并使用存储的内容对请求进行响应,而这个响应和真实服务针对特定的请求产生的响应完全一致。如果整个流程能被正确地执行,并且存储地响应和真实服务一致,则 Hoverfly 可以完美地模拟真实服务。
读者可以通过官方教程进行安装,链接:https://hoverfly.readthedocs.io/ ... adinstallation.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 执行)












本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-9-28 05:27 , Processed in 0.077469 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表