2014-10-10 42 views
0

我有一個簡單的類:如何使用junit和Eclemma增加測試覆蓋率?

public class NPP { 

    // inputs 
    public int m__water_pressure = 0; 
    public boolean m__blockage_button = false; 
    public boolean m__reset_button = false; 

    public int old_m__pressure_mode = 0; 
    public boolean old_m__reset_button = false; 
    public boolean old_m__blockage_button = false; 
    public int old_m__water_pressure = 0; 

    // outputs 
    public int c__pressure_mode = 0; 
    public boolean c__the_overriden_mode = false; 
    public int c__the_safety_injection_mode = 0; 

    public int p__pressure_mode = 0; 
    public boolean p__the_overriden_mode = false; 
    public int p__the_safety_injection_mode = 0;  

    public void method__c__pressure_mode() { 
     if (m__water_pressure >= 9 && old_m__water_pressure < 9 && c__pressure_mode == 0) { 
      p__pressure_mode = 1; 
     } else if (m__water_pressure >= 10 && old_m__water_pressure < 10 && c__pressure_mode == 1) { 
      p__pressure_mode = 2; 
     } else if (m__water_pressure < 9 && old_m__water_pressure >= 9 && c__pressure_mode == 1) { 
      p__pressure_mode = 0; 
     } else if (m__water_pressure < 10 && old_m__water_pressure >= 10 && c__pressure_mode == 2) { 
      p__pressure_mode = 1; 
     } 
    } 

    public void method__c__the_overriden_mode() { 
     if (m__blockage_button == true && old_m__blockage_button == false && m__reset_button == false && !(c__pressure_mode==2)) { 
      p__the_overriden_mode = true; 
     } else if (m__reset_button == true && old_m__reset_button == false && !(c__pressure_mode==2)) { 
      p__the_overriden_mode = false; 
     } else if (c__pressure_mode==2 && !(old_m__pressure_mode==2)) { 
      p__the_overriden_mode = false; 
     } else if (!(c__pressure_mode==2) && old_m__pressure_mode==2) { 
      p__the_overriden_mode = false; 
     } 
    } 

    public void method__c__the_safety_injection_mode() { 
     if (c__pressure_mode == 0 && c__the_overriden_mode == true) { 
      p__the_safety_injection_mode = 0; 
     } else if (c__pressure_mode == 0 && c__the_overriden_mode == false) { 
      p__the_safety_injection_mode = 1; 
     } else if (c__pressure_mode == 1 || c__pressure_mode == 2) { 
      p__the_safety_injection_mode = 0; 
     } 
    } 

} 

,我已經寫了這個JUnit類:

import static org.junit.Assert.*; 

import org.junit.Test; 


public class NPPTest { 

    @Test 
    public void testMethod__c__pressure_mode() { 
     NPP npp = new NPP(); 
     npp.m__water_pressure = 3; 
     npp.old_m__water_pressure = 5; 
     npp.c__pressure_mode = 2; 
     npp.method__c__pressure_mode(); 
     assertEquals(1, npp.p__pressure_mode);   
    } 

    @Test 
    public void testMethod__c__the_overriden_mode() { 
     NPP npp = new NPP(); 
     npp.m__blockage_button = false; 
     npp.old_m__blockage_button = true; 
     npp.m__reset_button = false; 
     npp.method__c__the_overriden_mode(); 
     assertFalse(npp.p__the_overriden_mode); 

    } 

    @Test 
    public void testMethod__c__the_safety_injection_mode() { 
     NPP npp = new NPP(); 
     npp.c__pressure_mode = 2; 
     npp.c__the_overriden_mode = false; 
     npp.method__c__the_safety_injection_mode(); 
     assertEquals(1, npp.p__the_safety_injection_mode); 

    } 

} 

我被要求寫一些測試,覆蓋代碼覆蓋率100%。但究竟是什麼意思?我怎樣才能做到這一點?我跑Eclemma,我只有46%。

回答

3

100%代碼覆蓋率意味着每行代碼都被測試覆蓋。

換句話說,您的測試代碼應該調用並瀏覽所有已寫入的內容,並確保它按預期工作。

就你而言,這意味着所有的方法都必須被調用,並且每個if-else if case都必須被測試。


即使100%的代碼覆蓋率很性感,最重要的是你的測試套件的質量。

85%的代碼覆蓋率可能是近乎完美的,如果所有的15%左邊是一些getter/setter方法,調用外部的API,是沒用的檢查,膠水代碼,這是非常非常難以測試等。您應該瞭解哪些代碼可以進行測試,以及在不知道您在應用程序中留下漏洞(和炸彈?)的情況下可以留下哪些代碼。

+0

那麼,我應該如何寫我的測試?在每種測試方法中,我應該爲每個可能的結果放置assertEquals或assertFalse? – 2014-10-10 13:56:06

相關問題