当前位置: 首页 > 知识库问答 >
问题:

覆盖率与可达代码

章永安
2023-03-14

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

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

共有2个答案

阎德宇
2023-03-14

100%的覆盖率从来就不意味着100%的测试,任何声称100%的人要么不理解,要么是在骗你。覆盖率测量只是测量测试期间执行了什么产品代码。有几十种方法可以编写产生100%覆盖率的测试,然后不要完全测试你的代码。

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

我写了一篇关于这个主题的博文:覆盖率度量中的缺陷,它以Python为中心,但概念都是一样的。

朱雅惠
2023-03-14

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

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

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

 类似资料:
  • 这是一个重要的可量化指标,如果代码覆盖率很高,你就可以放心的修改代码,在发版本的时候也能睡个安稳觉。否则就是拆东墙补西墙,陷入无尽的 bug 诅咒中。 那么在 OpenResty 里面如何看到代码覆盖率呢?其实很简单,使用 LuaCov 可以很方便的实现。 我们先了解下 LuaCov,这是一个针对 Lua 脚本的代码覆盖率工具,通过 luarocks 来安装: luarocks install l

  • 我的代码运行在具有单独JVM的单独虚拟机上。我想在此虚拟机上以tcpserver模式设置JaCoCo代理以收集覆盖率数据。然后,我将在我的maven项目中以tcpclient模式设置JaCoCo代理,以连接到上面提到的VM并获取覆盖率数据。 问题是代理不收集任何覆盖数据。在中创建了覆盖率数据文件,但该文件为空。 下面是代理选项:-Java agent:/usr/xx/plugins/org . j

  • 问题内容: 我正在使用Mocha测试我的NodeJS应用程序。我无法弄清楚如何使用其代码覆盖功能。我尝试使用Google搜索,但没有找到任何合适的教程。请帮忙。 问题答案: 您需要一个额外的库来覆盖代码,而伊斯坦布尔的强大和便捷将使您震惊。通过Mocha测试后,请尝试以下操作: 现在,只需将命令nyc放在现有测试命令的前面,例如:

  • 我在声纳中的代码覆盖率显示为0%,这不是真的,因为我有单元测试。 格拉德尔 当我打开inside然后我可以看到成功的单元测试。 我在Jenkins环境中运行作为

  • 我正在为我的grails 3.1.6项目添加cobertura代码覆盖率,覆盖率报告似乎有点少,即我有单元测试用例(pos和neg两种情况)来覆盖if块,但报告说没有覆盖if块。gradle:2.13 Groovy:2.4.5 Grails:3.1.6 cobertura gradle Plugin:net.saliman:gradle-cobertura-plugin:2.3.2 这是我的代码

  • 问题内容: 我碰到的SO这个线程,其讲述PHP代码覆盖工具-代码覆盖工具对PHP 我从未从事过PHP,并且一直在使用Java针对用PHP编写的应用程序编写Selenium UI测试。当我经过上面提到的线程时,我感到(可能是错误的)当那些用PHP Unit编写的单元测试并且想要找出单元测试覆盖应用程序的程度时,将使用那些PHP代码覆盖工具。 我正在寻找一种解决方案,在其中执行我编写的,用Java编写