如何在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
关键逻辑说明
- foreach循环:为每个测试生成独立的命令配置,避免
add_test_setup的全局统一配置问题。 - bash命令链:
./start_server.sh @0@ &:将服务器启动到后台运行,传入当前测试的专属端口。SERVER_PID=$!:记录服务器进程ID,用于后续清理。trap "kill $SERVER_PID" EXIT:设置陷阱,无论测试成功还是失败,退出时都会杀死对应服务器进程,避免残留。./@1@ --server-port @0@:执行测试程序,传入服务器端口让测试连接到对应实例。
- 路径处理:用
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
相关产品推荐
相关产品推荐

