Bazel-我可以通过系统属性来测试JVM(云雀规则)吗?

时间:2017-06-15 15:22:41

标签: java scala bazel

我使用scala_specs2_junit_test测试规则并且我希望将测试传递给系统属性(通常可以使用-DmyProp=myValue。) 我发现这个thread听起来很相关,但它讨论的是java(可以访问命令行参数的原生规则)和run(vs test)。 这可能吗?

2 个答案:

答案 0 :(得分:2)

您可以使用--test_arg,但测试规则本身必须解释此类标记。

scala_specs2_junit_test宏包含scala_junit_test规则。作为测试规则,后者必须编写ctx.outputs.executable(请参阅rule()#test),这是Bazel在bazel test //my:test上执行的并将--test_arg标记传递给。{/ p>

我没有在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 $0)\"",
        "echo \"DEBUG: Argv=($@)\"",
        # Flag parsing (e.g. --jvm_flags) would have to happen here
    ]),
    True)

my_test = rule(
    implementation = _my_test_impl,
    test = True,
)

<工作区> / BUILD:

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中添加评论以突出显示标志解析的位置

答案 1 :(得分:-3)

您始终可以使用System.setProperty(name,value)以编程方式在Java中设置系统属性。

在单元测试中执行此操作的缺点是该属性将在测试后保持设置状态。确保在测试后将值设置为null。