JUnit测试:如何在不丢失分支的情况下测试语句?

时间:2017-03-07 07:25:14

标签: java eclipse junit code-coverage eclemma

我已经运行EclEmma来覆盖我的JUnit测试用例,并且已经达到了100%。但是,在覆盖率为82%或95%的情况下,我的代码旁边会显示一条消息,说“错过了2个分支中的1个”,我似乎无法解决此问题。

在查看我的课程后,我注意到这条消息只出现在我的if语句旁边,这就是让我的测试不受100%覆盖的原因。

我想我问是否有人知道如何在JUnit中测试if语句,以免错过任何分支。

这是我要测试的代码:

private double height;
    public void setHeight(double height){
        if(height <=0){
            this.height = 0;
        }
        else{
            this.height = height;
        }
    }//method close

(我正在使用JUnit 4)

2 个答案:

答案 0 :(得分:3)

简单:

希望在您测试的方法中有一个不同的测试用例路径;像:

  • testSetHeightWithNegativeValue()
  • testSetHeightWithZeroValue()
  • testSetHeightWithPositiveValue

它们中的每一个都为您测试的方法提供了特定的输入,并检查了预期的输出。

真正的用处是:考虑思考你的代码。您不需要覆盖工具来确定您需要对方法进行更多测试。相反:你看看你的方法,思考它在做什么;然后你写了测试用例。

告诉你你做了正确的事;但是&#34;做正确的事情&#34;是你应该努力做的事情;而不是满足一些数字。

并且,正如评论所指出的那样:考虑使用TDD方法:当您在之前编写测试时,创建&#34;匹配&#34;一段生产代码,然后你做出那个&#34;思考&#34;部分是您工作程序的基本要素。

答案 1 :(得分:1)

您的代码

public void setHeight(double height){
    if(height <=0){
        this.height = 0;
    }
    else{
        this.height = height;
    }
}

有两个可能的分支:

height <= 0

public void setHeight(double height){
     this.height = 0;
}

height > 0

public void setHeight(double height){
    this.height = height;
}

因此,在if语句中,您可以转到else中的一个或另一个语句。您必须创建两个单元测试以涵盖所有可能的方式 - 一个用于参数传递height > 0,另一个用于height <= 0