询问现有测试框架是否已实现接口与类的方法测试覆盖检查
现有测试框架是否已实现按接口/实现类强制测试覆盖的检查?
我需要编写单元测试来确保类/接口中定义的所有方法都有对应的单元测试覆盖。当前场景是存在一个接口及多个实现该接口的类,部分方法对性能要求极高,还有不少复制粘贴后修改的代码,因此必须保证每个实现类的单元测试满足两点:
- 覆盖接口中声明的所有方法
- 覆盖类自身声明的所有方法
这类检查的核心作用:
- 找出复制粘贴后未修改的代码
- 找出必须重定义的父类继承方法
我自己实现了一个自定义的TestCoverage工具(遵循测试类和方法以"Test"结尾的编码规范),代码如下:
import java.lang.reflect.Method; import java.util.Arrays; import java.util.stream.Collectors; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; public class TestCoverage { public static void check(Class appClass, Class testingClass) { assertTrue("testingClass must end with \"Test\"", testingClass.getSimpleName().endsWith("Test")); var appMethodNamesToTest = Arrays.stream(appClass.getDeclaredMethods()) // .filter(m -> !Modifier.isStatic(m.getModifiers())) .map(Method::getName) .filter(s -> !s.contains("$")) // filter out $jacocoInit .map(s -> s + "Test") .collect(Collectors.toList()); var testingMethodNames = Arrays.stream(testingClass.getDeclaredMethods()) .map(Method::getName) .filter(s -> s.endsWith("Test")) .collect(Collectors.toSet()); var missingMethods = appMethodNamesToTest.stream() .filter(methodName -> !testingMethodNames.contains(methodName)) .collect(Collectors.joining(", ")); if (!missingMethods.isEmpty()) { fail("missing test methods in " + testingClass.getSimpleName() + ": " + missingMethods); } } }
工具的使用示例如下:
public class FooTest { // unit tests go here @Test public void coverageTest() { TestCoverage.check(Baar.class, getClass()); // interface TestCoverage.check(Foo.class, getClass()); // implementing class } }
这个工具能提前预警未被测试覆盖的方法,但严格来说coverageTest()并不是标准的单元测试。
需要明确的是,我的需求和常规覆盖率工具完全不同,我关注的是按接口的测试覆盖,而非按方法的测试覆盖。举个典型场景:
interface I { void a(); void b(); default void c() {...} } class A { // defines a() and b(); the default c() is correct } class B { // defines a() and b(); the default c() is correct } class C { // defines a() and b(); the default c() is NOT correct }
常规覆盖率工具不会强制开发者为C重定义c()——只要I.c()被某个测试覆盖,覆盖率就显示正常,但C.c()未重定义的问题根本不会被标记。而我的TestCoverage.check()会强制开发者为A.c()、B.c()、C.c()都编写测试,进而发现C必须重定义c()的需求。简言之,我要确保每个实现类的测试都覆盖接口的所有方法。
现在想知道,现有测试框架中是否已经实现了这类检查?
内容的提问来源于stack exchange,提问作者18446744073709551615
相关产品推荐
相关产品推荐

