测试覆盖范围:如何涵盖断言?

时间:2013-10-31 02:28:08

标签: java code-coverage assert eclemma

编辑:所以看起来JeffStorey链接到错误是正确的。启用断言后,编译器将生成额外的代码。最终会创建一个额外的无法访问的分支。

我的一个方法构造函数有这些断言

   public Board(int w, int h) {
            assert w >= 0 : "PRE1: width should be >= 0 but is " + w;
            assert h >= 0 : "PRE2: height should be >= 0 but is " + h;
    }

我试图通过这样做来掩盖它

public void testInvalidBoardWidth() {
    try {
        Board badBoard = new Board(-2, 2);
        fail();
    } catch (AssertionError err) {
        assertTrue(true);
    }
}

@Test
public void testFailBoardHeight() {
    try {
        Board InvalidBoard = new Board(2, -4);
        fail();
    } catch (AssertionError err) {
        assertTrue(true);
    }

再次使用值

Board (-4 , 2)Board (2, 2)

所以我已经测试了断言和传递失败的地方。如果我没有弄错,涵盖所有情况,但使用代码覆盖工具eclEmma Eclipse插件,它声称它没有完全覆盖。我已经在eclipse的覆盖参数中有-ea,因此启用了断言。我的测试是不完整的,还是断言没有完全覆盖?感谢。

2 个答案:

答案 0 :(得分:2)

我相信第四个"分支"在未启用断言时发生。

我已经接受了几年的真正100%报道是不可能的。除了这种情况,还有私有构造函数(以防止实例化只有静态方法和字段的类)以及关于泛型类的神秘(对我而言)。可能还有其他情况。

但是,最近我对这种接受感到不满。

虽然我的大部分专业经验都是在软件设计和开发方面,但我在硬件设计方面有所作为。我们有"覆盖"工具(实际上,可测试性)和我个人提出了我公司芯片和模块可接受的可测试性的标准,从90%和80%(分别)到接近100%和97%。 (几年之后有一个关于对抗的有趣故事 - "所以你就是那个人!" - 但这里并没有密切关系。)这个背景只是为了说明为什么我发现不到纯软件设计和开发中100%的覆盖率是不可接受的。软件是完全确定的,不像硬件,物理变化可能会侵入。

最近我遇到一个提示,即JUnit套件测试可能包含一个没有启用断言的测试。我没有时间跟进。

通过包含原始实例化测试,可以完善泛型类的覆盖范围。

不知道如何处理私有构造函数。

希望这有帮助。

答案 1 :(得分:0)

是的,你掌握了一切。这里只有3条路径:

  • w是< 0& h> 0
  • h< 0& w> 0
  • w> 0& h> 0

你可以添加w< 0& h< 0但是没有更高的分支覆盖率