24

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

我正在使用 JUnit4。

有什么建议么?

4

11 回答 11

14

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

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

然后,您还可以轻松地将您的方法迁移到 quieter-is-better-camp 并更改包装类以仅报告每个测试或每个类等通过的断言的总数。

于 2008-10-08T02:46:47.117 回答
11

当我希望 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

当我的测试超时并且我不确定哪些测试实际上花费了太长时间以及哪些测试被取消时,这对我很有用,因为它们很不幸地在时间到时运行。

于 2012-05-22T21:20:07.517 回答
5

您可以使用 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 )。在您自己的课程中,您可以实现一个简单的计数器并在最后打印它。

于 2008-10-08T00:54:37.280 回答
4

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

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

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

于 2008-10-08T01:14:20.670 回答
3

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

如果您不避免丑陋的 hack:从 JUnit 获取源,在运行测试时修补它们以将当前通知器存储在 Assert 的静态字段中,以便静态方法可以向此通知器报告成功的断言。

于 2008-10-07T21:34:36.857 回答
1

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

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

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

于 2008-10-07T21:28:38.473 回答
1

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

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

于 2008-10-31T09:10:23.707 回答
1

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

Assume.assumeTrue(interestingData, false);

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

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

于 2020-08-14T13:54:53.490 回答
1

这个问题是很久以前提出的,但只是补充一下:

build每次测试后将报告生成为 html 并在文件夹下刷新浏览器不是更好吗?

使用 Gradle(因为它提供了对 Junit 开箱即用的支持以及用于集成的插件),我可以build/reports/tests/test/index.html在我的项目中打开文件并检查每个包、每个类和每个方法的结果。

Exemplo Relatório Testes

PS:如果页面变得烦人,您可以在浏览器中安装扩展以刷新页面。

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

在这里这里这里,您可以找到更多关于如何为 Junit 测试结果生成报告的信息。

于 2021-03-29T01:11:39.333 回答
0

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

所以似乎不可能

于 2008-10-07T21:23:21.450 回答
0

可以考虑吗?

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

于 2008-10-07T22:19:44.097 回答