c ++unit testing框架的比较

我知道关于c ++unit testing框架的推荐已经有几个问题,但是所有的答案都没有帮助,因为他们只是推荐一个框架,但是没有提供关于(function)比较的任何信息。

我认为最有趣的框架是CppUnit,Boost和新的Googletesting框架。 有没有人做过比较?

看到这个问题的一些讨论。

他们推荐文章: 探索C ++unit testing框架丛林 ,由Noel Llopis。 而最新的: C ++testing单元框架

我还没有find一篇文章比较googletest和其他框架。

一个新的玩家是谷歌testing (也被称为谷歌C + +testing框架 ),这是相当不错的。

#include <gtest/gtest.h> TEST(MyTestSuitName, MyTestCaseName) { int actual = 1; EXPECT_GT(actual, 0); EXPECT_EQ(1, actual) << "Should be equal to one"; } 

主要特点:

  • 手提
  • 致命的和非致命的断言
  • 简单的断言信息消息ASSERT_EQ(5, Foo(i)) << " where i = " << i;
  • Googletesting会自动检测您的testing,并不要求您列举它们才能运行testing
  • 轻松扩展断言词汇
  • 死亡testing (参见高级指南)
  • 子程序循环的SCOPED_TRACE
  • 您可以决定运行哪些testing
  • XMLtesting报告生成
  • 灯具 / 模拟 / 模板

我刚把自己的框架CATCH推到了那里。 它仍在开发中,但我相信它已经超越了大多数其他框架。 不同的人有不同的标准,但我试图覆盖大部分地面,没有太多的权衡。 看看我的链接的博客条目品尝师。 我的五大特点是:

  • 只有标题
  • 自动注册基于function和方法的testing
  • 将标准的C ++expression式分解成LHS和RHS(所以你不需要一整套assertmacros)。
  • 支持基于function的夹具中的嵌套部分
  • 使用自然语言命名testing – 生成函数/方法名称

它也有Objective-C绑定。 该项目托pipe在Github上

升压testing库是一个非常好的select,特别是如果你已经使用升压。

 // TODO: Include your class to test here. #define BOOST_TEST_MODULE MyTest #include <boost/test/unit_test.hpp> BOOST_AUTO_TEST_CASE(MyTestCase) { // To simplify this example test, let's suppose we'll test 'float'. // Some test are stupid, but all should pass. float x = 9.5f; BOOST_CHECK(x != 0.0f); BOOST_CHECK_EQUAL((int)x, 9); BOOST_CHECK_CLOSE(x, 9.5f, 0.0001f); // Checks differ no more then 0.0001% } 

它支持:

  • 自动或手动testing注册
  • 许多断言
  • 自动比较collections
  • 各种输出格式(包括XML
  • 赛程 / 模板

PS:我写了一篇关于它的文章,可以帮助你开始: C ++unit testing框架:一个升压testing教程

维基百科有一个全面的unit testing框架列表 ,用表来标识支持或不支持的function。

我最近发布了xUnit ++ ,专门用来替代Google Test和Boost Test Library(查看比较 )。 如果您熟悉xUnit.Net,则可以使用xUnit ++。

 #include "xUnit++/xUnit++.h" FACT("Foo and Blah should always return the same value") { Check.Equal("0", Foo()) << "Calling Foo() with no parameters should always return \"0\"."; Assert.Equal(Foo(), Blah()); } THEORY("Foo should return the same value it was given, converted to string", (int input, std::string expected), std::make_tuple(0, "0"), std::make_tuple(1, "1"), std::make_tuple(2, "2")) { Assert.Equal(expected, Foo(input)); } 

主要特点:

  • 令人难以置信的快速:testing同时运行。
  • 手提
  • 自动testing注册
  • 许多断言types(Boost在xUnit ++上都没有)
  • 本地比较集合
  • 断言来自三个层面:
    • 致命的错误
    • 非致命错误
    • 警告
  • 简单的断言Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
  • testing日志logging: Log.Debug << "Starting test"; Log.Warn << "Here's a warning"; Log.Debug << "Starting test"; Log.Warn << "Here's a warning";
  • 赛程
  • 数据驱动的testing(理论)
  • 根据以下内容select要运行testing
    • 属性匹配
    • 名称子string匹配
    • testing套件

CppUTest – 非常好,重量轻的框架与模拟库。 值得仔细观察。

CPUnit( http://cpunit.sourceforge.net )是一个类似于Google Test的框架,但是依赖于较less的macos(断言是函数),并且macros的前缀是为了避免常见的macros陷阱。 testing看起来像:

 #include <cpunit> namespace MyAssetTest { using namespace cpunit; CPUNIT_FUNC(MyAssetTest, test_stuff) { int some_value = 42; assert_equals("Wrong value!", 666, some_value); } // Fixtures go as follows: CPUNIT_SET_UP(MyAssetTest) { // Setting up suite here... // And the same goes for tear-down. } } 

他们自动注册,所以你不需要比这更多。 那么这只是编译和运行。 我发现使用这个框架非常像使用JUnit,对于那些不得不花费一些时间编程Java的人。 非常好!

API Sanity Checker – C / C ++库的testing框架:

一个共享C / C ++库的基本unit testing的自动生成器。 它能够为参数生成合理的(大多数但不是全部)input数据,并通过分析头中的声明为API中的每个函数构造简单的(“完整”或“浅”质量)testing用例文件。

生成的testing质量允许在简单用例中检查是否存在严重错误。 该工具能够build立和执行生成的testing,并检测崩溃(segfaults),中止,各种发射信号,非零的程序返回码和程序挂起。

与CppUnit,Boost和Google Test相比的独特function:

  • 自动生成testing数据和input参数(即使对于复杂的数据types)
  • 现代和高度可重用的专业types,而不是夹具和模板