2016-12-07 78 views
0

我目前正在开发一个项目,在该项目中需要运行JUnit测试用例,然后从目标类(正在测试的类)中提取信息。为了提取覆盖的语句,我使用了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

可能重复的[Eclemma说4分支中没有1分支,但哪个分支是?](http://stackoverflow.com/questions/15493094/eclemma-says-1-of-4-branches-not-覆盖,但是,其分支 - 是 - 它) – Godin

回答

2

EclEmma基于JaCoCo code coverage library,只需提供其集成到Eclipse中,实际工作(仪器和分析)由JaCoCo执行。

JaCoCo执行字节码分析,而不是源代码。源代码仅用于可视化字节码分析的结果(通过突出显示进行装饰)。字节码仅包含有关行的信息,因此很遗憾,将字节码分支映射回源代码根本不是一项简单的任务,并且与解析源代码没有太大共同之处。这就是为什么JaCoCo没有提供这种开箱即用的原因。然而一些实验工作是在这个主题上完成的。有更多的细节以下链接看看:

捐款欢迎JaCoCo,所以如果有人能够可靠实现这样的映射 - 唐毫不犹豫地回馈。

-1

你是正确的方式:您可以使用IfStmt访客,完全按照你做,你要提取的条件(这是出现在括号内的值),所以您将获得:

public void visit(IfStmt stmt, Void arg) { 
    System.out.println(stmt.getCondition()); 
    super.visit(stmt, null); 
} 

然后我不知道你想用它做什么:你可以打印代码,当然也可以进一步分析。

免责声明:我贡献了JavaParser