2008-10-07 51 views
20

每当一个assert语句成功时,我都希望它会大喊大叫,或者至少让它显示遇到的成功声明语句的数量。我可以让JUnit更详细吗?

我正在使用JUnit4。

有什么建议吗?

+0

你为什么要这样做?我总是试图遵循沉默的规则(http://www.catb.org/~esr/writings/taoup/html/ch01s06.html#id2878450),这就是为什么我要求 – 2008-10-07 21:08:40

+0

这可能是一种有用的方法看看是否有人“调整”测试用例,通过消除不适当的断言来通过测试用例... – 2008-10-07 22:07:06

回答

13

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

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

你也很容易再你的方法迁移到更安静的就是更好阵营,改变包装类只报告每个测试或每类传入断言的总#等

0

我敢肯定,你可以创建一个自定义的TestRunner是这样做的。我们在我们自制的单元测试框架(NUnit的一个克隆)中得到了类似的结果。

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

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

2

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

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

-1

你能考虑吗?

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

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

你在获得成功吗?通常情况下,唯一有趣的说法是那些失败的断言很感兴趣。

作为一个狂热的JUnit奉献自己,我尝试做的输出尽可能安静地进行测试,因为它在不通过任何事情的情况下提高了信噪比。最好的测试运行是所有事情都经过并且没有从标准输出中窥视的一个测试。

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

0

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

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

7

添加一些信息,当我想让JUnit在这个问题上变得更加冗长和迷迷糊糊时,对我会有所帮助。也许它将在未来帮助其他测试人员。

如果从蚂蚁运行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 

这是对我有用的,当我测试超时,我不知道哪个测试实际花费的时间太长,并且测试得到,因为取消时间到了,他们不幸运行。

相关问题