如何 运行 在 bazel 的源代码树上进行测试?
How to run test on the source tree in bazel?
我正在将一个项目从 cmake 迁移到 bazel。我有一个文件夹包含一些 python 代码和一些 genrules
。
我有一个测试脚本 运行 递归地在这个文件夹中进行所有 python 测试。
所以基本上我需要这个文件夹下的所有 py 文件作为测试脚本的 data
。但是鉴于有一些规则我需要 运行,有一些 BUILD 文件,所以 glob(["**/*.py"])
无法通过。
例如,我们有一个文件夹 python
包含以下文件。
python/BUILD
python/test_a.py
python/folder_a/BUILD
这个有绅士风度
python/folder_a/folder_b/BUILD
这个也有绅士风度
python/folder_a/folder_b/folder_c/test_b.py
我想运行 python/
下的测试脚本,它会递归运行所有test_*.py
。现在我们想把它包装成一个 sh_test
in bazel。所以我们需要在data
字段中指定所有的test_*.py
。但是没有简单的方法可以做到这一点,因为 glob()
无法通过 python/folder_a/BUILD
和 python/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/...:*))'
分解:
kind("source file", //python/...:*)
查询所有source文件
//python
包中的目标递归。这收集了
普通源文件。
kind("generated file", //python/...:*)
查询所有生成的
//python
包中的文件目标递归。这收集
genrule 文件。
filter(".*:test_.*\.py", ...)
过滤包含的结果
仅以 //any/package:test_name.py
形式的目标
例如,运行
bazel query 'filter(".*:test_.*\.py", kind("source file", //src/...:* + //tools/...:*) + kind("generated file", //src/...:* + //tools/...:*))'
在 Bazel 自己的源代码树上找到一个目标://src/test/py/bazel:test_base.py
我正在将一个项目从 cmake 迁移到 bazel。我有一个文件夹包含一些 python 代码和一些 genrules
。
我有一个测试脚本 运行 递归地在这个文件夹中进行所有 python 测试。
所以基本上我需要这个文件夹下的所有 py 文件作为测试脚本的 data
。但是鉴于有一些规则我需要 运行,有一些 BUILD 文件,所以 glob(["**/*.py"])
无法通过。
例如,我们有一个文件夹 python
包含以下文件。
python/BUILD
python/test_a.py
python/folder_a/BUILD
这个有绅士风度python/folder_a/folder_b/BUILD
这个也有绅士风度python/folder_a/folder_b/folder_c/test_b.py
我想运行 python/
下的测试脚本,它会递归运行所有test_*.py
。现在我们想把它包装成一个 sh_test
in bazel。所以我们需要在data
字段中指定所有的test_*.py
。但是没有简单的方法可以做到这一点,因为 glob()
无法通过 python/folder_a/BUILD
和 python/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/...:*))'
分解:
kind("source file", //python/...:*)
查询所有source文件//python
包中的目标递归。这收集了 普通源文件。kind("generated file", //python/...:*)
查询所有生成的//python
包中的文件目标递归。这收集 genrule 文件。filter(".*:test_.*\.py", ...)
过滤包含的结果 仅以//any/package:test_name.py
形式的目标
例如,运行
bazel query 'filter(".*:test_.*\.py", kind("source file", //src/...:* + //tools/...:*) + kind("generated file", //src/...:* + //tools/...:*))'
在 Bazel 自己的源代码树上找到一个目标://src/test/py/bazel:test_base.py