You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Boost.Test中对测试用例进行输入与输出的参数化?

如何在Boost.Test中对测试用例进行输入与输出的参数化?

嘿,我完全get到你的需求了——就是想给同一个测试逻辑喂不同的输入和对应的预期结果,不用重复写好几遍测试用例代码对吧?Boost.Test确实有专门的方式来实现这种数据驱动的参数化测试,比你写的伪代码更规范好用,下面给你两种常用的方案:

方案一:用BOOST_DATA_TEST_CASE(推荐,简洁直观)

这是Boost.Test较新版本(大概1.69及以上)提供的数据驱动测试特性,专门用来处理这种多组输入输出的测试场景。你只需要定义好测试数据集,剩下的遍历执行交给框架就行。

示例代码:

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

using namespace boost::unit_test;
namespace data = boost::unit_test::data;

// 你的待测试函数
int MySquareFunctionToTest(int x) {
    return x * x;
}

// 定义测试数据:每个元素是(输入值, 预期结果)的配对
const auto square_test_data = data::make({
    std::make_pair(2, 4),
    std::make_pair(3, 9),
    std::make_pair(4, 16)
});

// 数据驱动的测试用例
BOOST_DATA_TEST_CASE(SquareTest, square_test_data, input, expected) {
    BOOST_CHECK_EQUAL(expected, MySquareFunctionToTest(input));
}

代码说明:

  • 首先要引入boost/test/data/test_case.hppboost/test/data/monomorphic.hpp这两个数据测试相关的头文件;
  • data::make用来创建测试数据集,这里用std::pair把输入和预期结果绑定成一组测试数据;
  • BOOST_DATA_TEST_CASE会自动遍历数据集中的每一组数据,把pair的第一个值传给input参数,第二个传给expected,然后执行你的测试逻辑。

如果你觉得单独定义数据集麻烦,还可以直接在宏里用^运算符把两个数组配对(对应位置的元素会自动绑定),写法更简洁:

BOOST_DATA_TEST_CASE(SquareTest, data::make({2,3,4}) ^ data::make({4,9,16}), input, expected) {
    BOOST_CHECK_EQUAL(expected, MySquareFunctionToTest(input));
}

方案二:用BOOST_PARAM_TEST_CASE(兼容旧版本Boost)

如果你用的是比较旧的Boost.Test版本,没有BOOST_DATA_TEST_CASE,可以用BOOST_PARAM_TEST_CASE来实现参数化测试,步骤稍微多一点,但逻辑是一样的:

示例代码:

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

// 定义存储测试数据的结构体
struct SquareTestData {
    int input;
    int expected;
};

// 准备测试用例数组
SquareTestData square_test_cases[] = {
    {2, 4}, {3, 9}, {4, 16}
};

// 通用测试逻辑
void SquareTest(const SquareTestData& data) {
    BOOST_CHECK_EQUAL(data.expected, MySquareFunctionToTest(data.input));
}

// 注册参数化测试用例
BOOST_AUTO_TEST_SUITE(SquareTests)

BOOST_AUTO_TEST_CASE(SquareParamTest) {
    boost::unit_test::framework::master_test_suite().add(
        BOOST_PARAM_TEST_CASE(&SquareTest, square_test_cases, square_test_cases + 3)
    );
}

BOOST_AUTO_TEST_SUITE_END()

代码说明:

  • 先定义一个结构体来存储每组测试的输入和预期结果;
  • 准备好测试用例数组,把所有要测试的输入输出都放进去;
  • 写好通用的测试函数,接收结构体参数;
  • 在测试套件里注册参数化测试,告诉框架要遍历的测试数据范围。

这两种方案都能实现你想要的效果,推荐优先用第一种BOOST_DATA_TEST_CASE,写法更简洁,可读性也更强,完全符合你“一次定义测试逻辑,多次传参执行”的需求。

备注:内容来源于stack exchange,提问作者Oodini

火山引擎 最新活动