I am trying to start unit testing. I am looking at a few C++ frameworks and want to try Boost.Test. The documentation seems very thorough, and it\'s a bit overwhelming, espe
You can start the tests from i.e. a menu command, but it's not that simple and sadly not well documented. Even more sad - its not possible to pass the path where the logfile is to be created. I had to add such a commandline option myself. Unfortunately i have not yet submitted it. My code looks like this:
#ifdef DEBUG
#undef main
#define BOOST_TEST_MAIN
#include <boost/test/included/unit_test.hpp>
int DoUnitTests()
{
char *args[] = {"", "--log_level=all", "--auto_start_dbg=yes"};
bool result = ::boost::unit_test::unit_test_main(&init_unit_test_suite, sizeof(args) / sizeof(char*), args);
MessageDlog("Unittests result: %s", result ? "ERRORS in Unittests" : "Goooood!");
return result;
}
#else
int DoUnitTests()
{
}
#endif
BOOST.Test is very flexible and you can probably do what you want. However since you say you are new to unit testing, you should probably follow the standard unit testing structure.
This is to have a separate test project for each project you are unit testing. Then include the sources and libraries you need to build the test project.
This is cleaner as there are no test logic in your main project that might get run accidentally and it is easy to run the tests as they have their own executable. This approach also works for testing libraries. If you follow this structure you will find that most of the BOOST.Test defaults work out of the box and you can just worry about writing you tests and code.
Try this script I wrote which, given a program name and list of classes will generate the makefile, project skeleton and test suite skeletons for each class / module. It also sets it all up so that the test suite for each class can be run either individually or as part of an all-in-one global suite.
It's call makeSimple and is available on sourceforge.
In your test_foo.cpp
, the macros add test suites and test cases in
to a global list: master_testsuite
, which is the root of all test
nodes. You just need to compile all the test files like
test_foo.cpp
, test_boo.cpp
and a runner, then link them all into on
executable.
The function unit_test_main
is used to run the tests in master_testsuite
.
boost::unit_test::unit_test_main(
&init_unit_test,
argc,
argv
)
Based on the macro you defined before including
<boost/test/unit_test.h>
, Boost.Test may already generate the main
function for you.[1] The generated main
simply invoked
unit_test_main
with argc
and argv
in main
. It's recommended to
use unit_test_main
because it can process some console arguments,
like run test by name.
The first argument of unit_test_main
is a hook. Depending on
BOOST_TEST_ALTERNATIVE_INIT_API
, it has different definition.
#ifdef BOOST_TEST_ALTERNATIVE_INIT_API
typedef bool (*init_unit_test_func)();
#else
typedef test_suite* (*init_unit_test_func)( int, char* [] );
#endif
You can customize the master_testsuite
in the hook. In the second
form, the returned value is the new master testsuite.
[1] if BOOST_TEST_MAIN
and BOOST_TEST_MAIN
are defined, but
BOOST_TEST_NO_MAIN
is not.
there's no standalone test runner as in NUnit
you simply build the test cases as a single .exe application (if you are on Windows) and you run it