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

使用PIT查找无用的单元测试

濮阳驰
2023-03-14

假设我们有一个要测试的代码:

class C {
    int doSmth() {
        return 1;
    }
}

现在假设我们在一个类中放置了两个单元测试。第一个“测试所有内容”,而第二个“什么都不做”:

@RunWith(JUnit4.class)
public final class CTest {

    @Test
    @SuppressWarnings("static-method")
    public void testDoSmth() {
        assertEquals(1, new C().doSmth());
    }

    @Test
    @SuppressWarnings("static-method")
    public void testDoSmth2() throws Exception {
        Thread.sleep(1000);
    }
}

这是一个IRL示例:我已经看到几十个测试通过用一些无用的代码替换测试内容来“修复”,因为被测试代码的契约随着时间的推移而变化。

现在,PIT“entry”单元是一个包含测试方法的类(而不是单个测试方法本身),因此在上述情况下,PIT不仅会显示100%的行覆盖率,还会显示100%的突变覆盖率。

好吧,知道我有100%的突变覆盖率,我松了一口气,但是在上面的情况下,我如何识别一个无用的测试——testDoSmth2()(前提是我的突变覆盖率很高)?

共有2个答案

谭昕
2023-03-14

我开发了一种手动方法https://www.codeproject.com/Articles/4051293/Unit-Test-Suite-Quality-EstimationPIT可以给你一些提示。

吕征
2023-03-14

目前没有任何内置的pitest,但是您需要检测无用(在检测故障方面)测试的数据就在那里。

XML报告输出每个突变的杀死测试(通常是在测试方法的级别)。任何不杀死突变的测试都可以被删除,而不会影响突变分数。

当然,由于其他原因,例如描述一个单元的功能,不杀死突变的测试可能仍然很有价值。

然而,通过静态分析可以更有效地检测示例中显示的极端情况-测试显然不执行任何代码,因此不可能检测其中的故障

 类似资料:
  • 我搞不懂这个。 我在这个网站上工作,我使用Python中的selenium来单击类名“yellow showPopupUnder”下的第一个元素(屏幕的主要部分有20行关于房屋的黄色信息)。 当我让Selenium点击该行后,它会打开并显示更多信息。我对有“选中”和“未选中”框的部分感兴趣。这些复选框位于这样的div中: 未选中的框位于一个div中,如下所示: 我试着用几种方法联系他们: 我还尝试

  • 问题内容: 我正在通过libgdx编写游戏;我正在使用junit框架来简化代码的单元测试。现在有一部分代码(一个地图生成器,一个将我自己的地图格式转换为TiledMap的类…),我需要对其进行彻底的测试,但是它使用libgdx代码:从文件处理到资产加载。我不打算以这种方式测试实际的图形输出或游戏本身:但是我想测试单个组件(计算,资产访问…),以避免出现明显的错误。 我尝试在“ setUpBefor

  • 我正在用Selenium IDE测试一个包含表的网页。我想通过CSS选择器验证表格单元格(行,列)中的文本。表的HTML结构非常简单。下面是一个表的示例,其中每一行表示一个人的不同属性: 在Selenium IDE中,我能够使用以下CSS选择器在包含AGE的表行中找到“49”: 当我将这些方法导出为JUnit代码时,问题就来了。以下JUnit代码块工作: (使用方法1) WebDriver.Fin

  • 非常感谢您的帮助。 我想知道firebug复制xpath是否总是适用于webdriver。 我有一个带有列表的页面,我可以获得完整的xpath来查找前两个元素,但无法对3、4执行相同的操作。 对于第三个,它不起作用: 错误: org.openqa.selenium.NoSuchElementException:无法定位元素:{"method":"xpath","selector":"/html/b

  • 我正在使用WebSphere Liberty 8.5.5服务器并在此服务器上编写一些批测试用例。我试图模拟jndi查找对象进行测试,但在测试用例中设置dataSource对象时,我遇到以下错误,有人知道如何设置INITIAL\u CONTEXT\u工厂吗 javax.naming.:需要在环境或系统道具中指定类名,或作为小程序参数,或在应用程序资源文件中指定类名:java.naming.facto

  • 问题内容: 我正在尝试为我的项目编写一个单元测试,但是它不允许我使用配置管理器。现在我的项目像 ASP.Net应用程序(所有aspx页) ProjectCore(所有C#文件-模型) ProjectTest(所有测试) 在我的ProjectCore中,我可以从System.Configuration访问ConfigurationManager对象,并将信息传递到项目中。但是,当我运行涉及Confi