最新的C ++unit testing?
什么是最现代的C ++语言unit testing方法? 具有更大内省能力的语言(比如Python)的类有unit testing框架,这些框架在某种程度上更自然地使用。 unit testing可以更容易地定义。 相比之下,传统的CppUnit
(基于JUnit
)似乎采取了非常保守的方法。 有没有更新,更好的使用C ++(甚至C ++ 11)的特定function使生活更轻松?
我一直在使用CppUnit
框架一段时间,以简单的方式对Windows本机C ++(Visual Studio 2005和2010)的部分项目。 我们之前没有selecttesting驱动开发方法,因为已经有很多遗留代码,我们发现为它添加testing是相当困难的。 我们不得不重构应用程序,但是即使在这种情况下,添加所有漂亮的testing也是非常耗时的。
最近,我们已经切换到Visual Studio 2013(因为C ++ 11标准实现),我们将开始一个新的,相当长期的项目。
有了以前好的(小)unit testing经验,我想尝试一下testing驱动开发的方法。 由于该项目不是一个小的(预期大小与大约相同,即大约200 k行代码),我宁愿更容易(但不是更低的能力)的框架。
新项目有可能导致跨平台的实施(Windows和Linux)。 在Visual Studio 2013中有一个unit testing支持,但我没有经验,它将如何适应跨平台。
到目前为止,我已经find了C ++的unit testing框架列表 。 但是,我们不能看出它们在原理上有什么不同。 我目前有三名候选人(保守select):
- 提振 – 可能的候选人; C ++标准的testing平台; 因此有可能被广泛接受; 可能是最大的用户群。 它似乎比
CppUnit
更先进。 - CppUnit – 我知道,但是编写所有代码并不是一件愉快的事情。
- Visual Studio 2013内置 – 对我来说是新的,不知何故可能会生成框架。
无论如何,似乎所有的三个使用类似的方法。 可能VS2013支持生成代码,但并不意味着它会导致更简单。
有没有任何新的方法?
唯一值得考虑的testing框架: Catch
有关lib的介绍,请参阅这里和这里
它很容易使用(仅包含一个头文件头的头文件),是可移植的,并且是迄今为止任何C ++unit testing框架中最简单,最干净的语法。
和其他库不同,你不需要记住二十几个不同的macros或不同types的断言。
你只需要使用REQUIRE:
int one = 1; REQUIRE( one == 2 );
通过一些聪明的操作符重载,它将在输出中显示原始expression式和扩展的参数值:
test.cc(7): FAILED: REQUIRE( one == 2 ) with expansion: 1 == 43
相比之下,其他每一个框架都是使用IMO的一件难事。
我在使用Boost.Test之前曾经发现过这个问题,但是设置和使用起来要麻烦很多 。 我们在工作中使用CppUnit,这似乎被devise成尽可能脆弱和痛苦。
我简单地看了一下VS2013的testing框架,但还没有尝试过,看起来可以忍受,但很像是模仿“老门卫”。 它实际上并不比CppUnit,Boost.Test和Catch之前的所有其他更清晰,更容易或更好。 所以我会说,不要打扰它。 testing应该很容易写(和理解),而且Catch比我在前面看到的其他所有框架都要早。
我一直在使用testing框架内build的Visual Studio 2013大约6周,真的很喜欢它。 整合非常好,拿起来很容易。 如果您正在开发一个只针对Windows的项目,那么我会彻底推荐它。