如何在Bazel的py_test规则中访问测试所需的cc_binary二进制文件
解决方案
你当前的BUILD配置已经完成了第一步:将被测cc_binary加入data字段,Bazel执行测试时会自动将该二进制及其运行依赖同步到测试的沙箱运行环境中。
在Python代码中访问该二进制有两种常用方案:
方案1:直接按相对路径访问
Bazel测试的运行时工作目录和你的BUILD文件所在目录的源码结构一致,如果你要测的:simple二进制和当前BUILD文件在同一级目录,直接用相对路径调用即可,适合简单小型项目:
import subprocess def test_cc_binary(): # 调用二进制,可按需传入测试参数 run_result = subprocess.run( ["./simple", "test_arg1", "test_arg2"], capture_output=True, text=True ) # 校验返回码、标准输出/标准错误是否符合预期 assert run_result.returncode == 0 assert "expected_output" in run_result.stdout
方案2:通过Runfiles库定位(更稳妥,推荐)
如果项目结构复杂、或者需要适配不同运行环境,推荐使用Bazel官方提供的Runfiles库定位二进制路径,避免硬编码相对路径出错。
第一步:修改BUILD文件添加依赖
py_test( name = 'simple_test', size = 'small', srcs = ['simple_test.py'], data = [':simple'], # 被测cc_binary deps = ["@bazel_tools//tools/python/runfiles"], # 新增Runfiles依赖 )
第二步:Python代码中调用
from bazel_tools.tools.python.runfiles import runfiles import subprocess def test_cc_binary(): # 初始化Runfiles r = runfiles.Create() # 按二进制的Bazel全限定名定位路径,格式为「工作空间名/包路径/二进制名」 # 示例:如果你的工作空间名是my_project,二进制在根目录下,路径为my_project/simple binary_path = r.Rlocation("my_project/simple") run_result = subprocess.run( [binary_path, "test_arg1", "test_arg2"], capture_output=True, text=True ) assert run_result.returncode == 0
注意事项
- Windows系统下二进制文件会自动带
.exe后缀,可通过sys.platform判断系统后适配路径 - 不要直接访问源码目录下编译生成的二进制,必须使用运行时沙箱内的路径,否则远程执行、缓存复用测试时会出现文件找不到的问题
- 如果被测二进制有动态链接依赖,只要
cc_binary配置正确,Bazel会自动将所有依赖同步到测试运行环境,无需额外处理
内容的提问来源于stack exchange,提问作者wuxiaohua
相关产品推荐
相关产品推荐

