最先进的C++单元测试
State of the art C++ Unit Testing?
C++语言的单元测试最现代的方法是什么?具有更大内省能力的语言类(如Python)具有更自然使用的单元测试框架。单元测试可以更容易地定义。相比之下,经典的CppUnit
(基于JUnit
)似乎采取了非常保守的方法。有没有什么更新更好的东西可以使用C++(甚至C++11)的特定功能来让生活更轻松?
一段时间以来,我一直在以相当简单的方式使用CppUnit
框架,用于Windows本机C++(Visual Studio 2005和2010)上的部分项目。我们之前没有选择测试驱动开发方法,因为已经有很多遗留代码,而且我们发现很难为其添加测试。我们必须重构应用程序,但即使在这种情况下,添加所有漂亮的测试也会很耗时。
最近,我们已经切换到Visual Studio 2013(因为C++11标准实现),我们将开始一个新的、相当长期的项目。
由于之前在单元测试方面有很好的(小)经验,我想尝试一下测试驱动的开发方法。由于该项目不是一个小项目(预期大小与旧项目大致相同,即大约200 k行代码),我更喜欢更简单(但功能不差)的框架。
新项目有可能实现跨平台(Windows和Linux)。VisualStudio2013中有一个单元测试支持,但我没有使用它的经验,也没有它如何适应跨平台。
到目前为止,我已经找到了C++的单元测试框架列表。然而,我们看不出它们在原则上有什么不同。我目前有三位候选人(保守派选择):
- Boost——可能的候选者;C++标准的试验台;因此,它很可能会被广泛接受;可能是最大的用户群。它似乎比
CppUnit
更先进 - CppUnit——我知道,但它编写所有的代码并不是一种乐趣
- Visual Studio 2013内置——对我来说是新的,可能会以某种方式生成骨架
不管怎样,三者似乎都使用了类似的方法。VS2013可能支持生成代码,但这并不意味着它会导致任何更简单的事情。
有什么全新的方法吗?
唯一值得考虑的测试框架:捕获
有关lib的介绍,请参阅此处和此处的
它易于使用(仅包含一个头的头库),可移植,并且具有迄今为止任何C++单元测试框架中最简单、最干净的语法。
与其他库不同,您不需要记住20多个不同的宏或不同类型的断言。
您只需使用REQUIRE:
int one = 1;
REQUIRE( one == 2 );
通过一些巧妙的运算符重载,它将在输出中显示原始表达式和扩展的参数值:
test.cc(7): FAILED:
REQUIRE( one == 2 )
with expansion:
1 == 43
与此相比,使用IMO.的其他框架都是一件麻烦的事
我以前用Boost。在我发现这个之前进行了测试,但设置和使用起来要麻烦得多。我们在工作中使用CppUnit,这似乎是为了尽可能地脆弱和痛苦。
我简要地看了一下VS2013测试框架,但还没有尝试过,它看起来还可以,但很像是在模仿"老卫士"。它并没有真正尝试比CppUnit、Boost更干净、更容易或更好。测试和Catch之前的所有其他测试。所以我想说,不要为它烦恼。测试应该很容易写(和理解),Catch在这方面比我见过的所有其他框架都领先几光年。
我已经使用Visual Studio 2013内置测试框架大约6周了,非常喜欢它。集成非常好,而且很容易上手。如果你正在做一个只针对Windows的项目,那么我非常推荐它。
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- VC++本机单元测试,找不到调试符号
- 用于交叉编译和CMake的预处理器宏的单元测试
- C++ 用于单元测试的模板模板
- 提升 1.64 单元测试编译失败
- 单元测试欧拉到四元数实现失败
- 运行 C++ 单元测试时LNK2005链接错误
- 禁用自动捕获 Googletest 单元测试中的C++异常
- 有没有办法在不使用 #ifdef 的情况下不编译发布版本中的单元测试函数体?
- 使用 Google Test 对自定义断言函数进行单元测试
- 如何将我的 CMake 项目配置为运行所有单元测试?
- 在Qt C++单元测试中动态加载QQuickWindow而不是QQuickWidget
- MS 本机单元测试 - 断言::线程失败不起作用
- 如何获取 CMake 单元测试的相对路径?
- QTimer 超时不会在单元测试中触发
- 如何在提升构建中设置环境变量以进行提升单元测试框架?
- 在 AtMega32a 上运行的C++的单元测试
- 使用 gtest 框架在单元测试代码中检查目标对象的私有变量的最佳实践是什么?
- 如何用 c++ 编写单元测试?