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 添加注释以突出显示标志解析发生的位置