0

我目前正在做一个项目,我需要在其中运行 JUnit 测试用例,然后从目标类(正在测试的类)中提取信息。为了提取所涵盖的语句,我使用了 eclEmma,但是使用这个工具我只能提取运行测试类后在目标中执行的行号。

我想在 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);
    }
4

2 回答 2

2

EclEmma 基于JaCoCo 代码覆盖库并简单地将其集成到 Eclipse 中,实际工作(检测和分析)由 JaCoCo 执行。

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

欢迎对 JaCoCo 做出贡献,因此如果有人能够可靠地实现此类映射 - 请不要犹豫,回馈。

于 2016-12-09T22:14:56.620 回答
-1

你是在正确的方式:你可以使用一个访问者IfStmt,就像你做的那样,你想提取条件(这是出现在括号中的值)所以你得到:

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

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

免责声明:我是 JavaParser 贡献者

于 2016-12-07T07:43:36.150 回答