【问题标题】:What is a good way to unit test templated c++ methods/classes/functions?什么是单元测试模板化 C++ 方法/类/函数的好方法?
【发布时间】:2012-05-02 02:06:59
【问题描述】:

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

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

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

【问题讨论】:

  • “只是复制单元测试并替换类型感觉不对。”为什么?如果你想测试它是否也适用于其他类型,你不能不测试它与其他类型。

标签: c++ unit-testing templates


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      您的类可能适用于 int,但适用于 float。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-03
          • 1970-01-01
          • 1970-01-01
          • 2015-12-13
          相关资源
          最近更新 更多