基于开发本地环境调度自动化脚本运行的脚本调度系统设计

109 阅读7分钟

序言

在现代软件开发中,快速验证代码功能并及时修复问题是提升开发效率的关键。然而,传统的 CI 测试流程依赖于远程环境,存在以下问题:

  • 开发人员难以在本地复现和调试 CI 环境中的问题。
  • 问题修复需要多次迭代,严重影响效率。
  • 测试脚本难以灵活适配不同的服务环境(如本地服务与测试环境)。

为此,我们设计了一套脚本调度系统,通过动态参数(clk)配置容器化执行支持开发人员高效完成本地服务的自测,形成从本地调试到自动化测试的高效闭环。


目标

  • 提升测试用例管理效率
    实现测试脚本从代码仓库(如 GitLab)的自动同步与解析,支持用例分类、版本控制和状态跟踪,构建统一的用例管理平台。
  • 优化测试任务执行与闭环管理
    支持灵活配置测试计划、执行顺序和目标环境,实现任务创建、执行、结果反馈的全流程闭环管理。
  • 支持本地服务调试与快速验证
    通过动态参数(如 clk),支持测试脚本适配本地服务环境,帮助开发人员快速验证代码功能并减少对 CI 环境的依赖。
  • 加速问题定位与反馈
    提供详细的测试报告、实时日志和错误信息,帮助开发人员快速定位问题并透明化测试过程。
  • 提升测试效率与稳定性
    利用容器化技术确保环境一致性,支持并行测试执行与增量构建,缩短测试时间并提升稳定性。
  • 缩短问题修复周期
    支持开发人员快速复现并验证 CI 环境中的问题,减少调试与重复构建的时间成本。

系统架构设计

系统架构概述

以下为系统整体架构设计逻辑:

image2025-1-23_16-22-0.png

用例编排系统由以下几个核心模块组成,各模块功能协作,形成测试用例管理、执行和反馈的完整闭环:

  1. 用例管理模块
  • 提供测试用例的扫描、解析、分类和版本管理功能,支持用例的集中化管理。 image2025-1-23_16-35-47.png image2025-1-23_16-36-35.png
  1. 测试计划管理模块
  • 通过计划的方式组织测试用例,支持灵活的执行逻辑配置,并动态适配测试环境参数(如 clk、环境变量、运行参数等等)。 image2025-3-21_16-28-38.png
  1. 执行引擎模块
  • 负责容器化运行测试脚本,通过环境参数动态适配本地或测试环境,确保测试脚本在隔离环境中的高效执行。
  1. 结果可视化模块
  • 实时展示测试执行日志,生成并查看测试报告(如 Allure 报告),提升问题定位效率。 image2025-1-23_16-34-30.png image2025-1-23_16-34-4.png

在此架构中,环境参数(如 clk)的维护与动态适配功能被整合到 测试计划管理模块 和 执行引擎模块 中,确保参数的管理与使用贯穿整个测试流程。


核心功能:clk 自测流程的实现

clk 是一个动态参数,用于标识目标服务的运行环境。 CI 服务和本地服务注册到同一个 Nacos 集群中,确保服务可以灵活路由与调用。具体机制如下:

  • 在 CI 环境 中,服务默认以 clk=default 的方式注册到 Nacos 集群。测试脚本在未指定 clk 参数时,所有请求会自动路由到 CI 环境的服务节点。
  • 在 本地环境 中,开发人员可以根据需要为本地服务设置自定义的 clk 参数,并将服务注册到 Nacos 集群中。这样,测试脚本在执行时可以根据测试计划中定义的 clk 参数动态选择目标服务节点。
  • 路由逻辑:测试脚本在运行时,优先选择与 clk 参数匹配的服务节点。如果集群中未找到匹配的节点,则会回退到默认的 default 节点进行调用。

通过这一机制,无论接口链路的复杂性如何,开发人员在本地自测时只需启动有改动的服务,并设置相应的 clk 参数,即可确保所有请求优先路由到本地服务。这样,不需要启动完整的服务链路,也能完成精准的本地自测。

此外,在执行自动化测试计划时:

  • 如果未传入 clk 参数,所有请求将默认路由到 CI 环境的服务节点。
  • 如果本地服务有改动并需要通过自动化脚本测试,只需在执行脚本时传入自定义的 clk 参数,即可验证本地服务的改动效果。

本地化自测流程

image2025-1-23_16-51-12.png

  1. 拉取测试用例脚本(编排系统)
  • 测试同事提交用例代码到代码仓库(如 GitLab),然后在用例编排系统中同步相关的测试用例脚本。
  • 创建测试计划并关联测试用例。
  1. 设置本地服务环境(本地服务)
  • 开发人员启动本地服务(如后端 API 服务,注册nacos时clk的值设置为benny),确保服务运行正常,并准备好相关依赖环境。
  1. 动态参数配置(编排系统)
  • 开发人员在系统中为测试计划配置 clk 参数=benny
  1. 运行测试脚本 (编排系统)
  • 在docker容器执行测试脚本,测试脚本会读取动态配置的参数(如 clk),将测试请求路由到本地服务。
  • 测试脚本运行后,验证本地代码是否符合预期功能。
  1. 查看测试结果
  • 开发人员查看测试报告和本地日志,分析测试脚本的运行状态。
  • 如果测试失败,根据错误堆栈或日志信息定位问题原因。
  1. 问题修复与验证
  • 开发人员根据测试结果修复代码问题,然后重新运行测试脚本,验证问题是否已解决。
  • 在所有测试通过后,提交代码到远程仓库,进入用例编排系统的持续集成流程。

动态参数的配置与传递

  1. 参数配置
  • 用户执行测试计划时配置 clk 参数,并作为执行参数记录到数据库
  • 示例配置值:benny
  1. 参数传递
  • 在执行阶段,系统从数据库读取参数并注入到 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的值 image2025-3-21_16-18-7.png
  1. 网关到下游服务:
  • 网关通过 Dubbo 调用下游服务时,将 clk 参数写入 Dubbo 上下文(RpcContext)。
  • dubbo服务选择的时候优先选择clk值匹配的服务。
  1. 下游服务间的调用: clk 参数通过 Dubbo 上下文在服务调用链路中自动传递,所有服务均能获取到该参数。

结语

本地自测的核心在于利用系统的动态参数适配功能(如 clk 参数),在用例编排系统用例管理、测试计划执行、以及结果可视化等功能实现了测试流程的闭环管理的基础上,实现支持开发人员运行测试脚本本地化测试:

  • 快速验证与调试:通过动态参数配置和容器化执行,测试脚本能够无缝调用本地节点服务,避免复杂的环境配置,开发人员可以实时查看日志和错误堆栈,快速验证代码功能与修复效果。
  • 环境动态适配:通过动态配置参数(如服务地址、请求头等),测试脚本能够无缝适配本地服务环境与测试环境,避免了复杂的手动环境配置。
  • 闭环问题修复:开发人员可以基于本地自测流程发现问题、修复问题并进行验证,形成高效的闭环调试机制,减少对 CI 环境的依赖并加速问题解决