如何 运行 在 bazel 的源代码树上进行测试?

How to run test on the source tree in bazel?

我正在将一个项目从 cmake 迁移到 bazel。我有一个文件夹包含一些 python 代码和一些 genrules。 我有一个测试脚本 运行 递归地在这个文件夹中进行所有 python 测试。 所以基本上我需要这个文件夹下的所有 py 文件作为测试脚本的 data。但是鉴于有一些规则我需要 运行,有一些 BUILD 文件,所以 glob(["**/*.py"]) 无法通过。

例如,我们有一个文件夹 python 包含以下文件。

我想运行 python/下的测试脚本,它会递归运行所有test_*.py。现在我们想把它包装成一个 sh_test in bazel。所以我们需要在data字段中指定所有的test_*.py。但是没有简单的方法可以做到这一点,因为 glob() 无法通过 python/folder_a/BUILDpython/folder_a/folder_b/BUILD.

如果能在源码树中运行这个脚本就方便多了。但是bazel好像没有提供这个。在 sh_test 中添加 local = 1 只会使 运行 文件树可写。

我知道使用 bazel 测试不是一个好方法,但有时同时迁移所有内容的工作量太大了。

我想不出一个简单的方法来获取所有目标名称一个BUILD文件中,但是有一个Bazel查询你可以运行得到目标名称,然后您可以将其收集在 filegroup 目标中以在 sh_test.data 属性中引用。

bazel query 'filter(".*:test_.*\.py", kind("source file", //python/...:*) + kind("generated file", //python/...:*))'

分解:

  1. kind("source file", //python/...:*)查询所有source文件 //python 包中的目标递归。这收集了 普通源文件。

  2. kind("generated file", //python/...:*)查询所有生成的 //python 包中的文件目标递归。这收集 genrule 文件。

  3. filter(".*:test_.*\.py", ...)过滤包含的结果 仅以 //any/package:test_name.py

  4. 形式的目标

例如,运行

bazel query 'filter(".*:test_.*\.py", kind("source file", //src/...:* + //tools/...:*) + kind("generated file", //src/...:* + //tools/...:*))'

在 Bazel 自己的源代码树上找到一个目标://src/test/py/bazel:test_base.py