我有一个自定义测试规则,用于验证生成的二进制文件的大小。我希望此规则仅在特定配置(优化,--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_test
,noop_test
规则(本质上是exit 0
的自定义规则)$name
,这是一个alias
,它根据$name_enabled_test
的配置在$name_disabled_test
和select
之间进行选择但是,假设的bazel test //my:example_size_test
可以构建,但是不能运行测试。这是documented:
如果在命令行中提到了别名,则不会运行测试。要定义运行引用的测试的别名,请使用
test_suite
属性中具有单个目标的tests
规则。
我尝试使用test_suite
代替alias
:
size_test
是实例化的宏
$name_enabled_test
,类型为_size_test
的实际测试目标$name_disabled_test
,noop_test
规则(本质上是exit 0
的自定义规则)$name
,一个test_suite
,具有tests
属性,根据配置,select
在$name_enabled_test
和$name_disabled_test
之间但是,由于tests
attribute is non-configurable,这是行不通的。
是否有一种惯用的(甚至是回旋处)方式来实现仅适用于某些配置的测试?
答案 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(请参见Bash,C++,Java,{{3} })检索//my:binary
的位置并测试其大小。