什么是单元测试模板化 c++ 方法/类/函数的好方法
What is a good way to unit test templated c++ methods/classes/functions?
我正在寻找一种在 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。
单元测试的全部意义在于涵盖代码的每个分支。如果不同类型的测试涵盖不同的分支,那么添加特定于类型的单元测试是有意义的,否则它只是复制粘贴。
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 使用std::函数映射对象方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 初始化具有非默认构造函数的std::数组项的更好方法
- 如何制作一个将函数作为参数的类方法
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 获取从C++中同一类中的构造函数调用的方法返回的值
- C++ - 类方法函数指针unordered_map的初始化器列表
- 如何从具有多个对象/字段的类中调用方法函数
- 如何以这种方式访问另一个文件的方法/函数
- Vim 转到标准库方法/函数定义
- 在方法/函数中使用"static const std::string"还是只使用"cons
- 我可以将这两种方法/函数合二为一吗?
- 为什么我不能添加到方法/函数外部的 ostringstream
- 如何在调用方法函数中将列表、向量或数组作为参数传递
- 如何专门化模板化类,以采用不带参数的方法函数类型
- 类方法/函数中的指针
- 修改参数和/或返回新实例的方法/函数的命名约定
- 在Lua中跟踪变量以进行读访问,以启动用户定义的c++方法/函数
- 调试可视化工具在预览中使用成员方法/函数调用