什么是单元测试模板化 c++ 方法/类/函数的好方法

What is a good way to unit test templated c++ methods/classes/functions?

本文关键字:方法 函数 c++ 单元测试 什么      更新时间:2023-10-16

我正在寻找一种在 c++ 中对我的模板化方法、类和函数进行单元测试的好方法。我有一种感觉,仅仅使用单个类型进行测试是不够的,仅仅复制单元测试并替换类型感觉不对。

更具体地说,我正在开发一个矩阵类并使用 Boost 的单元测试框架。矩阵是使用不同的类型。它将主要用于基本类型,但我希望它也支持具体类型。

请注意,我这样做是为了学习目的,这就是为什么我没有使用现有的矩阵实现。

Boost 测试有一个宏BOOST_AUTO_TEST_CASE_TEMPLATE,该宏在 boost::mpl::list 中每种类型的模板上运行测试。

template<typename T>
T Add(T lh, T rh)
{
   return lh + rh;
}
typedef boost::mpl::list<int, float> test_types;
BOOST_AUTO_TEST_CASE_TEMPLATE(Add_1Plus2_Is3, T, test_types)
{
    T result = Add(T(1), T(2));
    BOOST_CHECK_EQUAL(T(3), result);
}

http://www.boost.org/doc/libs/1_48_0/libs/test/doc/html/utf/user-guide/test-organization/auto-test-case-template.html

我同意josuegomes和VJovic的观点。我认为,最大限度地减少代码重复的一种方法是使用单元测试逻辑创建一个模板化函数,然后使用不同类型的参数调用它。这样,您就可以将所有 Matrix 单元测试逻辑放在一个位置,同时为每个所需的类型调用一次模板化单元测试函数。

但是,这样做可能有些矫枉过正。我认为这取决于测试中的逻辑量。

如果要对

模板进行单元测试,则需要使用所有可能的类型对模板类进行单元测试,或者直到您认为足够为止。没有办法。

您的类可能使用 int,但对于浮点数则失败。

如果模板不适用于某些类型,则应在代码中添加一些static_assert。

单元测试的全部意义在于涵盖代码的每个分支。如果不同类型的测试涵盖不同的分支,那么添加特定于类型的单元测试是有意义的,否则它只是复制粘贴。