序言
在现代软件开发中,快速验证代码功能并及时修复问题是提升开发效率的关键。然而,传统的 CI 测试流程依赖于远程环境,存在以下问题:
- 开发人员难以在本地复现和调试 CI 环境中的问题。
- 问题修复需要多次迭代,严重影响效率。
- 测试脚本难以灵活适配不同的服务环境(如本地服务与测试环境)。
为此,我们设计了一套脚本调度系统,通过动态参数(clk)配置与容器化执行支持开发人员高效完成本地服务的自测,形成从本地调试到自动化测试的高效闭环。
目标
- 提升测试用例管理效率
实现测试脚本从代码仓库(如 GitLab)的自动同步与解析,支持用例分类、版本控制和状态跟踪,构建统一的用例管理平台。 - 优化测试任务执行与闭环管理
支持灵活配置测试计划、执行顺序和目标环境,实现任务创建、执行、结果反馈的全流程闭环管理。 - 支持本地服务调试与快速验证
通过动态参数(如clk),支持测试脚本适配本地服务环境,帮助开发人员快速验证代码功能并减少对 CI 环境的依赖。 - 加速问题定位与反馈
提供详细的测试报告、实时日志和错误信息,帮助开发人员快速定位问题并透明化测试过程。 - 提升测试效率与稳定性
利用容器化技术确保环境一致性,支持并行测试执行与增量构建,缩短测试时间并提升稳定性。 - 缩短问题修复周期
支持开发人员快速复现并验证 CI 环境中的问题,减少调试与重复构建的时间成本。
系统架构设计
系统架构概述
以下为系统整体架构设计逻辑:
用例编排系统由以下几个核心模块组成,各模块功能协作,形成测试用例管理、执行和反馈的完整闭环:
- 用例管理模块
- 提供测试用例的扫描、解析、分类和版本管理功能,支持用例的集中化管理。
- 测试计划管理模块
- 通过计划的方式组织测试用例,支持灵活的执行逻辑配置,并动态适配测试环境参数(如
clk、环境变量、运行参数等等)。
- 执行引擎模块
- 负责容器化运行测试脚本,通过环境参数动态适配本地或测试环境,确保测试脚本在隔离环境中的高效执行。
- 结果可视化模块
- 实时展示测试执行日志,生成并查看测试报告(如 Allure 报告),提升问题定位效率。
在此架构中,环境参数(如 clk)的维护与动态适配功能被整合到 测试计划管理模块 和 执行引擎模块 中,确保参数的管理与使用贯穿整个测试流程。
核心功能:clk 自测流程的实现
clk 是一个动态参数,用于标识目标服务的运行环境。 CI 服务和本地服务注册到同一个 Nacos 集群中,确保服务可以灵活路由与调用。具体机制如下:
- 在 CI 环境 中,服务默认以
clk=default的方式注册到 Nacos 集群。测试脚本在未指定clk参数时,所有请求会自动路由到 CI 环境的服务节点。 - 在 本地环境 中,开发人员可以根据需要为本地服务设置自定义的
clk参数,并将服务注册到 Nacos 集群中。这样,测试脚本在执行时可以根据测试计划中定义的clk参数动态选择目标服务节点。 - 路由逻辑:测试脚本在运行时,优先选择与
clk参数匹配的服务节点。如果集群中未找到匹配的节点,则会回退到默认的default节点进行调用。
通过这一机制,无论接口链路的复杂性如何,开发人员在本地自测时只需启动有改动的服务,并设置相应的 clk 参数,即可确保所有请求优先路由到本地服务。这样,不需要启动完整的服务链路,也能完成精准的本地自测。
此外,在执行自动化测试计划时:
- 如果未传入
clk参数,所有请求将默认路由到 CI 环境的服务节点。 - 如果本地服务有改动并需要通过自动化脚本测试,只需在执行脚本时传入自定义的
clk参数,即可验证本地服务的改动效果。
本地化自测流程
- 拉取测试用例脚本(编排系统)
- 测试同事提交用例代码到代码仓库(如 GitLab),然后在用例编排系统中同步相关的测试用例脚本。
- 创建测试计划并关联测试用例。
- 设置本地服务环境(本地服务)
- 开发人员启动本地服务(如后端 API 服务,注册nacos时clk的值设置为benny),确保服务运行正常,并准备好相关依赖环境。
- 动态参数配置: (编排系统)
- 开发人员在系统中为测试计划配置
clk参数=benny
- 运行测试脚本 (编排系统)
- 在docker容器执行测试脚本,测试脚本会读取动态配置的参数(如
clk),将测试请求路由到本地服务。 - 测试脚本运行后,验证本地代码是否符合预期功能。
- 查看测试结果
- 开发人员查看测试报告和本地日志,分析测试脚本的运行状态。
- 如果测试失败,根据错误堆栈或日志信息定位问题原因。
- 问题修复与验证
- 开发人员根据测试结果修复代码问题,然后重新运行测试脚本,验证问题是否已解决。
- 在所有测试通过后,提交代码到远程仓库,进入用例编排系统的持续集成流程。
动态参数的配置与传递
- 参数配置:
- 用户执行测试计划时配置
clk参数,并作为执行参数记录到数据库 - 示例配置值:benny
- 参数传递:
-
在执行阶段,系统从数据库读取参数并注入到 Docker 容器中。
-
参数通过以下方式传递:
docker run -e GLOBAL_HTTP_HEADERS='{"clk": "benny"}' ...
3. 脚本动态适配:
- 测试脚本通过 HTTP 请求,将
clk参数放在请求头中,网关解析并提取该参数
import os
import json
# 从环境变量中读取 GLOBAL_HTTP_HEADERS
global_http_headers = os.getenv("GLOBAL_HTTP_HEADERS")
if global_http_headers:
# 解析 JSON 字符串
headers = json.loads(global_http_headers)
print(f"Parsed headers: {headers}")
else:
print("GLOBAL_HTTP_HEADERS not found.")
- 测试报告请求头会显示clk的值
- 网关到下游服务:
- 网关通过 Dubbo 调用下游服务时,将
clk参数写入 Dubbo 上下文(RpcContext)。 - dubbo服务选择的时候优先选择clk值匹配的服务。
- 下游服务间的调用:
clk参数通过 Dubbo 上下文在服务调用链路中自动传递,所有服务均能获取到该参数。
结语
本地自测的核心在于利用系统的动态参数适配功能(如 clk 参数),在用例编排系统用例管理、测试计划执行、以及结果可视化等功能实现了测试流程的闭环管理的基础上,实现支持开发人员运行测试脚本本地化测试:
- 快速验证与调试:通过动态参数配置和容器化执行,测试脚本能够无缝调用本地节点服务,避免复杂的环境配置,开发人员可以实时查看日志和错误堆栈,快速验证代码功能与修复效果。
- 环境动态适配:通过动态配置参数(如服务地址、请求头等),测试脚本能够无缝适配本地服务环境与测试环境,避免了复杂的手动环境配置。
- 闭环问题修复:开发人员可以基于本地自测流程发现问题、修复问题并进行验证,形成高效的闭环调试机制,减少对 CI 环境的依赖并加速问题解决