IntelliJ IDEA:忽略代码覆盖中的琐碎方法

IntelliJ IDEA: ignore trivial methods in code coverage

在 IntelliJ IDEA 15.0.2 中,如何在测试覆盖率测量期间忽略琐碎的 getter 和 setter(琐碎的方法)?

// should be measure
public void complex() {
    fancy();
    interesting();
    dropDatabase();
}

// should not be measured
public int getNumber() {
    return this.number;
}

测量每一行将得到 75%。仅用上述方法测量结果为 100%。这些是 100% 可用于测试的代码。

为什么我在 Internet 上找不到任何相关信息?我是否陷入了不良做法?


更新

此代码也符合测试条件:

// should also be tested as it contains logic
public Integer getValidationProgress() {
    if (validationProgress == null) {
        validationProgress = 0;
    }
    return validationProgress;
}

JetBrains 告诉我目前不可能

Andrey Dernov (IntelliJ) Jan 6, 22:54

Hello Michael,

There is no setting to ignore a certain method.

我为此创建了一个 issue

一个更简单的例子:

public abstract class A {
    public static int add(int x, int y) {
        return x + y;
    }
}

这里 IntelliJ 的报道抱怨 A 的 not-tested 构造函数。我不得不写一些愚蠢的东西,比如

new A() {};

进入我的测试进行测试。如果我将这种方法用于助手 class

public final class A {
    private A() {}

    public static int add(int x, int y) {
        return x + y;
    }
}

我需要对 "test" 空代码使用反射:

final Class<?> clazz = Class.forName("package.name.of.A");
final Constructor<?> constructor = clazz.getDeclaredConstructors()[0];

constructor.setAccessible(true);
constructor.newInstance();

看起来并没有更聪明。

仍然没有办法做到这一点,这是一件好事。我理解你的痛苦,我也感受到了。

假设您的应用程序如果没有这些琐碎的 setter 和 getter,其代码覆盖率将达到 100%。这意味着除了琐碎的 setter 和 getter 之外,您的所有代码都通过您的测试套件进行了测试。

这提出了一个问题,为什么首先要有这些琐碎的方法。如果您的所有代码都是 运行 并且未调用这些方法,那么您的 100% 覆盖率是肤浅的。所有代码都是 运行,但并非所有用例都经过测试。这就是代码覆盖率具有欺骗性的确切原因。

有以下情况:

  1. 从未在任何地方调用这些方法,因此应将其删除。
  2. 方法在某处被调用,但您没有测试这些用例。在这种情况下,覆盖率 应该 低于 100%。
  3. 有这些方法是因为框架需要它们。在这种情况下,方法是直接与框架集成的代码的一部分,因此无论如何都应与其余代码分开。
  4. 和#3一样,但是你不能把代码分开,因为框架很笨。这可能是抑制某些方法覆盖率的有效案例,但使用这样的框架,您可能永远无法达到可接受的覆盖率。
  5. 这种情况让我感到痛苦:toString() 实现的唯一原因是测试失败的可读性更好。只有在测试失败时才会执行这些方法。只要测试套件是绿色的,它们就永远不会被覆盖。 *耸肩*