Skip to content

如何执行全链路自动化模拟流程测试

HaojunRen edited this page May 31, 2024 · 4 revisions

本文档只适用于Discovery 6.12.0及以上版本的集成方式

使用者集成框架后,需要通过Postman调用一下去验证是否成功集成,该方式比较繁琐,可以通过“全链路自动化模拟流程测试”方式进行验证

采用全链路智能编排 + 流量侦测相结合的做法,支持网关和服务为侦测入口两种方式,用于测试环境或者开发环境通过自动化测试手段验证全链路蓝绿灰度方式的准确性

禁止事项

禁止在生产环境使用

注意事项

服务必须引入discovery-plugin-admin-center-starter依赖

执行步骤

① 启动控制台

执行之前,需要先启动控制台,请参考

② 修改application.properties配置文件

  • console.url替换成相应的地址
  • testcase.group和testcase.service替换成相应的订阅的组名和服务名
  • 网关侦测入口或者服务侦测入口任选一种,把testcase.inspect.url替换成相应的网关地址或者服务地址
    • 当选择网关作为侦测入口,testcase.inspect.context.service替换成网关后第一跳的服务名
    • 当选择服务作为侦测入口,testcase.inspect.context.service禁止配置
  • 其它参数可以遵照默认设置,也可以视具体使用场景做改动
# 测试用例的配置内容推送的控制台地址
console.url=http://localhost:6001
# 测试用例的配置内容推送后,等待生效的时间。推送远程配置中心后,再通知各服务更新自身的配置缓存,需要一定的时间。缺失则默认为5000
# console.operation.await.time=5000

# 订阅的组名
testcase.group=discovery-guide-group
# 订阅的服务名
testcase.service=discovery-guide-gateway
# testcase.service=discovery-guide-service-a

# 网关侦测入口地址
testcase.inspect.url=http://localhost:5001/discovery-guide-service-a/inspector/inspect
# 网关侦测入口转发服务
testcase.inspect.context.service=discovery-guide-service-a

# 服务侦测入口地址
# testcase.inspect.url=http://localhost:3001/inspector/inspect

# 每个测试用例执行循环次数。缺失则默认为1
# testcase.loop.count=1

# 测试用例的蓝绿采样总数。采样总数越大,准确率越高,但耗费时间越长。缺失则默认为100
# testcase.bluegreen.sample.count=100

# 测试用例的灰度权重采样总数。采样总数越大,灰度权重准确率越高,但耗费时间越长。缺失则默认为1000
# testcase.gray.sample.count=1000
# 测试用例的灰度权重准确率偏离值。采样总数越大,灰度权重准确率偏离值越小。缺失则默认为5
# testcase.gray.weight.offset=5

# 开启和关闭版本偏好部署模式下的测试用例。网关和服务基于非域网关模式的部署,存在这多个网关并行发布的场景。缺失则默认为false
# testcase.version.prefer.enabled=true

# 开启和关闭测试用例中第二次蓝绿灰度发布的自动化测试。一般情况下,第一次蓝绿灰度发布测试通过,第二次发生问题的概率较低。缺失则默认为true
# testcase.second.release.enabled=false

# 测试用例抛错,通过Debug方式定位问题
# testcase.debug.enabled=false

③ 修改规则策略文件

在如下三个文件

  • mock-version-release-basic.yaml
  • mock-version-release-1.yaml
  • mock-version-release-2.yaml

如下服务列表替换成测试环境要模拟蓝绿灰度发布的服务列表

service:
  - discovery-guide-service-a
  - discovery-guide-service-b

④ 参考模拟流程部分结果

【模拟场景3】蓝绿策略,测试全链路侦测,Header : 无...
侦测次数 : 100
侦测结果 : discovery-guide-service-a@@1.0 命中次数=100
侦测结果 : discovery-guide-service-a@@1.1 命中次数=0
侦测结果 : discovery-guide-service-b@@1.0 命中次数=100
侦测结果 : discovery-guide-service-b@@1.1 命中次数=0
测试耗时 : 1 秒
【模拟场景3】蓝绿策略,测试全链路侦测,Header : {xyz=1}...
侦测次数 : 100
侦测结果 : discovery-guide-service-a@@1.0 命中次数=100
侦测结果 : discovery-guide-service-a@@1.1 命中次数=0
侦测结果 : discovery-guide-service-b@@1.0 命中次数=100
侦测结果 : discovery-guide-service-b@@1.1 命中次数=0
测试耗时 : 1 秒
【模拟场景3】蓝绿策略,测试全链路侦测,Header : {xyz=2}...
侦测次数 : 100
侦测结果 : discovery-guide-service-a@@1.0 命中次数=0
侦测结果 : discovery-guide-service-a@@1.1 命中次数=100
侦测结果 : discovery-guide-service-b@@1.0 命中次数=0
侦测结果 : discovery-guide-service-b@@1.1 命中次数=100
测试耗时 : 1 秒
【模拟场景3】灰度策略,测试全链路侦测,Header : 无...
侦测次数 : 500
侦测进度 : 第100次...
侦测进度 : 第200次...
侦测进度 : 第300次...
侦测进度 : 第400次...
侦测进度 : 第500次...
侦测结果 : discovery-guide-service-a@@1.0 命中次数=500
侦测结果 : discovery-guide-service-a@@1.1 命中次数=0
侦测结果 : discovery-guide-service-b@@1.0 命中次数=500
侦测结果 : discovery-guide-service-b@@1.1 命中次数=0
期望结果 : 旧版本路由权重=100%, 新版本路由权重=0%
最终结果 : 旧版本路由权重=100.0%, 新版本路由权重=0.0%
测试耗时 : 9 秒
【模拟场景3】灰度策略,测试全链路侦测,Header : {xyz=3}...
侦测次数 : 500
侦测进度 : 第100次...
侦测进度 : 第200次...
侦测进度 : 第300次...
侦测进度 : 第400次...
侦测进度 : 第500次...
侦测结果 : discovery-guide-service-a@@1.0 命中次数=448
侦测结果 : discovery-guide-service-a@@1.1 命中次数=52
侦测结果 : discovery-guide-service-b@@1.0 命中次数=448
侦测结果 : discovery-guide-service-b@@1.1 命中次数=52
期望结果 : 旧版本路由权重=90%, 新版本路由权重=10%
最终结果 : 旧版本路由权重=89.6%, 新版本路由权重=10.4%
测试耗时 : 7 秒
【模拟场景3】灰度策略,测试全链路侦测,Header : {xyz=4}...
侦测次数 : 500
侦测进度 : 第100次...
侦测进度 : 第200次...
侦测进度 : 第300次...
侦测进度 : 第400次...
侦测进度 : 第500次...
侦测结果 : discovery-guide-service-a@@1.0 命中次数=353
侦测结果 : discovery-guide-service-a@@1.1 命中次数=147
侦测结果 : discovery-guide-service-b@@1.0 命中次数=353
侦测结果 : discovery-guide-service-b@@1.1 命中次数=147
期望结果 : 旧版本路由权重=70%, 新版本路由权重=30%
最终结果 : 旧版本路由权重=70.6%, 新版本路由权重=29.4%
测试耗时 : 8 秒
测试结果 : * 通过
【模拟场景3】结束

全链路自动化模拟流程测试,包括全链路自动化模拟流程本地测试全链路自动化模拟流程云上测试两种模式

全链路自动化模拟流程本地测试

执行过程,有两种方式

全链路自动化模拟流程云上测试

云上测试,即把原来本地测试的过程部署到云上Web服务器,执行逻辑和过程不变。具体功能包括

  • 并行控制测试用例,通过线程安全的锁组件(本地锁或者分布式锁)并行控制测试用例,根据Key(group@@serviceId)进行判断,不允许有多个Key相同的测试用例同时运行
    • 单服务器模式下,通过基于StampedLock的Caffeine实现本地锁,并提供锁过期释放机制
    • 集群服务器模式下,通过基于Redis的Redisson实现分布式锁,并提供锁过期释放机制
  • 测试用例执行过程中,每一步成功和失败,都提供日志输出,使用者可以实现基于Web界面的测试操作
    • 测试控制台提供两种方式的Rest接口,返回为全局唯一的testcase-id
    • 测试控制台需要通过Logback输入带有testcase-id的日志,参考discovery-automation-console/src/main/resouces下的logback.xml和logback-all.xml
    • 整合日志服务器,采集和输出测试日志到指定的分布式存储上
    • 通过testcase-id获取和显示属于指定Web界面终端的日志
  • 支持Properties和Yaml格式的两种调用接口

① 启动测试控制台

默认把Simulator和Inspector集成在一起,使用者可以视具体场景把它们分开部署

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>discovery-automation-inspector-starter-console</artifactId>
</dependency>

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>discovery-automation-simulator-starter-console</artifactId>
</dependency>

使用者可以视具体场景选择Caffeine本地锁或者Redisson分布式锁

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>discovery-automation-concurrent-starter-caffeine</artifactId>
</dependency>

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>discovery-automation-concurrent-starter-redisson</artifactId>
</dependency>

执行过程,有两种方式

② 修改application.properties配置文件

# Spring boot config
spring.application.name=automation-console
server.port=6002

# Console automation thread config for inspector and simulator
# spring.application.thread.core-pool-size=
# spring.application.thread.max-pool-size=
# spring.application.thread.queue-capacity=
# spring.application.thread.keep-alive-seconds=
# spring.application.thread.await-termination-seconds=

# Console automation caffeine config for simulator
# spring.application.caffeine.initial-capacity=10
# spring.application.caffeine.maximum-size=100
# spring.application.caffeine.expire-seconds=900

# Console automation redisson config for simulator
# spring.application.redisson.wait-seconds=0
# spring.application.redisson.expire-seconds=900

# Refer to https://github.com/redisson/redisson/blob/master/redisson-spring-boot-starter/README.md
singleServerConfig.address=redis://127.0.0.1:6379

# spring.application.logger.mdc.key.shown=true

③ 启动测试

使用者可以自研自动化测试平台界面来代替Swagger界面,下面以Swagger界面为例,介绍如何操作

全链路自动化模拟流程测试,有两种接口

配置文件为Properties格式

访问接口

http://localhost:6002/simulator-test/test-config-properties

传输内容,按照次序,由application.properties、mock-version-release-basic.yaml、mock-version-release-1.yaml、mock-version-release-2.yaml组成,中间用10个"-"组成换行分隔。例如:

testcase.console.url=http://localhost:6001
testcase.group=discovery-guide-group
testcase.service=discovery-guide-gateway
testcase.inspect.url=http://localhost:5001/discovery-guide-service-a/inspector/inspect
testcase.inspect.context.service=discovery-guide-service-a
----------
service:
  - discovery-guide-service-a
  - discovery-guide-service-b
sort: version
----------
service:
  - discovery-guide-service-a
  - discovery-guide-service-b
blueGreen:
  - expression: "#H['xyz'] == '1'"
    route: green
  - expression: "#H['xyz'] == '2'"
    route: blue
gray:
  - expression: "#H['xyz'] == '3'"
    weight:
      - 90
      - 10
  - expression: "#H['xyz'] == '4'"
    weight:
      - 70
      - 30
sort: version
----------
service:
  - discovery-guide-service-a
  - discovery-guide-service-b
condition: true
sort: version

配置文件为Yaml格式

访问接口

http://localhost:6002/simulator-test/test-config-yaml

传输内容,按照次序,由application.yaml、mock-version-release-basic.yaml、mock-version-release-1.yaml、mock-version-release-2.yaml组成,中间用10个"-"组成换行分隔。例如:

testcase:
    console:
        url: http://localhost:6001
    group: discovery-guide-group
    service: discovery-guide-gateway
    inspect:
        url: http://localhost:5001/discovery-guide-service-a/inspector/inspect
        context:
            service: discovery-guide-service-a
----------
service:
  - discovery-guide-service-a
  - discovery-guide-service-b
sort: version
----------
service:
  - discovery-guide-service-a
  - discovery-guide-service-b
blueGreen:
  - expression: "#H['xyz'] == '1'"
    route: green
  - expression: "#H['xyz'] == '2'"
    route: blue
gray:
  - expression: "#H['xyz'] == '3'"
    weight:
      - 90
      - 10
  - expression: "#H['xyz'] == '4'"
    weight:
      - 70
      - 30
sort: version
----------
service:
  - discovery-guide-service-a
  - discovery-guide-service-b
condition: true
sort: version

传输内容,自上而下,分别是基本配置属性、兜底规则策略、第一次蓝绿灰度发布规则策略、第二次蓝绿灰度发布规则策略。使用者可以直接使用上述示例规则策略(只需要改动服务列表),也可以把实际规则策略填入进去

自动化测试模式下的规则策略有两个限制

  • 蓝绿灰度混合发布模式下,灰度兜底策略不允许配置
  • 尽量使用“等于”表达式

④ 获取当前正在运行的测试用例列表

访问接口

http://localhost:6002/simulator-test/testcases-running

查看测试平台目前正在运行哪些测试用例,用例名称的格式为group@@serviceId




2017-2050 ©Nepxion Studio Apache License

           

Total visits

讲义篇

集成篇

概念篇

实践篇

功能篇

配置篇

扩展篇

测试篇

升级篇

贡献篇

Clone this wiki locally