Bazel- 我可以通过系统 属性 来测试 JVM(云雀规则)吗?
Bazel- Can I pass system property to test JVM (skylark rule)?
我正在使用 scala_specs2_junit_test
测试规则,我想通过系统 属性 的测试(您通常可以使用 -DmyProp=myValue
.
我发现这个 thread 听起来相关,但它谈论 java
(可以访问命令行参数的本机规则)和 run
(与 test
)。
这可能吗?
您始终可以使用 System.setProperty(name, value) 以编程方式在 Java 中设置系统 属性。
在单元测试中这样做的缺点是 属性 将在测试后保持不变。确保在测试后将值设置为 null。
您可以使用 --test_arg,但测试规则本身必须解释此类标志。
scala_specs2_junit_test
宏包装了 scala_junit_test
规则。作为测试规则,后者必须写入 ctx.outputs.executable
(参见 rule()#test),这是 Bazel 在 bazel test //my:test
上执行的内容,并将 --test_arg
标志传递给。
我没有在 Scala 规则中找到任何可以解析 --jvm_flags
标志的逻辑,因此似乎需要更新它们来处理这个问题。
演示
<工作空间>/my_test.bzl:
def _my_test_impl(ctx):
ctx.file_action(
ctx.outputs.executable,
"\n".join([
"#!/bin/bash",
"echo \"DEBUG: Hello from $(basename [=10=])\"",
"echo \"DEBUG: Argv=($@)\"",
# Flag parsing (e.g. --jvm_flags) would have to happen here
]),
True)
my_test = rule(
implementation = _my_test_impl,
test = True,
)
<工作空间>/构建:
load("//:my_test.bzl", "my_test")
my_test(
name = "my_test",
)
输出:
$ bazel test //:my_test --test_output=streamed -t- --test_arg=--foo=bar --test_arg=--jvm_flags=blah
(...)
INFO: (14:45:05.379) Found 1 test target...
DEBUG: Hello from my_test
DEBUG: Argv=(--foo=bar --jvm_flags=blah)
Target //:my_test up-to-date:
bazel-bin/my_test
INFO: (14:45:05.501) Elapsed time: 0.393s, Critical Path: 0.11s
INFO: (14:45:05.501) Build completed successfully, 3 total actions
//:my_test PASSED in 0.1s
编辑:向 my_test.bzl 添加注释以突出显示标志解析发生的位置
我正在使用 scala_specs2_junit_test
测试规则,我想通过系统 属性 的测试(您通常可以使用 -DmyProp=myValue
.
我发现这个 thread 听起来相关,但它谈论 java
(可以访问命令行参数的本机规则)和 run
(与 test
)。
这可能吗?
您始终可以使用 System.setProperty(name, value) 以编程方式在 Java 中设置系统 属性。
在单元测试中这样做的缺点是 属性 将在测试后保持不变。确保在测试后将值设置为 null。
您可以使用 --test_arg,但测试规则本身必须解释此类标志。
scala_specs2_junit_test
宏包装了 scala_junit_test
规则。作为测试规则,后者必须写入 ctx.outputs.executable
(参见 rule()#test),这是 Bazel 在 bazel test //my:test
上执行的内容,并将 --test_arg
标志传递给。
我没有在 Scala 规则中找到任何可以解析 --jvm_flags
标志的逻辑,因此似乎需要更新它们来处理这个问题。
演示
<工作空间>/my_test.bzl:
def _my_test_impl(ctx):
ctx.file_action(
ctx.outputs.executable,
"\n".join([
"#!/bin/bash",
"echo \"DEBUG: Hello from $(basename [=10=])\"",
"echo \"DEBUG: Argv=($@)\"",
# Flag parsing (e.g. --jvm_flags) would have to happen here
]),
True)
my_test = rule(
implementation = _my_test_impl,
test = True,
)
<工作空间>/构建:
load("//:my_test.bzl", "my_test")
my_test(
name = "my_test",
)
输出:
$ bazel test //:my_test --test_output=streamed -t- --test_arg=--foo=bar --test_arg=--jvm_flags=blah
(...)
INFO: (14:45:05.379) Found 1 test target...
DEBUG: Hello from my_test
DEBUG: Argv=(--foo=bar --jvm_flags=blah)
Target //:my_test up-to-date:
bazel-bin/my_test
INFO: (14:45:05.501) Elapsed time: 0.393s, Critical Path: 0.11s
INFO: (14:45:05.501) Build completed successfully, 3 total actions
//:my_test PASSED in 0.1s
编辑:向 my_test.bzl 添加注释以突出显示标志解析发生的位置