Is it possible to mix up the BOOST_AUTO_TEST_CASE
and BOOST_AUTO_TEST_CASE_TEMPLATE
macros with the BOOST_PARAM_TEST_CASE
in any way? I'm even interested in really messy ways of making this happen.
Having to build all of your test cases by hand seems really tedious. But the BOOST_PARAM_TEST_CASE
mechanism is pretty darn useful, but only works if you have a test init function, which in turn requires you to have be using manual test case construction.
Is there any documentation on how to hook into the automated system yourself so you can provide your own tests that auto-register themselves?
I'm using boost 1.46 right now.
I took Omnifarious' header file and modified it such that the parameter is passed to the constructor of the test fixture rather than to the test method. This requires the test fixture's constructor declaration to take a single argument with the parameter's type. I found this to be super handy--much thanks for the initial question and answer!
Since Boost 1.59 internal details of realization was changed and Omnifarious's solution doesn't compile.
Reason ot that is changing signature of
boost::unit_test::make_test_case
function: now it take 2 additional args:__FILE__, __LINE__
Fixed solution:
Starting with Boost version 1.59, this is being handled by data-driven test cases:
This functionality requires C++11 support from compiler and library, and does not work inside a
BOOST_AUTO_TEST_SUITE
.If you have to support both old and new versions of Boost in your source, and / or pre-C++11 compilers, check out And-y's answer.
I wrote my own support for this since there really didn't seem to be any good support. This requires the C++11
decltype
feature and the::std::remove_const
and::std::remove_reference
library methods to work.The macro definitions are a modified versions of the
BOOST_FIXTURE_TEST_CASE
andBOOST_AUTO_TEST_CASE
macros.You use this by declaring your function thus:
Here is the header that defines the
BOOST_AUTO_PARAM_TEST_CASE
macro:You can easily mix manual and automated test unit registration. Implement your own init function (like in example 20 on this page) and inside init function you can perform registration for parameterized test cases. Boost.Test will merge them both into single test tree.
The solution provided by @Omnifarious works works, but requires a C++11 compiler.
Adapting that solution for a C++03 compiler:
This solution is slightly different is usage. Since there is no
declspec
in C++03, the type of the parameter object cannot be automatically deduced. We must pass it in as a parameter toBOOST_AUTO_PARAM_TEST_CASE
: