当谈到用 C++ 编写函数或类的单元测试时,似乎很流行将它们写在与原始声明和定义不同的源文件中(例如,math.hpp/math.cpp 的 math_test.cpp)。我想知道将它们写在声明附近是否更好,原因如下:
- 用户可以从单元测试中看到如何使用函数或类
- 开发人员可以清楚地判断一个函数或一个类是否有单元测试
例如,我想知道我是否可以像这样对头文件中的函数声明进行单元测试:
// plus.hpp
int plus(int a, int b);
UNITTEST{ assert(plus(1, 2) == 3); }
源文件和往常一样:
// plus.cpp
int plus(int a, int b) { return a + b; }
并且仅当我定义一个特定的宏(例如 ENABLE_UNITTEST)时,我希望 UNITTEST 代码由编译器评估并由测试运行器可执行文件执行。
我的问题是:
- 像这样在声明附近编写单元测试是一种好习惯吗?
- 是否有任何现有的 C++ 测试框架支持编写这样的测试? (我认为如果框架没有正确实现,plus.hpp被包含在多个源文件中会导致重定义错误)
- 如果 2. 的答案是否定的,是否可以实现这样的测试框架?
最佳答案
Is it a good practice to write unit tests near the declarations like this?
不,不是。单元测试代码多于实际代码的情况并不少见。将两者混为一谈会使您的系统更难维护和重构。
在主代码中放置单元测试的想法对于像您这样的小代码示例来说很有吸引力。然而,在许多情况下,您的单元测试代码很容易是实际代码的三倍甚至四倍,特别是如果您的目标是高代码覆盖率。添加代码的简单大小及其代码内文档将使人们更难更改您的系统。
此外,一些单元测试需要在运行期间保持状态(常见测试框架的设置和拆卸功能处理此问题)。将状态占位符与有效负载代码混合在一起会使事情变得更加复杂。
Is there any existing C++ testing framework that supports writing tests like this?
据我所知不是。
If the answer for 2. is NO, is it possible to implement a testing framework like this?
这当然是可能的 - 例如,您可以使用预处理器宏和条件编译来玩各种花样,从您的“有效负载”代码中提取单元测试,并单独编译它们。不过,我不认为这是可取的。
关于c++ - 在函数/类声明附近编写 C++ 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26609173/