记录TestNG测试用例

时间:2011-11-18 08:59:07

标签: java testng

有没有办法记录testNG测试用例,以便自动生成文档?我想象的是:

@Description("This testcase checks, whether the system is alive")
@Step("Check whether services are running")
@Step("Try to access the system webpage")
...
@Test(groups={"sanity"})
public void checkStatus() {
...
}

我考虑了两个选项:自定义注释处理和为javadoc编写自己的doclet。在我尝试任何这些选项之前,我想知道,是否有一种标准的方法。我肯定希望重用当前的testNG注释,尤其是测试的分组。

最后但并非最不重要的是,我想提一下,我想将这种方法仅用于系统级测试(非单元测试),我非常复杂,并且不容易说出测试的作用是什么测试名称或其代码。

1 个答案:

答案 0 :(得分:5)

最后,我自己弄清楚了。我使用javadoc结合一点注释处理(只是为了区分测试用例组)。我使用自定义doclet,它首先按以下方式构建测试用例列表:

private MethodDoc[] getTestMethods(RootDoc root) {
    List<MethodDoc> result = new ArrayList<MethodDoc>();
    for (ClassDoc c : root.classes()) {
        for(MethodDoc m : c.methods()) {
            if (isTest(m))
                result.add(m);
        }
    }
    return result.toArray(new MethodDoc[0]);
}

// simplified test detection
private static boolean isTest(MethodDoc m) {
    for(AnnotationDesc a: m.annotations()) {
        if (a.annotationType().name().equals("Test"))
            return true;
    }
    return false;
}

然后,对于每个测试,我检索一组组:

static Set<String> getMethodGroups(MethodDoc m) {
    Set<String> result = getGroups(m);
    result.addAll(getGroups(m.containingClass()));
    return result;
}

static Set<String> getGroups(ProgramElementDoc m) {
    Set<String> result = new HashSet<String>();
    for(AnnotationDesc a: m.annotations()) {
        if (a.annotationType().name().equals("Test")) {
            for(ElementValuePair ev : a.elementValues()) {
                if (ev.element().name().equals("groups")) {
                    String value = ev.value().toString();
                    StringTokenizer tokenizer = new StringTokenizer(value, "{}\", ");
                    while (tokenizer.hasMoreElements()) {
                        result.add(tokenizer.nextToken());
                    }
                }
            }
        }
    }
    return result;
}

其余的只是标准的doclet处理。另外,我发现我可以直接在javadoc中使用自定义标签,例如

/**
 * Some description
 * @Step Step 1
 * @Step Step 2
*/
void someMethod() {}