首页 > 解决方案 > Boost 测试用例混合数据集和模板

问题描述

我正在使用 boost.test 进行单元测试(目前使用 boost 1.71.0)。我有一个模板类,我想用数据集进行测试。

我只能找到测试不同模板参数(使用BOOST_AUTO_TEST_CASE_TEMPLATE)或数据集(使用BOOST_DATA_TEST_CASE)的方法。但我找不到混合模板和数据集的方法。

这是我所取得的成就的 MWE,并评论了我正在尝试做的事情。

test.cpp

#define BOOST_TEST_MODULE data_template
#include <boost/mpl/list.hpp>
#include <boost/test/data/test_case.hpp>
#include <boost/test/unit_test.hpp>
#include <vector>
#include <list>
#include <numeric> // std::accumulate

template <typename C>
struct Testee{
    C container;
    typename C::value_type f(){
        // just a dummy function to be tested
        return std::accumulate(container.begin(),container.end(),0);
    }
};

typedef boost::mpl::list<std::vector<double>, std::list<double>, std::vector<size_t>> container_types;

template <class T> void test_containers(size_t size)
{
    Testee<T> t;
    t.container = T(size,1);

    BOOST_CHECK_EQUAL(t.f(), size);
}

// test on all container types but only with size=100 (3 test cases)
BOOST_AUTO_TEST_CASE_TEMPLATE(test1, T, container_types)
{
    test_containers<T>(100);
}

// test with several container sizes but only for vector<double> (6 test cases)
BOOST_DATA_TEST_CASE(test2, boost::unit_test::data::make({0, 1, 2, 10, 100, 1000}), size)
{
    test_containers<std::vector<double>>(size);
}

// What I'm looking for looks like:
// // test for each combination of container type and size (6*3=18 test cases)
// BOOST_DATA_TEST_CASE_TEMPLATE(test3, T, container_types, boost::unit_test::data::make({0, 1, 2, 10, 100, 1000}), size)
// {
//     test_containers<T>(size);
// }

CMakeLists.txt

CMAKE_MINIMUM_REQUIRED( VERSION 3.5 )
PROJECT(data_template_test
    LANGUAGES CXX)

set (CMAKE_CXX_FLAGS "-std=c++17 -Wall ${CMAKE_CXX_FLAGS}")

find_package(Boost 1.59 REQUIRED COMPONENTS unit_test_framework)
add_executable(${PROJECT_NAME} test.cpp)
target_link_libraries(${PROJECT_NAME} Boost::unit_test_framework)
target_compile_definitions(${PROJECT_NAME} PRIVATE BOOST_TEST_DYN_LINK)

MWE 生成了 9 个测试用例,并且没有错误地通过,但我想要所有类型和所有大小的组合,所以 3x6=18 个测试用例。有没有办法使用 boost-test 来做到这一点?也许使用一些更冗长/不太友好的 API?

感谢您的帮助!

标签: c++boostboost-test

解决方案


推荐阅读