如何提取分支机构决策的布尔值



我当前正在研究一个我需要运行junit测试用例的项目,然后从目标类中提取信息(类被测试)。为了提取所涵盖的语句,我使用了eclemma,但是使用此工具,我只能提取运行测试类后在目标中执行的行号。

我想在if-Statement中提取分支决策的布尔值,以得出覆盖目标类的特定true/false分支时验证的条件。

我知道我可以使用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);
    }

eclemma基于jacoco代码覆盖库库,仅将其集成到eclipse中,实际工作(仪器和分析)由jacoco执行。

jacoco执行字节码的分析,而不是源代码。源代码仅用于可视化字节码分析的结果(通过突出显示)。字节码仅包含有关行的信息,因此不幸的是,将字节码分支映射回源代码根本不是一个琐碎的任务,并且与解析源代码没有太多共同点。这就是为什么jacoco未开箱即用的原因。然而,一些实验性的工作是在此主题上完成的。请查看以下链接以获取更多详细信息:

  • https://github.com/jacoco/jacoco/issues/87
  • https://github.com/jacoco/jacoco/wiki/waracterrangetable
  • https://github.com/jacoco/jacoco/pull/317

欢迎捐款到jacoco,因此,如果某人能够可靠地实施此类映射 - 请不要犹豫。

您处于正确的方式:您可以按照 IfStmt上的访问者使用访问者,就像您要提取条件(这是出现在括号上的值),以便您得到:

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

那么我不知道您想处理什么:您当然可以打印代码,也可以进一步分析。

免责声明:我是Javaparser贡献者

最新更新