如何指定Bazel测试二进制文件的运行目录?无需修改业务代码
如何指定Bazel测试二进制的运行目录(无需修改代码)
有两种可靠的方法可以在不改动测试代码的前提下,仅通过调整BUILD文件解决这个问题:
方法一:用run_under直接切换运行目录
在cc_test规则中添加run_under属性,通过shell命令先切换到测试二进制所在的目录,再执行测试:
cc_test( name = "your_test_target", srcs = ["your_test.cc"], data = ["test_data.txt"], # 你的数据文件 run_under = "cd $$(dirname $0) && ", )
- 原理:
$$(dirname $0)会被shell解析为测试二进制文件的所在目录路径,cd命令切换到该目录后再执行测试,代码里的相对路径就能正确找到data中指定的文件。 - 注意:这里用
$$是为了转义Bazel的变量解析,确保shell能正确处理$0(代表当前执行的二进制文件路径)。
方法二:生成执行脚本处理目录切换
如果需要更复杂的运行逻辑,可以生成一个shell脚本,负责切换目录并启动测试:
# 生成切换目录的执行脚本 genrule( name = "run_test_script", outs = ["run_test.sh"], cmd = """ echo '#!/bin/bash' > $@ echo 'cd $(dirname $0)/$(RULEDIR) && ./your_test_target' >> $@ chmod +x $@ """, executable = True, ) cc_test( name = "your_test_target", srcs = ["your_test.cc"], data = [ "test_data.txt", ":run_test_script", ], run_under = "$(location :run_test_script)", )
- 原理:脚本会切换到测试二进制所在的输出目录(
$(RULEDIR)是Bazel内置变量,代表当前规则的输出目录),再启动测试二进制,确保相对路径解析正确。
内容的提问来源于stack exchange,提问作者Amir Hossein Sarebani
相关产品推荐
相关产品推荐

