如何在Bazel中编写java测试的扩展规则?

如何在Bazel中编写java测试的扩展规则?,bazel,Bazel,我现在想的是创建一个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/ja

我现在想的是创建一个
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 + [
  ],
)
def junit_suite_test(name,srcs,deps,size=“small”,resources=[],classpath_resources=[],jvm_flags=[],tags=[],data=[]):
测试=[]
package=package_NAME.replace(“src/test/java/”,“”)。replace(“/”,“”)
对于src中的src:
如果src.endswith(“Test.java”):
如果src中有“/”:
src=程序包+“+src.replace”(“/”,“)
tests+=[src.replace(“.java”,“.class”)]
native.genrule(
name=name+“-AllTests gen”,
outs=[“AllTests.java”],
cmd=”“”
猫$@
包%s;
导入org.junit.runner.RunWith;
导入org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({%s})
公共类AllTests{}
EOF
“%”(包“,”.join(测试))
)
native.java_测试(
name=name,
srcs=srcs+[“AllTests.java”],
test_class=package+“.AllTests”,
资源=资源,
类路径资源=类路径资源,
数据=数据,
尺寸=尺寸,
标签=标签,
jvm\u标志=jvm\u标志,
deps=deps+[
],
)

您好,您可以这样做:

[glob([“*.java]”)中s的java_测试(name=s[:-5],srcs=s)]

这将在每个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来增加真正需要的并行性。

您好,您可以这样做:

[glob([“*.java]”)中s的java_测试(name=s[:-5],srcs=s)]

这将在每个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来提高并行性,这是非常必要的。

您具体不满意什么?如果我总共有28个测试,这种方法将所有测试合并到一个测试中。但我希望每个测试都可以单独运行。您对什么不满意?如果我总共有28个测试,那么这种方法将所有测试合并到一个测试中。但我希望每个测试可以单独运行。