JUnit 4 @Test批注将测试名称报告为“未知”

时间:2012-04-19 05:28:30

标签: java ant junit junit4

使用JUnit 4,我的ant构建脚本调用junit和任务总是将测试类名称报告为“unknown”。有没有办法解决这个问题,而不涉及从TestCase派生?

我使用@Test注释声明我的测试方法,例如:

SomeTest.java:

public class SomeTest {
    @Test
    public void doSomething() { .. }
}

并在TestSuite中收集它们:

AllTests.java:

@RunWith(Suite.class)
@Suite.SuiteClasses( {
    SomeTest.class
})
public class AllTests {
}

然后我通过NetBeans调用ant任务,它对打印JUnit运行的结果提供了很好的集成支持。除了测试名称总是“未知”之外,一切似乎都找不到,例如:

6 tests passed, 2 tests failed, 2 tests caused an error (8.4s)
com.mystuff.AllTests FAILED
    Unknown passed (0.0s)
    Unknown passed (0.0s)
    Unknown passed (0.0s)
    Unknown passed (0.0s)
    Unknown passed (0.0s)
    Unknown passed (0.0s)
    Unknown FAILED (0.0s)
    Unknown caused an ERROR: at org.hibernate.somethingorother.java:1234 (0.0s)
    ..etc..

测试运行正常,我通常可以从记录的堆栈跟踪中找出故障点,但报告为“未知”的所有内容都非常烦人且迟钝。

阅读了几篇SO帖子,我发现有两种方法可以设置你的测试,旧的JUnit 3方法是从TestCase派生的,以及新的Junit 4方式使用@Test注释。

Not able to execute tests with @Test annotation when my test extends TestCase(Junit) in Eclipse

JUnit confusion: use 'extends TestCase' or '@Test'?

这篇文章提到“在JUnit 4中,测试类不再扩展一个通用的框架类。所以没有继承的方法getName” How to obtain test case name in JUnit 4 at runtime?

我尝试从TestCase扩展我的测试用例,这确实正确地报告了这个名称,但是这个单一的更改搞砸了它的一些生命周期,并且测试以bizzarre的方式失败了。我的理解是,当JUnit运行器看到你的测试类派生自TestCase时,它将作为JUnit 3测试用例运行,因此会忽略我的所有@Before,@ Aftert等注释。我没有看到退回JUnit 3测试机制的重点。

1 个答案:

答案 0 :(得分:7)

这很令人尴尬,但值得一提。我想我刚回答了自己的问题。

答案似乎是这里描述的任务属性enableTestListenerEvents之一:http://ant.apache.org/manual/Tasks/junit.html

我忽略了它,因为文档说“因为Ant 1.8.2 - Ant 1.7.0到1.8.1的行为就像默认情况下这个属性是真的一样。”我正在运行1.8.2,但我误解了它,它实际上是在1.8.2中默认关闭它。

所以解决方法是在build.xml中更改我的任务:

<junit haltonfailure="true" printsummary="on" fork="yes" dir=".">

<junit haltonfailure="true" printsummary="on" fork="yes" dir="."
    enableTestListenerEvents="true">

随着测试的进展,NetBeans现在可以在“测试结果”窗格中打印最新信息,包括测试名称。整个反馈体验更加丰富。告诉你的朋友:)