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

pep*_*epr 49 c++ unit-testing cross-platform visual-studio

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

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

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

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

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

到目前为止,我已经找到了C++的单元测试框架列表.然而,人们无法看出它们在原理上有何不同.我目前有三个候选人(保守选择):

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

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

有没有全新的方法?

jal*_*alf 51

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

有关lib的介绍,请参见此处此处

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

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

你只需要使用REQUIRE:

int one = 1;
REQUIRE( one == 2 );
Run Code Online (Sandbox Code Playgroud)

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

test.cc(7): FAILED:
  REQUIRE( one == 2 )
with expansion:
  1 == 43
Run Code Online (Sandbox Code Playgroud)

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

我曾经使用如Boost.Test我发现这之前,但那是很多比较繁琐设置和使用.我们在工作中使用CppUnit,这似乎被设计为尽可能脆弱和痛苦.

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

  • C++ 11 - 如果你想要一些非常简单的东西(250 LOC),请看**[lest](https://github.com/martinmoene/lest)**.它是C++ 11特有的,基于与Catch相同的表达式分解技术.还有一个C++ 03端口. (8认同)
  • [doctest](https://github.com/onqtam/doctest)是我对Catch的重新实现,主要关注编译速度 - 查看[FAQ](https://github.com/onqtam/doctest/blob/master /doc/markdown/faq.md#how-is-doctest-different-from-catch)看看它们有什么不同 (5认同)
  • @Wallacoloo享受;)谢谢你的评论; 我添加了对跨多个文件和相关示例编写测试的支持. (2认同)