Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Helping getting started using Boost.Test

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, especially someone new to unit testing. So here's a situation that I want:

Let's say I have 2 classes, Foo and Bar. I want to write a suite of tests for Foo and a suite of tests for Bar, preferably in different files. I want to run the tests only if I run the program with a command line parameter. So my main() should look something like:

int main(int argc, const char* argv[])
{
    if (argc == 1 && strcmp(argv[0], "-test") == 0)
        run_all_tests();
    else
        return program_main(argc, argv);
}

I think test_foo.cpp should be something like:

#include "foo.hpp"
#define BOOST_TEST_MODULE Foo test
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_SUITE( Foo_Test )

BOOST_AUTO_TEST_CASE( Foo1 )
{
    Foo f;
    BOOST_CHECK( f.isValid() );
}

BOOST_AUTO_TEST_CASE( Foo2 )
{
    Foo f;
    BOOST_CHECK( f.baz() == 5 );
}

BOOST_AUTO_TEST_SUITE_END()

However, I don't know (1) what the actual command to run the tests is, and (2) how to actually tell the library that I want to run EVERY test.

So, who has experience with Boost.Test? Can someone help in a detailed way? Thank you so much.

like image 701
rlbond Avatar asked Jun 08 '09 01:06

rlbond


People also ask

How do you use boost test?

Create a Boost. cpp file for your tests, right-click on the project node in Solution Explorer and choose Add > New Item. In the Add New Item dialog, expand Installed > Visual C++ > Test. Select Boost. Test, then choose Add to add Test.

What is test adapter for boost test?

The Test Adapter for Boost. Test is a unit testing extension published by Microsoft and based on the existing Boost Unit Test Adapter (v1. 0.8) Visual Studio extension by Gunter Wirth's team from ETAS GmbH. This extension is developed in collaboration with the original project with the aim of improving Boost.


3 Answers

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.

like image 60
Ian Yang Avatar answered Oct 30 '22 03:10

Ian Yang


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
like image 40
RED SOFT ADAIR Avatar answered Oct 30 '22 03:10

RED SOFT ADAIR


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.

like image 43
iain Avatar answered Oct 30 '22 03:10

iain