tags:

views:

925

answers:

8

I'd like to have it yell hooray whenever an assert statement succeeds, or at the very least have it display the number of successful assert statements that were encountered.

I'm using JUnit4.

Any suggestions?

A: 

junit's javadoc unfortunately says that only failed assertions are recorded (http://junit.sourceforge.net/javadoc_40/index.html)

so it seems it would not be possible

fly.floh
A: 

I'm pretty sure you can create a custom TestRunner that does that. We ended up with something similar in our homemade Unit-testing framework (a clone of NUnit).

Oh, wait - now that I'm reading your question again, if you really want output for each successful assertion, you'll have to dig into the plumbing more. The TestRunner only gets called once for each testcase start/end, so it'll count passed and failed tests, not assertions.

This isn't much of a problem for me, since I tend towards one assertion per test, generally.

Mark Bessey
+2  A: 

Hard to be done. All assert methods are static members of the class Assert, which implies that the RunNotifier (which counts the successful and failed tests) is not within reach.

If you dont refrain from an ungly hack: take the sources from JUnit, patch them to store the current notifier in a static field of Assert when running tests such that the static methods can report successful asserts to this notifier.

Adrian
A: 

Can you consider ?

1) download junit source
2) to modify the class org.junit.Assert to do whatever modifications you're looking for

anjanb
A: 

You can use AOP (with Spring or AspectJ) define pointcuts on all assert methods in junit.framework.Assert class. Using spring you can implement your own class as after returning advice (http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-advice-after-returning) which will only be called if the assert method passed (otherwise it throws an exception: junit.framework.AssertionFailedError ). In you own class you can implement a simple counter and print it at the end.

talg
+2  A: 

Are you really interested in an assertion that succeeds? Normally, the only interesting assertions are ones that fail.

Being a fervent JUnit devotee myself, I try and make the output of the tests as quiet as possible because it improves the signal-to-noise ratio when something doesn't pass. The best test run is one where everything passes and there's not a peep from stdout.

You could always work on your unit test until it succeeds and run "grep Assert test.java | wc -l". :-)

Greg Cottman
Yup, I really am.
Allain Lalonde
+7  A: 

If you want to see some output for each successful assertion, another simple approach which requires no external dependencies or source code, would be to define your own Assert class which delegates all methods to the standard JUnit Assert class, as well as logging successful assertions (failed assertions will be reported as usual by the JUnit class).

You then run a global search-and-replace on your test classes from "org.junit.Assert" => "com.myco.test.Assert", which should fix-up all regular and static import statements.

You could also then easily migrate your approach to the quieter-is-better-camp and change the wrapper class to just report the total # of passed assertions per test or per class, etc.

Dov Wasserman
A: 

I don't think, it's the goal of JUnit to count matched assertions or print out more verbose information. If tests are atomic, you'll get most information in there. So I would review my tests.

You're also able to establish a LogFile in JUnit. It's possible, but it will decrease test execution performance...

furtelwart