Как увеличить тестовое покрытие с помощью 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%.


person Joao Victor    schedule 10.10.2014    source источник


Ответы (1)


100% покрытие кода означает, что каждая строка кода проходит тест.

Другими словами, ваш тестовый код должен вызвать и пройти через все, что было написано, и убедиться, что все работает так, как ожидалось.

В вашем случае это означает, что все методы должны быть вызваны и каждый случай if-else if должен быть проверен.


Несмотря на то, что 100% покрытие кода — это очень привлекательно, важнее всего качество вашего набора тестов.

85 % покрытия кода может быть почти идеальным, если все 15 % — это несколько геттеров/сеттеров, вызовы внешних API, которые бесполезно проверять, связующий код, который очень-очень трудно тестировать и так далее. Вам решать, какой код можно и нужно тестировать, а какой можно оставить, не зная, что вы оставляете дыры (и бомбы?) в своем приложении.

person Jean Logeart    schedule 10.10.2014
comment
Итак, как я должен писать свои тесты? В каждом методе тестирования я должен помещать assertEquals или assertFalse для каждого возможного результата? - person Joao Victor; 10.10.2014