java - 如何使用 junit 和 Eclemma 提高测试覆盖率?

标签 java junit eclemma

我有一个简单的类(class):

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%。

最佳答案

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

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

就您而言,这意味着必须调用所有方法,并且必须测试每个 if-else if 情况。

<小时/>

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

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

关于java - 如何使用 junit 和 Eclemma 提高测试覆盖率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26300945/

相关文章:

java - jUnit 和 DateFormat(EclEmma 代码覆盖率)

java - EJB Façade 调用另一个 EJB 中的方法

java - JUnit 测试用例真的应该放在被测类旁边吗?

java - 将 Hibernate session 与 quartz 一起使用

java - 在Java中通过对象引用访问静态变量

java - 使用 EclEmma 的 Java 代码覆盖率不扫描预期的异常方法

java - 如何使用 JUnit、EasyMock 或 PowerMock 模拟静态最终变量

java - 用于 Spring 缓存管理器的 Junit

eclipse - Eclemma:Eclipse 中输入 URL 无效错误

java - 如何忽略使用 EclEmma 和 Eclipse 扫描某些类?