JUnit 测试:如何在不遗漏分支的情况下测试 if 语句?

JUnit Testing: How To Test If Statements Without Missing A Branch?

我有 运行 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)

简单:

希望在被测方法中每个路径有一个不同的测试用例;喜欢:

  • testSetHeightWithNegativeValue()
  • testSetHeightWithZeroValue()
  • testSetHeightWithPositiveValue

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

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

报道可以告诉你你做了正确的事;但是"doing the right thing"是你自己应该努力做到的;而不是满足一些数字。

并且,正如评论所指出的:考虑使用 TDD 方法:当您编写测试时 before 您创建了 "matching" 产品代码,然后您使 "thinking" 部分成为您工作程序的基本要素。

您的代码

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