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的人。 非常好!
在http://www.progweap.com/resources.html有一些相关的C ++unit testing资源
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,而不是夹具和模板