2016-12-07 40 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