java - 你的代码覆盖率有多远?

标签 java tdd code-coverage emma

<分区>

我最近开始使用代码覆盖工具(特别是 Emma 和 EclEmma),我真的很喜欢它给我的单元测试完整性的 View - 以及查看单元代码的哪些区域的能力测试根本没有命中。我目前在一个不进行大量单元测试的组织工作,我计划真正插入每个人进行单元测试、代码覆盖率和 TDD,并希望转变组织。

关于这个主题,我不确定的一个问题是我应该将我的代码覆盖率准确地提高到什么程度。例如,如果我有这样一个类:

//this class is meant as a pseudo-enum - I'm stuck on Java 1.4 for time being
public final class BillingUnit {

    public final static BillingUnit MONTH = new BillingUnit("month");
    public final static BillingUnit YEAR = new BillingUnit("year");

    private String value;

    private BillingUnit(String value) {
        this.value = value;
    }

    public String getValue() {
        return this.value;
    }

    public boolean equals(Object obj) {
        return value.equals(((BillingUnit) obj).getValue());

    }

    public int hashCode() {
        return value.hashCode();
    }
}

我写了一些简单的单元测试来确保 equals() 正常工作,getValue() 返回我所期望的,等等。但由于视觉特性在 EclEmma 中,hashcode() 方法显示为鲜红色,表示“未测试”。

在这个例子中,考虑到实现的简单程度,是否值得甚至费心测试 hashCode()?我觉得我会为此方法添加一个单元测试,只是为了提高代码覆盖率,并摆脱 EclEmma 添加到这些行的明显红色突出显示。

也许我有点神经质和强制症,但我发现使用像 EclEmma 这样的东西可以很容易地看到什么是未经测试的——这个插件用红色突出显示源代码,用绿色突出显示覆盖的代码——真的我想尽可能多地争取 100% 绿色类(class) - 即使它不会增加太多好处。

最佳答案

我使用代码覆盖来提示我可能有一组不完整测试的地方。例如,我可能会为某些给定的功能编写测试,然后去开发满足该功能的代码,但这样做实际上编写的代码比预期的要多——比如说它可能会在另一种情况下捕获异常测试不执行。当我使用覆盖率分析器时,我可以看到我引入了没有关联测试的代码。它帮助我知道什么时候我没有编写足够的测试。

另一方面,覆盖率分析可能导致错误的安全性。覆盖所有代码并不意味着您有足够的测试。您需要从代码应该做什么的角度来考虑测试,并编写测试以确保它做到了。最好先编写测试。仅仅因为您的代码被完全覆盖并不意味着该代码执行了它应该执行的操作。

在您的示例中,我会在编写代码之前为 hashCode 编写测试以定义该方法的功能。因此,我会涵盖它。这并不意味着我总是有 100% 的覆盖率。例如,我并不太热衷于为简单的访问器编写测试。我也可能不会测试我从框架继承的父类的方法,因为我觉得不需要测试其他人的代码。

关于java - 你的代码覆盖率有多远?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/253587/

相关文章:

ruby-on-rails - Michael Hartl Rails 教程 : assert_not does exact opposite of what it should and I don't understand why

java - 我的示例应用程序使用了多少 SDK 的 API

java - 有没有办法在候选列表中测试枚举值? ( java )

asp.net-mvc - 多层 MVC4 TDD

TDD 和模拟

code-coverage - MC/DC - 如何管理非 100% 覆盖率的决策

android - JaCoCo 使用 Kotlin 和 Android 3.0 返回 0% 覆盖率

java - 在 ColdFusion 中以编程方式验证邮件服务器连接

java - 基于原始身份验证在 session 超时后动态重定向用户

java - Spring 集成: Passing URL/Query Params programatically