2017-05-28 38 views
0

我目前的想法是创建一个AllTest并运行它与junit。但是,我不满意它。我希望这个规则可以创建尽可能多的测试代码中创建的许多Java测试文件。如何在Bazel中为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 >> [email protected] 
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 + [ 
    ], 
) 
+0

你有什么特别不满意? – Ittai

+0

如果我总共有28个测试,这种方法将所有的测试结合在一起成为一个测试。但我希望每个测试都可以单独运行。 – zhexuany

回答

2

嗨,你可以做这样的事情:

[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来增加并行性。