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