我可以让JUnit更详细吗?

每当assert语句成功,或者至少让它显示遇到的成功断言语句的数量时,我想让它大喊大叫。

我正在使用JUnit4。

有什么建议么?

如果你想看到每个成功断言的一些输出,另一个不需要外部依赖或源代码的简单方法就是定义你自己的Assert类,它将所有方法委托给标准的JUnit Assert类,以及记录成功的断言(失败的断言将像往常一样由JUnit类报告)。

然后,您可以从“org.junit.Assert”=>“com.myco.test.Assert”对测试类进行全局搜索和替换,这将修复所有常规和静态导入语句。

然后,您还可以轻松地将方法迁移到更安静的阵营,并更改包装类,以便仅报告每个测试或每个类的传递断言总数等。

当我希望JUnit更加冗长和偶然发现这个问题时,添加一些对我有帮助的信息。 也许它将来会帮助其他测试人员。

如果从Ant运行JUnit,并且想要查看正在运行的测试,可以将以下内容添加到任务中:

 

请注意,showoutput,printsummary和enabletestlistenerevents是有帮助的,而不是其他任务属性。 如果你设置这些,你会得到如下输出:

 Running com.foo.bar.MyTest junit.framework.TestListener: tests to run: 2 junit.framework.TestListener: startTest(myTestOne) junit.framework.TestListener: endTest(myTestOne) junit.framework.TestListener: startTest(myTestTwo) junit.framework.TestListener: endTest(myTestTwo) Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 0.495 sec 

当我的测试结束时,这对我很有用,而且我不确定哪些测试实际上花了太长时间,哪些测试被取消了,因为他们不幸的是在时间到了时运行。

您可以使用AOP(使用Spring或AspectJ)在junit.framework.Assert类中的所有assert方法上定义切入点。 使用spring你可以在返回建议之后实现你自己的类( http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-advice-after-returning)如果传递了assert方法(否则抛出exception:junit.framework.AssertionFailedError)。 在您自己的课程中,您可以实现一个简单的计数器并在最后打印它。

你真的对一个成功的断言感兴趣吗? 通常,唯一有趣的断言是失败的断言。

作为一名热情的JUnit奉献者,我尽量让测试的输出尽可能安静,因为它可以在某些事情没有通过时提高信噪比。 最好的测试运行是一切都通过,并且没有stdout的窥视。

您可以随时处理unit testing,直到成功并运行“grep Assert test.java | wc -l”。 🙂

很难做到。 所有断言方法都是Assert类的静态成员,这意味着RunNotifier(计算成功和失败的测试)不可及。

如果你不避免愚蠢的黑客行为:从JUnit获取源代码,修补它们以在运行测试时将当前通知程序存储在Assert的静态字段中,以便静态方法可以向此通知程序报告成功的断言。

我很确定你可以创建一个自定义的TestRunner来做到这一点。 我们在自制的unit testing框架(NUnit的克隆)中得到了类似的东西。

哦,等等 – 现在我再次阅读你的问题,如果你真的想要输出每个成功的断言,你将不得不深入挖掘管道。 TestRunner只为每个测试用例的开始/结束调用一次,因此它将计算传递和失败的测试 ,而不是断言。

这对我来说不是什么大问题,因为我倾向于每次测试一个断言。

我不认为,JUnit的目标是计算匹配的断言或打印出更详细的信息。 如果测试是primefaces的,那么你将获得大部分信息。 所以我会检查我的测试。

您还可以在JUnit中建立LogFile。 这是可能的,但它会降低测试执行性能……

junit的javadoc不幸地说只记录了失败的断言( http://junit.sourceforge.net/javadoc_40/index.html

所以似乎不可能

你能考虑一下吗?

1)下载junit源
2)修改类org.junit.Assert来做你正在寻找的任何修改