Re: A simple unit test framework
nw wrote:
A fool with a tool is still a fool. The challenge in testing is not test
management, but designing test cases to cover the possible failures in
the code under test. That's something that most developers don't do
well, because their focus is on getting the code to run. A good tester
focuses on getting the code to fail.
Agreed. That was my motivation in providing a relatively simple small
class which is really just a comparison function that on failure
prints out the file and line the test failed in. So I was going to
spend about a half hour talking about the features of C++ they'll need
__LINE__, __FILE__ etc. and introducing a simple framework. Then
another half hour talking about designing tests to try and make their
code fail.
Saying it four times doesn't make your point any stronger :-)
I would only suggest that you also try to add a test registry and some
macros so that __FILE__ and __LINE__ are not used in test cases.
In the Austria C++ unit test system, I use exceptions to indicate
failure. It's usually silly to continue with a test if part of it has
failed.
Is Austria C++ there is also an assert macro "AT_TCAssert" for "Test
Case Assert" which is somewhat similar to:
ut.test(r.is_square(),true,__LINE__);
AT_TCAssert throws a "at::TestCase_Exception" when the assert fails and
provides a string descrbing the error.
Here is an example:
AT_TCAssert( m_value == A_enum, "Failed to get correct type" )
#define AT_TCAssert( x_expr, x_description ) if ( !( x_expr ) ) { throw TestCase_Exception( AT_String( x_description ), __FILE__, __LINE__ ); } // end of macro
.... now that I think about it, that should be a while() not an if() or
an if wrapped in a do {}.
TestCase_Exception also grabs a stack trace and can print out a trace of
the place it is thrown.