是否可以在boost :: test上使用BOOST_PARAM_TEST_CASE并自动注册?

Omn*_*ous 11 c++ boost unit-testing

是否有可能以任何方式混淆BOOST_AUTO_TEST_CASEBOOST_AUTO_TEST_CASE_TEMPLATEBOOST_PARAM_TEST_CASE?我甚至对实现这种情况的混乱方式感兴趣.

必须手动构建所有测试用例似乎非常乏味.但是这种BOOST_PARAM_TEST_CASE机制非常有用,但只有在你有一个测试初始化​​函数时才有效,这反过来要求你使用手动测试用例构造.

是否有任何关于如何自行挂钩自动系统的文档,以便您可以提供自己的自动注册测试?

我现在正在使用boost 1.46.

Omn*_*ous 12

我写了我自己的支持,因为似乎没有任何好的支持.这需要C++ 11 decltype功能::std::remove_const::std::remove_reference库方法才能工作.

宏定义是BOOST_FIXTURE_TEST_CASEBOOST_AUTO_TEST_CASE宏的修改版本.

你通过声明你的功能来使用它:

BOOST_AUTO_PARAM_TEST_CASE(name, begin, end)
{
    BOOST_CHECK_LT(param, 5);  // The function will have an argument named 'param'.
}
Run Code Online (Sandbox Code Playgroud)

以下是定义BOOST_AUTO_PARAM_TEST_CASE宏的标头:

#include <boost/test/unit_test_suite.hpp>
#include <boost/test/parameterized_test.hpp>
#include <type_traits>

#define BOOST_FIXTURE_PARAM_TEST_CASE( test_name, F, mbegin, mend )     \
struct test_name : public F {                                           \
   typedef ::std::remove_const< ::std::remove_reference< decltype(*(mbegin)) >::type>::type param_t; \
   void test_method(const param_t &);                                   \
};                                                                      \
                                                                        \
void BOOST_AUTO_TC_INVOKER( test_name )(const test_name::param_t &param) \
{                                                                       \
    test_name t;                                                        \
    t.test_method(param);                                               \
}                                                                       \
                                                                        \
BOOST_AUTO_TU_REGISTRAR( test_name )(                                   \
    boost::unit_test::make_test_case(                                   \
       &BOOST_AUTO_TC_INVOKER( test_name ), #test_name,                 \
       (mbegin), (mend)));                                              \
                                                                        \
void test_name::test_method(const param_t &param)                       \

// *******

#define BOOST_AUTO_PARAM_TEST_CASE( test_name, mbegin, mend )           \
   BOOST_FIXTURE_PARAM_TEST_CASE( test_name,                            \
                                  BOOST_AUTO_TEST_CASE_FIXTURE,         \
                                  mbegin, mend)
Run Code Online (Sandbox Code Playgroud)


Joh*_*ing 5

@Omnifarious提供的解决方案有效,但需要C++ 11编译器.

为C++ 03编译器调整该解决方案:

#include <boost/test/unit_test_suite.hpp>
#include <boost/test/parameterized_test.hpp>

#define BOOST_FIXTURE_PARAM_TEST_CASE( test_name, F, P, mbegin, mend )  \
struct test_name : public F                                             \
{                                                                       \
    typedef P param_t;                                                  \
    void test_method(const param_t &);                                  \
};                                                                      \
                                                                        \
void BOOST_AUTO_TC_INVOKER( test_name )(const test_name::param_t &param) \
{                                                                       \
    test_name t;                                                        \
    t.test_method(param);                                               \
}                                                                       \
                                                                        \
BOOST_AUTO_TU_REGISTRAR( test_name )(                                   \
    boost::unit_test::make_test_case(                                   \
       &BOOST_AUTO_TC_INVOKER( test_name ), #test_name,                 \
       (mbegin), (mend)));                                              \
                                                                        \
void test_name::test_method(const param_t &param)                       \

// *******

#define BOOST_AUTO_PARAM_TEST_CASE( test_name, param_type, mbegin, mend )           \
   BOOST_FIXTURE_PARAM_TEST_CASE( test_name,                            \
                                  BOOST_AUTO_TEST_CASE_FIXTURE,         \
                                  param_type,                           \
                                  mbegin, mend)
Run Code Online (Sandbox Code Playgroud)

这种解决方案的用法略有不同.由于declspecC++ 03中没有,因此无法自动推导出参数对象的类型.我们必须将其作为参数传递给BOOST_AUTO_PARAM_TEST_CASE:

class FooTestParam                           
{    
public:                        
    std::string mS;    

    FooTestParam (int n)    
    {            
        std::stringstream ss;    
        ss << n;         
        mS = ss.str();                            
    }    
};         

FooTestParam fooParams [] =    
{         
    FooTestParam (42),    
    FooTestParam (314)    
};           

BOOST_AUTO_PARAM_TEST_CASE (TestFoo, FooTestParam, fooParams, fooParams + 2)        
{                                                                                   
    const std::string testVal = param.mS;                                           
}                                                                                   

BOOST_AUTO_TEST_CASE (TestAddressField)                                             
{                                                                                   
    const uint32_t raw = 0x0100007f;    // 127.0.0.1                                
    const uint8_t expected[4] = {127, 0, 0, 1};                                     
    const Mdi::AddressField& field = *reinterpret_cast <const Mdi::AddressField*> (&raw);    
    for (size_t i = 0; i < 4; ++i)                                                  
        BOOST_CHECK_EQUAL (field[i], expected[i]);                                  
}                                                                                   
Run Code Online (Sandbox Code Playgroud)


Dev*_*lar 3

从 Boost 1.59 版本开始,这是由数据驱动的测试用例处理的:

#define BOOST_TEST_MODULE MainTest

#include <boost/test/included/unit_test.hpp>
#include <boost/test/data/test_case.hpp>
#include <boost/array.hpp>

static const boost::array< int, 4 > DATA{ 1, 3, 4, 5 };

BOOST_DATA_TEST_CASE( Foo, DATA )
{
    BOOST_TEST( sample % 2 );
}
Run Code Online (Sandbox Code Playgroud)

此功能需要编译器和库的 C++11 支持,并且在BOOST_AUTO_TEST_SUITE.

如果您必须在源代码和/或 C++11 之前的编译器中支持新旧版本的 Boost,请查看And-y 的答案