最先进的C++单元测试

State of the art C++ Unit Testing?

本文关键字:C++ 单元测试      更新时间:2023-10-16

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的项目,那么我非常推荐它。