我目前正在开发一个项目,我需要运行JUnit测试用例,然后从Target Class(正在测试的类)中提取信息。为了提取所涵盖的语句,我使用了eclEmma,但是使用这个工具我只能提取运行测试类后在Target中执行的行号。
我想在if语句中提取分支决策的布尔值,以导出在覆盖目标类的特定真/假分支时验证哪些条件。
我知道我可以使用JavaParser解析Java文件,然后提取以下信息,但我不知道如何提取分支决策的布尔值。
public void visit(IfStmt stmt, Void arg)
{
System.out.println(stmt.getCondition());
System.out.println(stmt.getElseStmt());
System.out.println(stmt.getThenStmt());
super.visit(stmt, null);
}
答案 0 :(得分:2)
EclEmma基于JaCoCo code coverage library并简单地将其集成到Eclipse中,实际工作(仪器和分析)由JaCoCo执行。
JaCoCo执行字节码分析,而不是源代码。源代码仅用于可视化字节码分析的结果(通过突出显示进行装饰)。字节码只包含有关行的信息,所以不幸的是,将字节码分支映射回源代码根本不是一项简单的任务,并且与解析源代码没有多少共同之处。这就是为什么JaCoCo不提供开箱即用的原因。然而,在这个问题上做了一些实验性工作。有关更多详细信息,请查看以下链接:
欢迎向JaCoCo捐款,所以如果有人能够可靠地实施这样的映射 - 请毫不犹豫地回馈。
答案 1 :(得分:-1)
你是在正确的方式:你可以使用IfStmt
上的访问者,就像你一样,你想要提取条件(这是括号中显示的值),所以你得到:
public void visit(IfStmt stmt, Void arg) {
System.out.println(stmt.getCondition());
super.visit(stmt, null);
}
然后我不知道你想用它做什么:你可以打印代码,当然还是可以进一步分析。
免责声明:我是JavaParser撰稿人