我正在寻找一种很好的方式来在C++中测试我的模板方法,类和函数。 我有一种感觉,仅仅使用单一类型进行测试是不够的,而且仅仅复制单元测试并替换类型并不合适。什么是单元测试模板化C++方法/类/函数的好方法?
更具体地说,我正在研究Matrix类并使用Boost的单元测试框架。矩阵将使用不同的类型。它主要用于基本类型,但我希望它也支持具体类型。
请注意,我这样做是为了学习目的,这就是为什么我没有使用现有的矩阵实现。
我正在寻找一种很好的方式来在C++中测试我的模板方法,类和函数。 我有一种感觉,仅仅使用单一类型进行测试是不够的,而且仅仅复制单元测试并替换类型并不合适。什么是单元测试模板化C++方法/类/函数的好方法?
更具体地说,我正在研究Matrix类并使用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);
}
单元测试的要点是涵盖代码的每个分支。如果使用不同类型的测试覆盖不同的分支,那么添加类型特定的单元测试是有意义的,否则它只是复制粘贴。
如果您是单元测试模板,那么您需要使用所有可能的类型对模板类进行单元测试,或者直到您认为足够。没有办法。
你的类可能使用int,但是float失败。
如果该模板并不打算与某些类型一起使用,那么您应该在代码中添加一些static_assert。
我同意josuegomes和VJovic。我认为,减少代码重复的一种方法是用你的单元测试逻辑做一个模板函数,然后用不同类型的参数调用它。通过这种方式,您可以将所有Matrix单元测试逻辑放置在一个位置,同时针对每种所需类型调用模板单元测试功能。
但是,这样做可能是矫枉过正。我认为这取决于测试中逻辑的数量。
“仅仅复制单元测试并替换类型是不正确的。”为什么?如果你想测试它是否也适用于其他类型,那么你不能用其他类型进行测试。 – PlasmaHH 2012-04-20 13:21:10