如何使用junit和Eclemma增加测试覆盖率?

时间:2014-10-10 13:44:54

标签: java 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%。

1 个答案:

答案 0 :(得分:3)

100%代码覆盖率意味着每行代码都被测试覆盖。

换句话说,您的测试代码应该调用并查看已编写的所有内容,并确保其按预期工作。

在您的情况下,这意味着必须调用所有方法,并且必须测试每个if-else案例。


即使 100%代码覆盖率非常性感,最重要的是测试套件的质量。

85%的代码覆盖率可能接近完美,如果剩下的所有 15%都是一些getter / setter,调用无用的外部API检查,粘合代码是非常非常难以测试等等。您应该了解哪些代码可以并且应该进行测试以及可以在不知道您在应用程序中留下漏洞(和炸弹?)的情况下留下什么代码。