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

时间:2018-03-21 20:24:10

标签: bazel

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

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

  • python/BUILD

  • python/test_a.py

  • python/folder_a/BUILD这个有genoule。

  • python/folder_a/folder_b/BUILD这个也有genrule。

  • python/folder_a/folder_b/folder_c/test_b.py

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

打破这个局面:

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

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

  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