【问题标题】:JUnit Testing: How To Test If Statements Without Missing A Branch?JUnit 测试:如何在不丢失分支的情况下测试 If 语句?
【发布时间】:2017-03-07 07:25:13
【问题描述】:

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

【问题讨论】:

  • 呼叫setHeight 用一个负数、一个正数,也许用0。真的,你到底在问什么?
  • 所以,测试高度 0。这将覆盖两个分支。
  • 顺便说一句:用 == 比较双精度在 Java(和其他语言)中是不安全的。 stackoverflow.com/questions/25160375/…
  • 您是否必须拥有 100% 的覆盖率?我认为没有必要对代码进行大量覆盖,只要合理的百分比就可以了。覆盖所有分支和代码行并不能保证您的代码是正确的。也许你可以报道更多真实的案例。
  • @Rainer 抱歉,我再也听不到这种废话了。将双打与 == 进行比较有时并不安全,但有时却是。在这里,使用

标签: java eclipse junit code-coverage eclemma


【解决方案1】:

简单:

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

  • testSetHeightWithNegativeValue()
  • testSetHeightWithZeroValue()
  • testSetHeightWithPositiveValue

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

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

Coverage 可以告诉你你做了正确的事;但“做正确的事”是你自己应该努力去做的;而不是为了满足一些数字。

而且,正如 cmets 指出的那样:考虑使用 TDD 方法:当您编写测试时创建“匹配”的生产代码片段,然后进行“思考”是您工作程序的重要组成部分。

【讨论】:

  • 好吧,考虑到 TDD,您甚至应该在编写方法之前编写测试用例 (stackoverflow.com/questions/804569/…)
  • 再次运行测试并获得 100% 的覆盖率。感谢您的帮助!
  • @Rainer 我想过 TDD,但忘了提;刚刚更新了我的答案。
【解决方案2】:

你的代码

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

有两个可能的分支:

height &lt;= 0

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

height &gt; 0

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 2020-06-22
    • 2016-12-16
    相关资源
    最近更新 更多