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

时间:2012-04-20 13:18:51

标签: c++ unit-testing templates

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

更具体地说,我正在研究Matrix类并使用Boost的单元测试框架。 Matrix适用于不同类型。它主要用于基本类型,但我也希望它支持具体类型。

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

4 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:3)

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

然而,这样做可能有点过头了。我认为这取决于测试中的逻辑数量。

答案 2 :(得分:0)

单元测试的重点是覆盖代码的每个分支。如果使用不同类型的测试涵盖不同的分支,则添加特定类型的单元测试是有意义的,否则它只是复制粘贴。

答案 3 :(得分:0)

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

你的类可以使用int,但是对于float来说是失败的。

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