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

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


当前回答

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

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

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

其他回答

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) 固定装置/模板…

PS:我写了一篇关于它的文章,可能会帮助你入门:c++单元测试框架:Boost测试教程

有关讨论,请参阅这个问题。

他们推荐的文章: 探索c++单元测试框架丛林,作者:Noel Llopis。 最近的:c++测试单元框架

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

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

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

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

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

我最近发布了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));
}

主要特点:

Incredibly fast: tests run concurrently. Portable Automatic test registration Many assertion types (Boost has nothing on xUnit++) Compares collections natively. Assertions come in three levels: fatal errors non-fatal errors warnings Easy assert logging: Assert.Equal(-1, foo(i)) << "Failed with i = " << i; Test logging: Log.Debug << "Starting test"; Log.Warn << "Here's a warning"; Fixtures Data-driven tests (Theories) Select which tests to run based on: Attribute matching Name substring matchin Test Suites