覆盖率与可达代码

Rrr*_*Rrr 5 java junit unit-testing code-coverage mocking

问:如何检测真实的测试覆盖率?

我注意到代码覆盖率指标和测试质量存在一个问题:100%的代码覆盖率并不意味着代码经过了真正的测试.

有时候测试会提供100%的覆盖率,即使它没有覆盖所有内容.问题在于覆盖范围定义,我们假设coverage ==可达代码.

但事实并非如此,代码可以100%可达,但不能100%覆盖测试.

看一下示例,此测试提供100%覆盖率(EMMA),但实际上它不包括将传递给服务模拟的值.因此,如果值将被更改,测试将不会失败.

例:

public class User {
  public static final int INT_VALUE = 1;
  public static final boolean BOOLEAN_VALUE = false;
  public static final String STRING_VALUE = "";
  private Service service;

  public void setService(Service service) {
      this.service = service;
  }

  public String userMethod() {
      return service.doSomething(INT_VALUE, BOOLEAN_VALUE, STRING_VALUE);
  }
}
Run Code Online (Sandbox Code Playgroud)

并测试它:

public class UserTest {

  private User user;
  private Service easyMockNiceMock;

  @Before
  public void setUp() throws Exception {
      user = new User();
      easyMockNiceMock = EasyMock.createNiceMock(Service.class);
  }

  @Test
  public void nonCoverage() throws Exception {
      // given
      user.setService(easyMockNiceMock);
      expect(easyMockNiceMock.doSomething(anyInt(), anyBoolean(), (String) anyObject())).andReturn("");
      replay(easyMockNiceMock);
      // when
      user.userMethod();
      // then
      verify(easyMockNiceMock);
  }
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*ell 4

看一下Jester,它执行突变测试。从网站:

Jester 发现测试未涵盖的代码。Jester 对您的代码进行一些更改,运行测试,如果测试通过,Jester 会显示一条消息,说明更改的内容。Jester 包含一个用于生成网页的脚本,该脚本显示了未导致测试失败的更改。

Jester 与代码覆盖工具不同,因为它可以找到通过运行测试而执行但未实际测试的代码。Jester 的方法称为突变测试或自动错误播种。然而,Jester 并不是要替代代码覆盖工具,而只是作为一种补充方法。