【问题标题】:How to extract the boolean value of the branch decision?如何提取分支决策的布尔值?
【发布时间】:2016-12-07 07:17:46
【问题描述】:

我目前正在开展一个项目,我需要在该项目中运行 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);
    }

【问题讨论】:

标签: java parsing junit eclemma javaparser


【解决方案1】:

EclEmma 基于JaCoCo code coverage library 并简单地将其集成到 Eclipse 中,实际工作(仪器和分析)由 JaCoCo 执行。

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

欢迎向 JaCoCo 投稿,因此,如果有人能够可靠地实现此类映射 - 请不要犹豫,回馈。

【讨论】:

    【解决方案2】:

    您的方法是正确的:您可以在 IfStmt 上使用访问者,就像您所做的那样,并且您想要提取条件(这是出现在括号中的值)所以您得到:

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

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

    免责声明:我是 JavaParser 贡献者

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-13
      • 2020-04-04
      • 1970-01-01
      • 2017-10-18
      • 2013-06-28
      • 2017-10-13
      • 2013-12-12
      相关资源
      最近更新 更多