最先进的C ++单元测试?

时间:2013-12-16 08:58:59

标签: c++ visual-studio unit-testing cross-platform

C ++语言的单元测试最现代的方法是什么?具有更大内省能力的语言类(如Python)具有单元测试框架,这些框架在某种程度上更自然地使用。可以更容易地定义单元测试。相比之下,经典CppUnit(基于JUnit)似乎采取非常保守的方法。是否有更新更好的东西使用C ++(甚至C ++ 11)的特定功能来让生活更轻松?

对于Windows原生C ++(Visual Studio 2005和2010)上的部分项目,我一直以相当简单的方式使用CppUnit框架。我们之前没有选择测试驱动开发方法,因为已经有很多遗留代码,我们发现很难为它添加测试。我们不得不重构应用程序,但即使在这种情况下,添加所有不错的测试也会非常耗时。

最近,我们已经切换到Visual Studio 2013(因为C ++ 11标准实现),我们将开始新的,而不是长期的项目。

拥有以前良好(小)的单元测试经验,我想尝试测试驱动开发方法。由于项目不是很小(预期大小与旧版本大致相同,即大约200 k行代码),我更喜欢更简单(但能力不强)的框架。

新项目有可能导致跨平台实施(Windows和Linux)。 Visual Studio 2013中有单元测试支持,但我没有使用它的经验以及它如何适应跨平台。

到目前为止,我找到了list of unit testing frameworks for C++。然而,人们无法看出它们在原理上有何不同。我目前有三个候选人(保守选择):

  • 提升 - 可能的候选人;测试用于C ++标准;因此它很可能被广泛接受;可能是最大的用户群。它似乎比CppUnit更高级。
  • CppUnit - 我知道,但是编写所有代码并不是一种乐趣。
  • Visual Studio 2013内置 - 对我来说很新,可能会以某种方式生成骷髅。

无论如何,似乎三者都使用类似的方法。可能VS2013支持生成代码,但这并不意味着它会导致更简单的任何内容。

有没有全新的方法?

2 个答案:

答案 0 :(得分:51)

唯一值得考虑的测试框架: Catch

有关lib的介绍,另请参阅herehere

它易于使用(仅包含一个标头的头文件库),可移植,并且是迄今为止所有C ++单元测试框架中最简单,最干净的语法。

与其他库不同,您不需要记住二十多个不同的宏或不同类型的断言。

您只需使用REQUIRE:

int one = 1;
REQUIRE( one == 2 );

通过一些聪明的运算符重载,将在输出中显示原始表达式和扩展参数值:

test.cc(7): FAILED:
  REQUIRE( one == 2 )
with expansion:
  1 == 43

与此相比,每个其他框架都是使用IMO的苦差事。

在我发现这个之前,我曾经使用过Boost.Test,但是设置和使用这些很多更加麻烦。我们在工作中使用CppUnit,这似乎被设计为尽可能脆弱和痛苦。

我简要介绍了VS2013的测试框架,但没有尝试过,它看起来很容易,但非常像是在模仿“老卫士”。它并没有真正尝试比CppUnit,Boost.Test以及Catch之前的所有其他更干净,更容易或更好。所以我要说不要理会它。测试应该很容易编写(和理解),而Catch是我在前面看到的所有其他框架之前的光年。

答案 1 :(得分:4)

我已经使用内置测试框架的Visual Studio 2013大约6周了,非常喜欢它。集成非常好,很容易上手。如果您正在开发一个仅针对Windows的项目,那么我会全面推荐它。