【发布时间】:2012-04-13 18:07:25
【问题描述】:
在 Java/Junit 中,我需要使用一些对象来测试 null。有多种方法可以测试条件,但我一直在使用 assertTrue 进行大多数测试。当我在 assertTrue 中检查空值时,EclEmma 声明它只测试一个分支。
当我手动将语句解析为变量时(例如将结果设置为布尔值并将其传递给 assertTrue),代码覆盖在断言上被认为是完整的,但在变量初始化行上没有。
为什么会这样?这是否与http://sourceforge.net/apps/trac/eclemma/wiki/FilteringOptions 中提到的 Java 显然添加的额外字节码有关?任何解决方案(除了使用其他断言语句)。
assertTrue:
assertTrue( myObject == null ); //1 of 2 branches
assertTrue:
boolean test = (myObject == null); //1 of 2 branches missing
assertTrue(test); // complete
assertNull:
assertNull( myObject ) //complete;
【问题讨论】:
-
使用 assertNull 断言 null 有什么问题?通常最好为被断言的事物使用适当的断言类型。您最好在测试失败时查看问题所在,而无需过多地研究测试代码。
-
@nansen 这是真的,如果需要,我使用 assertNull 没有问题,但是,IMO,所有断言“类型”只是 assertTrue 的另一种形式。使用不同的断言类型可能会带来额外的好处,例如添加错误信息/可读性,但这在这里并不是真正的问题。
-
@nansen 这并不是说我拒绝使用 assertNull 并且可能会使用它,我只是发现这个特殊的问题很有趣,因为我基本上是在测试同样的东西,但艾玛完全给出了不同的结果。
-
为什么要在测试代码上运行代码覆盖?我认为没有人应该关心您的所有测试代码分支是否都经过测试。这看起来很傻。
-
根本问题与测试代码的运行覆盖率无关,也与使用 assertNull 与 assertTrue 无关。
标签: junit code-coverage bytecode emma jacoco