4

使用 JUnit 4,我的用任务调用 junit 的 ant 构建脚本总是将测试类名称报告为“未知”。有没有一种不涉及从 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 帖子后,我发现有两种设置测试的方法,从 TestCase 派生的旧 JUnit 3 方法,以及使用 @Test 注释的新 Junit 4 方法。

当我的测试在 Eclipse 中扩展 TestCase(Junit) 时,无法使用 @Test 注释执行测试

JUnit 混淆:使用“扩展 TestCase”或“@Test”?

这篇文章提到“在JUnit 4中,测试类不再扩展通用框架类。所以不再有继承方法getName” 如何在运行时获取JUnit 4中的测试用例名称?

我尝试从 TestCase 扩展我的测试用例,这确实使名称被正确报告,但是这个单一的更改搞砸了它的一些生命周期,并且测试以奇怪的方式失败了。我的理解是,当 JUnit 运行器看到您的测试类派生自 TestCase 时,它​​会将其作为 JUnit 3 测试用例运行,因此会忽略我的所有 @Before、@After 等注释。我看不出回到 JUnit 3 测试机制有什么意义。

4

1 回答 1

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 现在会在“测试结果”窗格中打印最新信息,包括测试名称。整个反馈体验要丰富得多。告诉你的朋友 :)

于 2012-04-19T05:39:30.297 回答