簡體   English   中英

如何在Java中獲得最佳的代碼覆蓋率?

[英]How to get the best code coverage in Java?

有幾種工具可以計算一組測試的路徑覆蓋率,但是是否有一種工具(或算法)可以建議值,以盡可能少的測試次數獲得最佳路徑覆蓋率?

例如,以下類:

public class User {

    private boolean isAdmin = false;
    private String name;
    private String password;

    public User(String name, String password, boolean isAdmin) {
        this.name = name;
        this.password = password;
        this.isAdmin = isAdmin;
    }

    public boolean isAdmin() {
        return isAdmin;
    }

    public boolean authenticate(String name, String password) {
        if (name.equals(this.name) && password.equals(this.password)) {
        return true;
        } else {
            return false;
        }
    }
}

public class DataRepository {

    List<String> data = new ArrayList<String>();

    public void add(String dataPiece) {
        data.add(dataPiece);
    }

    public void clearAll(User userAuthenticated) {
        if (userAuthenticated.isAdmin()) {
            data.clear();
        }
    }

    public void addAll(User userAuthenticated, List<String> collection) {
        if (userAuthenticated.isAdmin()) {
            data.addAll(collection);
        }
    }
}

如果我創建一個使用isAdmintrueUser的測試,我將獲得更好的測試覆蓋率。

有沒有可以提及的工具:如果使用isAdmintrue的 User創建測試,則將獲得最佳的測試覆蓋率。

諸如此類,但適用於更復雜的情況,它會檢查所有代碼分支。

您所說的是什么“價值”?

代碼覆蓋率通過檢查在特定會話期間執行了哪些行/方法/類等來工作。 這通常在運行自動化單元測試時使用,但不是必須的(例如,您可以在將Web應用程序部署到煙霧測試之前對其進行檢測,以了解在臨時測試中未涵蓋哪些代碼路徑) 。

擴大覆蓋范圍的方法僅是確保在要測量的內容(例如單元測試)的上下文中,調用帶有執行更多內部分支的參數的更多方法。 沒有工具是要確切地告訴你寫什么要做到這一點-他們強調什么也沒有經過測試,它是由你來編寫測試,將這樣做。

除非您的問題是“哪個覆蓋率工具可以提供最高的覆蓋率度量”,否則在評估適用性時這是一個糟糕的標准。

編輯-您還需要意識到測試的目的不是獲得良好的覆蓋率 代碼覆蓋率僅用於顯示絕對未測試的代碼。 在沒有任何有用的測試的情況下,一個類仍然可以具有100%的覆蓋率(例如,瑣碎的,沒有任何斷言的測試-或更常見的是,對於某些失敗的值其斷言也可以通過的測試)。

因此,如果僅出於覆蓋范圍的目的編寫測試,則測試將是垃圾,不會為您提供任何幫助。 編寫測試時,最初僅考慮類的功能,只有當您認為“我完成了”時,才通過覆蓋率工具運行測試。 使用該工具的輸出,可以查看尚未執行的代碼塊,這可能表明您需要編寫更多通過不同輸入傳遞的測試。 最重要的是,編寫測試時,請始終確定要測試的內容以及應該通過和失敗的輸出。

Clover的功能是向您顯示未經測試的,高度復雜的代碼。 這很好,因此您不必浪費時間通過測試getter和setter來增加代碼覆蓋率。

許多工具可以計算函數的圈復雜度。 如果此值過高,您將無法測試該功能的所有排列。

代碼覆蓋是一種手段,而不是目的。 代碼覆蓋率不能證明代碼正確,並且覆蓋率工具僅在幫助您發現錯誤時才有用。

要回答有關建議測試值的問題,您可以查看Agitar( http://www.agitar.com/ )。 我記得很早以前就進行過一次介紹,並且我確定從那以后它已經發生了變化(希望更好),但這可能正是您想要的。 我本人將繼續走TDD之路,以及我在其他答復中提到的其他內容,但是,如果您有興趣,這是Agitar網站必須說的一小部分內容:

“ AgitarOne產品系列可幫助您在開發和維護Java應用程序時更安全,更好,更智能地工作。AgitarOneJUnit Generator在您的代碼上創建了全面的JUnit測試。這有助於您查找回歸並使其更安全,更輕松地改進您的代碼,降低維護成本。”

測試驅動開發。 如果您想獲得最大的覆蓋范圍,則可以嘗試將所有編寫的代碼驅逐出去。 它需要很多紀律,並且在配對程序時會更好,但是如果正確執行,我希望代碼覆蓋率為100%。

另一個技巧是最大程度地減少您編寫的單元測試的數量,該單元測試是在原子地測試單個類的情況下進行的,從而避免了其他類的出現。 最強大的測試(例如,系統測試或驗收測試或任何您想要稱呼的測試)是從類鏈中較高的級別開始(如果可能,請在應用程序的入口點),然后再進行不存根或嘲笑任何東西。 最糟糕的是,您將運行一個僅與包含測試數據的內存數據庫(例如hsqldb)通信的完整系統。 編寫這樣的測試將有助於減少您擁有的測試類(因​​此減少測試)的數量,並且還使得重構生產代碼以及將來在添加新功能時維護這些測試變得更加容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM