c++单元测试框架的比较

我知道已经有一些关于推荐c++单元测试框架的问题,但所有的答案都没有帮助,因为他们只是推荐了一个框架,而没有提供任何关于(特性)比较的信息。

我认为最有趣的框架是CppUnit、Boost和新的谷歌测试框架。有人做过比较吗?

328195 次浏览

看这个问题进行一些讨论。

他们推荐的文章: 探索c++单元测试框架丛林,由诺埃尔·洛皮斯。 最近的c++测试单元框架

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

维基百科有一个全面的单元测试框架的列表,用表格来标识支持或不支持的特性。

一个新的播放器是谷歌测试(也称为谷歌c++测试框架),这是非常好的。

#include <gtest/gtest.h>


TEST(MyTestSuitName, MyTestCaseName) {
int actual = 1;
EXPECT_GT(actual, 0);
EXPECT_EQ(1, actual) << "Should be equal to one";
}

主要特点:

  • 可移植的
  • Fatal和非致命的断言
  • 简单断言信息消息: ASSERT_EQ(5, Foo(i)) << " where i = " << i;
  • 谷歌Test 自动检测你的测试,不需要你枚举它们来运行它们
  • 使扩展断言词汇表变得容易
  • 死亡测试(参见高级指南)
  • SCOPED_TRACE用于子例程循环
  • 你可以决定要运行哪些测试
  • XML测试报告生成
  • __abc0 / __abc1 / __abc2…

Boost Test Library是一个非常好的选择,特别是如果你已经在使用Boost。

// 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%
}

它支持:

  • 自动或手动测试注册
  • 很多人断言
  • 自动比较集合
  • 各种输出格式(包括XML)
  • __abc0 / __abc1…

PS:我写了一篇关于它的文章,可能会帮助你开始:c++单元测试框架:一个增强测试教程

我刚刚推出了我自己的框架Catch2。它仍在开发中,但我相信它已经超越了大多数其他框架。 不同的人有不同的标准,但我试图涵盖大部分领域,没有太多的权衡。 你可以看看我的博客链接。我的五大特性是:

  • 头只
  • 自动注册基于功能和方法的测试
  • 将标准c++表达式分解为LHS和RHS(因此不需要一整套断言宏)。
  • 支持基于函数的fixture中的嵌套部分
  • 使用自然语言命名测试-生成函数/方法名称

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

API完整性检查器 - C/ c++库的测试框架:

用于共享C/ c++库的基本单元测试的自动生成器。它能够为参数生成合理的(在大多数情况下,但不幸的是不是所有情况下)输入数据,并组成简单的("或者“shallow"-quality”)通过分析头文件中的声明为API中的每个函数测试用例。

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

与CppUnit, Boost和谷歌Test相比,独特的功能:

  • 自动生成测试数据和输入参数(即使是复杂的数据类型)
  • 现代且高度可重用的专业类型取代fixture和模板

CppUTest -非常不错,轻量级框架与模拟库。值得一看。

CPUnit (http://cpunit.sourceforge.net)是一个类似于谷歌Test的框架,但它依赖较少的macos(断言是函数),其中宏是前缀,以避免通常的宏陷阱。测试如下所示:

#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.
}


}

他们会自动注册,所以你不需要更多。然后只需编译并运行即可。我发现对于那些不得不花一些时间编写Java程序的人来说,使用这个框架非常像使用JUnit。非常好!

我最近发布了xUnit + +,特别是作为谷歌测试和Boost测试库的替代品(查看比较)。如果你熟悉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));
}

主要特点:

  • 难以置信的快:测试运行同时
  • 可移植的
  • 自动测试注册
  • 许多断言类型(Boost在xunit++上没有任何内容)
  • 本机比较集合
  • 断言有三个级别:
    • 致命错误
    • 非致命错误
    • 警告
    • 李< / ul > < / >
    • 简单的断言日志记录:Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
    • 测试日志:Log.Debug << "Starting test"; Log.Warn << "Here's a warning";
    • 固定装置
    • 数据驱动的测试(理论)
    • 选择要运行的测试基于:
      • 属性匹配
      • 命名子字符串matchin
      • 测试套件
      • 李< / ul > < / >