Unit Testing – Best Practices for Assert Messages in Unit Tests

assertionslanguage-agnosticunit testing

I've just begun reading "The Art Of Unit Testing" by Roy Osherove, and while I'm mostly finding the material very helpful, he makes a statement about not using messages in your Assert statements.

"Please never, ever, use this parameter. Just make sure your test name explains what's supposed to happen."

My question is, in you experience do you find this advice to be good or bad? If you use assert messages in your unit tests, what information do you use it to capture beyond what a well named unit test could give you in the first place?

Best Answer

This sort of advice makes two key assumptions:

  1. You're going to be spending more time looking at some pass/fail summary of all your tests than the assert output.
  2. Your tests are only testing a single thing.

Now #1 is pretty much guaranteed to be true. #2 is less often going to be true, even if it's good advice. The spirit of the advice is: you should be able to tell at a glance why your unit tests did not pass.

The book's advice combines with these two assumptions to achieve the spirit of the advice. In my experience, this spirit is really what is key to follow. Once you have a good test name, and your test only tests one thing (even if you use multiple asserts to do it) - everything else is gravy.

At that point, if you find it useful to use messages to differentiate asserts, go nuts. If you find it more useful to save time typing assert messages that nobody looks at, go nuts. The important thing is that you can tell at a glance what failed your tests.