【问题标题】:Coverage vs reachable code覆盖率与可达代码
【发布时间】:2012-04-25 04:05:14
【问题描述】:

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

我注意到代码覆盖率指标和测试质量存在一个问题: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);
  }
}

并对其进行测试:

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

【问题讨论】:

    标签: java unit-testing junit mocking code-coverage


    【解决方案1】:

    看看Jester,它执行mutation testing。来自网站:

    Jester 找到测试未涵盖的代码。小丑做一些 更改你的代码,运行你的测试,如果测试通过了 Jester 显示一条消息,说明它发生了什么变化。 Jester 包含一个脚本 用于生成网页,显示所做的更改并未导致 测试失败。

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

    【讨论】:

    • 遗憾的是它不适用于当前版本的 .net。很想试一试。
    • 我尝试在谷歌上搜索突变框架,但没有一个与 IDE(最好是 IDEA)集成。
    • Jester 对突变测试采取了一种非常幼稚的方法,因此非常缓慢。如果您正在研究突变测试,您可能想尝试更现代的系统,例如 pitest.org 或 javalanche
    【解决方案2】:

    100% 的覆盖率绝不意味着 100% 的测试,任何声称这样做的人要么不理解,要么在对您撒谎。覆盖率测量只是测量在测试期间执行了哪些产品代码。有很多方法可以编写产生 100% 覆盖率的测试,然后不完全测试您的代码。

    最简单的方法是编写一个调用产品函数的测试,然后从不对返回值做任何断言!

    这是我写的关于这个主题的博客文章:Flaws in Coverage Measurement,它以 Python 为中心,但概念都是一样的。

    【讨论】:

    • Coverage 准确地告诉您一件事:没有测试的内容。在查看覆盖图时,我不在乎什么是绿色,我在乎的是什么是红色。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 2018-01-11
    • 1970-01-01
    • 2018-03-10
    • 2011-01-18
    • 2016-11-29
    • 2017-05-03
    相关资源
    最近更新 更多