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

如何在bazel中的源代码树上运行测试?,bazel,Bazel,我正在将一个项目从cmake迁移到bazel。我有一个文件夹,其中包含一些python代码和一些genrules。 我让一个测试脚本递归地运行这个文件夹中的所有python测试。 所以基本上我需要这个文件夹下的所有py文件作为测试脚本的data。但是考虑到我需要运行一些genrule,所以有一些构建文件,glob([“***.py”])无法通过 例如,我们有一个文件夹python包含以下文件 python/BUILD python/test\u a.py python/folder\u a/B

我正在将一个项目从cmake迁移到bazel。我有一个文件夹,其中包含一些python代码和一些
genrules
。 我让一个测试脚本递归地运行这个文件夹中的所有python测试。 所以基本上我需要这个文件夹下的所有py文件作为测试脚本的
data
。但是考虑到我需要运行一些genrule,所以有一些构建文件,
glob([“***.py”])
无法通过

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

  • python/BUILD

  • python/test\u a.py

  • python/folder\u a/BUILD
    这一个包含genrule

  • python/folder\u a/folder\u b/BUILD
    这一个也有genrule

  • python/folder\u a/folder\u b/folder\u c/test\u b.py

我想在
python/
下运行测试脚本,它将递归地运行所有
test.*.py
。现在我们想在bazel中将其包装为
sh_测试。因此,我们需要在
data
字段中指定所有
test.*.py
。但是没有简单的方法可以做到这一点,因为
glob()
无法通过
python/folder\u a/BUILD
python/folder\u a/folder\b/BUILD

如果我能在源代码树中运行这个脚本,将会非常方便。但巴泽尔似乎没有提供这一点。在
sh_test
中添加
local=1
,只会使runfiles树可写


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

我想不出一个简单的方法来获取构建文件中的所有目标名称,但是可以运行一个bazel查询来获取目标名称,然后,您可以在
文件组
目标中收集,以在
sh_test.data
属性中引用

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

  • kind(“源文件”//python/…:*)
    查询所有源文件 递归地在
    //python
    包中设置目标。这收集了 普通源文件

  • kind(“生成的文件”,//python/…:*)
    查询所有生成的 递归地在
    //python
    包中创建文件目标。这收集 该规则生成了多个文件

  • 过滤器(“.*:test.*\.py”,…)
    过滤包含 仅以
    //any/package:test\u 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

    虽然可能不是一个完美的选择,但它可以工作。在本例中,我必须将所有python文件添加到bazel中,这也是几项工作。