仅在特定配置下执行的Bazel测试规则

时间:2019-10-25 23:19:03

标签: bazel

我有一个自定义测试规则,用于验证生成的二进制文件的大小。我希望此规则仅在特定配置(优化,--compilation_mode=opt)中执行,否则不运行(或成为无操作通过)。

具体地说,

  • bazel test //my:example_size_test不应运行测试(最好,尽管可以运行并始终通过测试)
  • bazel test -c opt //my:example_size_test应该运行测试,并根据测试结果通过

有没有办法做到这一点?

我尝试使用宏来有条件地对该规则进行别名:

  • size_test是实例化的宏
    • $name_enabled_test,类型为_size_test的实际测试目标
    • $name_disabled_testnoop_test规则(本质上是exit 0的自定义规则)
    • $name,这是一个alias,它根据$name_enabled_test的配置在$name_disabled_testselect之间进行选择

但是,假设的bazel test //my:example_size_test可以构建,但是不能运行测试。这是documented

  

如果在命令行中提到了别名,则不会运行测试。要定义运行引用的测试的别名,请使用test_suite属性中具有单个目标的tests规则。

我尝试使用test_suite代替alias

  • size_test是实例化的宏
    • $name_enabled_test,类型为_size_test的实际测试目标
    • $name_disabled_testnoop_test规则(本质上是exit 0的自定义规则)
    • $name,一个test_suite,具有tests属性,根据配置,select$name_enabled_test$name_disabled_test之间

但是,由于tests attribute is non-configurable,这是行不通的。

是否有一种惯用的(甚至是回旋处)方式来实现仅适用于某些配置的测试?

1 个答案:

答案 0 :(得分:0)

听起来像select()的工作。

-c opt定义一个config_setting,并在测试的select属性中使用data来依赖二进制文件。还要向测试传递一些标志,以指示它是否应该验证二进制文件的大小。

我将以sh_test为例,因为我不想承担关于size_test的任何事情:

some_test(
    name = "example_size_test",
    srcs = [...],  # you need to implement this
    deps = ["@bazel_tools//tools/bash/runfiles"],
    data = select({
        ":config_opt": ["//my:binary"],
        "//conditions:default": [],
    }),
    args = select({
        ":config_opt": [],
        "//conditions:default": ["do_not_run"],
    }),
)

如果$1 == "do_not_run",则测试应退出0,否则测试应使用runfiles-library(请参见BashC++Java,{{3} })检索//my:binary的位置并测试其大小。