使用 PIT 查找无用的单元测试
Finding useless unit tests with PIT
假设我们有一个要测试的代码:
class C {
int doSmth() {
return 1;
}
}
现在假设我们在单个 class 中放置了 2 个单元测试。
第一个 "test everything" 而第二个 "does nothing":
@RunWith(JUnit4.class)
public final class CTest {
@Test
@SuppressWarnings("static-method")
public void testDoSmth() {
assertEquals(1, new C().doSmth());
}
@Test
@SuppressWarnings("static-method")
public void testDoSmth2() throws Exception {
Thread.sleep(1000);
}
}
这是一个 IRL 示例:我已经看到许多测试 "fixed" 通过用一些无用的代码替换测试内容,
随着被测试代码的契约随时间而变化。
现在,PIT "entry" 单元是一个 class 包含测试方法(不是单独的测试方法本身),
所以在上面的例子中,PIT 不仅会显示 100% 的行覆盖率,还会显示 100% 的突变覆盖率。
好的,知道我有 100% 的突变覆盖率,我感到很欣慰,
但是我如何识别一个无用的测试——在上面的例子中是testDoSmth2()
(前提是我的突变覆盖率很高)?
pitest 目前没有内置任何内容,但是您需要检测无用(在检测故障方面)测试的数据已经存在。
XML 报告输出每个突变的杀死测试(通常在测试方法级别)。可以删除任何不会杀死突变的测试而不影响突变分数。
当然,由于其他原因,例如,不杀死突变的测试可能仍然有价值。描述一个单元的作用。
然而,静态分析可以更有效地检测您示例中显示的极端情况 - 测试显然不会执行任何代码,因此不可能检测到其中的错误
我开发了一个手动方法
https://www.codeproject.com/Articles/4051293/Unit-Test-Suite-Quality-Estimation
不过 PIT 可以给你一些提示。
假设我们有一个要测试的代码:
class C {
int doSmth() {
return 1;
}
}
现在假设我们在单个 class 中放置了 2 个单元测试。 第一个 "test everything" 而第二个 "does nothing":
@RunWith(JUnit4.class)
public final class CTest {
@Test
@SuppressWarnings("static-method")
public void testDoSmth() {
assertEquals(1, new C().doSmth());
}
@Test
@SuppressWarnings("static-method")
public void testDoSmth2() throws Exception {
Thread.sleep(1000);
}
}
这是一个 IRL 示例:我已经看到许多测试 "fixed" 通过用一些无用的代码替换测试内容, 随着被测试代码的契约随时间而变化。
现在,PIT "entry" 单元是一个 class 包含测试方法(不是单独的测试方法本身), 所以在上面的例子中,PIT 不仅会显示 100% 的行覆盖率,还会显示 100% 的突变覆盖率。
好的,知道我有 100% 的突变覆盖率,我感到很欣慰,
但是我如何识别一个无用的测试——在上面的例子中是testDoSmth2()
(前提是我的突变覆盖率很高)?
pitest 目前没有内置任何内容,但是您需要检测无用(在检测故障方面)测试的数据已经存在。
XML 报告输出每个突变的杀死测试(通常在测试方法级别)。可以删除任何不会杀死突变的测试而不影响突变分数。
当然,由于其他原因,例如,不杀死突变的测试可能仍然有价值。描述一个单元的作用。
然而,静态分析可以更有效地检测您示例中显示的极端情况 - 测试显然不会执行任何代码,因此不可能检测到其中的错误
我开发了一个手动方法 https://www.codeproject.com/Articles/4051293/Unit-Test-Suite-Quality-Estimation 不过 PIT 可以给你一些提示。