You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Meson的每个测试前运行带不同参数的.sh脚本?

解决Meson测试中每个测试启动独立端口服务器的方案

你可以通过为每个测试生成独立的自定义命令来实现需求,核心思路是把启动服务器的脚本、测试执行、服务器清理逻辑整合到单个测试命令中,确保每个测试使用专属端口,且测试结束后自动关闭对应服务器。

具体配置示例

假设你的启动脚本是start_server.sh,测试可执行文件是test_app,需要为3个测试分配不同端口:

# 定义测试集合:每个测试对应唯一名称和端口
test_configs = [
  {'name': 'user_api_test', 'port': 8080},
  {'name': 'order_api_test', 'port': 8081},
  {'name': 'payment_test', 'port': 8082},
]

# 遍历每个测试,生成独立的测试命令
foreach cfg : test_configs
  # 构建完整命令:启动服务器到后台→记录PID→设置退出陷阱清理进程→执行测试
  test_command = [
    'bash', '-c',
    './start_server.sh @0@ & SERVER_PID=$!; trap "kill $SERVER_PID" EXIT; ./@1@ --server-port @0@'
  ]
  # 替换占位符:@0@是端口,@1@是测试可执行文件路径
  test_command = test_command.format(cfg['port'], meson.current_build_dir() / 'test_app')

  # 注册测试
  test(
    cfg['name'],
    test_command,
    timeout: 30,  # 设置超时,防止服务器无响应导致测试挂起
    depends: files('start_server.sh')  # 确保启动脚本在测试前已准备好
  )
endforeach

关键逻辑说明

  1. foreach循环:为每个测试生成独立的命令配置,避免add_test_setup的全局统一配置问题。
  2. bash命令链:
    • ./start_server.sh @0@ &:将服务器启动到后台运行,传入当前测试的专属端口。
    • SERVER_PID=$!:记录服务器进程ID,用于后续清理。
    • trap "kill $SERVER_PID" EXIT:设置陷阱,无论测试成功还是失败,退出时都会杀死对应服务器进程,避免残留。
    • ./@1@ --server-port @0@:执行测试程序,传入服务器端口让测试连接到对应实例。
  3. 路径处理:用meson.current_build_dir()确保测试可执行文件的路径正确(Meson构建产物默认在build目录下)。

注意事项

  • 确保start_server.sh有可执行权限,可在Meson中添加install_mode: 'rwxr-xr-x'或者手动执行chmod +x start_server.sh。
  • 如果测试程序不需要显式传入端口,可通过环境变量传递,比如把命令中的--server-port @0@改成export TEST_SERVER_PORT=@0@; ./@1@,测试程序读取环境变量即可。

内容的提问来源于stack exchange,提问作者ElemehnoP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 06:45:11