在验收测试阶段,基于微服务架构的应用相对于单体架构的应用而言,具有以下挑战:
-
复数的服务增加了测试环境搭建的难度
-
各种异常情况的模拟变得困难,基于 Mock 的测试方式无法对整个调用链路作异常模拟,进而使得对整体架构的健壮性测试变得困难
-
基于成本和效率的原因,测试工作已经不适合通过人工完成
我们认为对基于微服务架构的应用,其验收测试应该具有以下特征:
-
自动化、可重复、易于集成CI工具
-
能够在测试运行时修改服务的行为
下面我们通过一个 Demo 来介绍如何利用 Docker、Cucumber、Byteman、Fabric8 docker-maven-plugin、Spotify dockerfile-maven-plugin达成以上目标。
01 Demo 实践
一共有两个服务:
- Product Service(商品服务)
- Product Price Service(商品价格服务)
Product Service 提供了一个查询接口用于获得商品信息及其价格信息的组合结果,这相当于跨服务的 SQL JOIN。
Product 的 Schema:
{
"id": "<string>",
"name": "<string>",
"description": "<string>"
}
ProductPrice的Schema:
{
"id": "<string>",
"price": "<number>"
}
Product Service返回的Schema则是:
{
"products": [
{
"id": "<string>",
"name": "<string>",
"description": "<string>",
"price": <number>
}
]
}
该接口的实现逻辑是:
-
Product Service 本地查询得到 Product List
-
Product Service 调用 Product Price Service 接口得到 ProductPrice List
-
拼装结果
此外还有一个要求,当 Product Price Service 出现异常时,Product Service 依然要能够返回结果,只不过 price 字段为 null,即无论如何 Product Service 都要能够返回结果。
02 实现步骤
构建 Docker Image
为了能够便利地搭建测试环境,我们需要先为Product Servcie和Product Price Service