如何在 Bazel 中为 java 测试编写扩展规则?
how to write extended rule for java test in Bazel?
我目前想的是用 junit 创建一个 AllTest
和 运行 它。但是,我对此并不满意。我希望此规则可以创建与代码库中创建的 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 来增加并行度。
我目前想的是用 junit 创建一个 AllTest
和 运行 它。但是,我对此并不满意。我希望此规则可以创建与代码库中创建的 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 来增加并行度。