覆盖VS可达代码(Coverage vs reachable code)

2019-09-16 12:07发布

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

我注意到一个问题,代码覆盖率指标和测试质量:100%的代码覆盖率并不意味着代码是真正的考验。

有时测试给出100%的覆盖率,甚至它不面面俱到。 问题覆盖面的定义规定,我们假设覆盖率==可达代码

但事实并非如此,代码可能是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);
  }
}

并测试它:

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);
  }
}

Answer 1:

看看小丑 ,执行突变检测 。 从该网站:

杰斯特发现未覆盖的测试代码。 杰斯特做了一些改变了代码,运行你的测试,如果测试通过小丑显示一条消息,说是什么改变了。 杰斯特包括用于生成网页的显示,并没有导致测试失败所做的更改的脚本。

小丑是比代码覆盖工具不同,因为它可以找到由正在运行的测试执行,但没有实际测试过的代码。 杰斯特的做法被称为突变检测或自动错误播种。 然而,杰斯特并不意味着为代码覆盖工具的替代品,只是作为一个补充手段。



Answer 2:

100%的覆盖率从来就不是100%测试,和任何谁声称它没有或者不理解,或者是在骗你。 覆盖测试只是衡量什么样的产品代码已经在测试过程中被执行。 有几十个的书写方式产生100%的覆盖率,再没有充分测试你的代码测试。

最简单的方法是写一个测试,要求产品的功能,然后从不对返回值的任何断言!

这里有一个博客帖子我写这个题目: 在覆盖测试缺陷 ,这是Python的中心,但其概念都是一样的。



文章来源: Coverage vs reachable code