我可以让JUnit更详细吗?

时间:2008-10-07 21:02:22

标签: java junit

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

我正在使用JUnit4。

有什么建议吗?

11 个答案:

答案 0 :(得分:13)

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

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

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

答案 1 :(得分:9)

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

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

<junit showoutput="true" printsummary="on" enabletestlistenerevents="true" fork="@{fork}" forkmode="once" haltonfailure="no" timeout="1800000">

请注意,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

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

答案 2 :(得分:4)

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

答案 3 :(得分:3)

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

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

您可以随时处理单元测试,直到成功并运行“grep Assert test.java | wc -l”。 : - )

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

很久以前就有人问过这个问题,只是补充一下:

membership_prob文件夹下获取生成的html报告并在每次测试后刷新浏览器不是更好吗?

使用 Gradle(因为它通过集成插件提供开箱即用的 Junit 支持)我可以在我的项目中的 build 打开文件并检查每个包、每个类中的结果, 以及每个方法的基础。

Exemplo Relatório Testes

PS:您可以在浏览器中安装扩展程序,以便在浏览器烦人时刷新页面。

如果限制适用,希望这对某人有所帮助。

Hereherehere 您可以找到有关如何为 Junit 测试结果生成报告的更多信息。

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

这不是问题的直接答案,实际上是对junit功能的滥用,但是如果您需要调试断言中使用的某些值,则可以临时添加 像这样:

Assume.assumeTrue(interestingData, false);

这不会使构建失败,但会将测试标记为IGNORED,将强制将这些值包含在测试报告输出中。

❗️确保完成后删除语句。或者,作为替代方案,您可以将语句更改为Assume.assumeTrue(interestingData, true),以防将来需要再次调试它。

答案 9 :(得分:-1)

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

所以似乎不可能

答案 10 :(得分:-1)

你能考虑一下吗?

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