如何在 Bazel 中为 Java 测试编写扩展规则



我目前认为的是创建一个AllTest并使用 junit 运行它。但是,我对此并不满意。我希望此规则可以创建与在代码库中创建的 java 测试文件中一样多的测试。

def junit_suite_test(name, srcs, deps, size="small", resources=[], classpath_resources=[], jvm_flags=[], tags=[], data=[]):
tests = []
package = PACKAGE_NAME.replace("src/test/java/", "").replace("/", ".")
for src in srcs:
  if src.endswith("Test.java"):
    if "/" in src:
       src = package + "." + src.replace("/", ".")
    tests += [src.replace(".java", ".class")]

native.genrule(
name = name + "-AllTests-gen",
outs = ["AllTests.java"],
cmd = """
  cat <<EOF >> $@
package %s;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({%s})
public class AllTests {}
EOF
   """ % (package, ",".join(tests))
)
native.java_test(
  name = name,
  srcs = srcs + ["AllTests.java"],
  test_class = package + ".AllTests",
  resources = resources,
  classpath_resources = classpath_resources,
  data = data,
  size = size,
  tags = tags,
  jvm_flags = jvm_flags,
  deps = deps + [
  ],
)
嗨,

你可以做这样的事情:

[java_test(name = s[:-5], srcs = s) for s in glob(["*.java"])]

这将在每个 java 文件的测试目标上创建。

使用该方法,宏将如下所示:

def junit_suite_test(name, srcs, deps, size="small", resources=[], classpath_resources=[], jvm_flags=[], tags=[], data=[]):
    [native.java_test(
        name = name,
        srcs = src,
        resources = resources,
        classpath_resources = classpath_resources,
        data = data,
        size = size,
        tags = tags,
        jvm_flags = jvm_flags,
        deps = deps,
  ) for src in srcs if src.endswith("Test.java")]

当然,您可能需要一些适应才能获得良好的资源。

但是,我建议不要在您的解决方案中执行此操作,因为过多的并行性实际上可能会变慢。测试日志和XML文件将报告实际失败的测试用例,您可以使用shard_count来提高并行性确实需要。

最新更新