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

Comparison of C++ unit test frameworks

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

我认为最有趣的框架是CppUnit,Boost和新的Google测试框架。 有人做过任何比较吗?


一个新的播放器是Google Test(也称为Google C ++测试框架),但它非常好用。

1
2
3
4
5
6
7
#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;
  • Google Test会自动检测您的测试,并且不需要您枚举它们才能运行它们
  • 可以轻松扩展断言词汇表
  • 死亡测试(参见高级指南)
  • SCOPED_TRACE用于子程序循环
  • 您可以决定运行哪些测试
  • XML测试报告生成
  • 固定装置/模拟/模板......


我刚推出了自己的框架,CATCH。它仍在开发中,但我相信它已经超过了大多数其他框架。
不同的人有不同的标准,但我试图覆盖大部分地方而没有太多的权衡。
查看我的链接博客条目,了解品尝者。我的五大特色是:

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

它还具有Objective-C绑定。该项目由Github托管


有关讨论,请参阅此问题。

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

我还没有找到一篇将googletest与其他框架进行比较的文章。


Boost测试库是一个非常好的选择,特别是如果您已经在使用Boost。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 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测试教程


维基百科有一个完整的单元测试框架列表,其中包含可识别支持与否的功能的表。


我最近发布了xUnit ++,特别是作为Google Test和Boost Test Library的替代品(查看比较)。如果您熟悉xUnit.Net,那么您已准备好使用xUnit ++。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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 ++上没有任何内容)
  • 本地比较集合。
  • 断言分为三个层次:

    • 致命错误
    • 非致命错误
    • 警告
  • 易断言记录:Assert.Equal(-1, foo(i)) <<"Failed with i =" << i;
  • 测试记录:Log.Debug <<"Starting test"; Log.Warn <<"Here's a warning";
  • 赛程
  • 数据驱动测试(理论)
  • 根据以下内容选择要运行的测试:

    • 属性匹配
    • 命名substring matchin
    • 测试套房


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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的人。非常好!


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


有一些相关的C ++单元测试资源
http://www.progweap.com/resources.html


API Sanity Checker - C / C ++库的测试框架:

An automatic generator of basic unit tests for a shared C/C++ library. It is able to generate reasonable (in most, but unfortunately not all, cases) input data for parameters and compose simple ("sanity" or"shallow"-quality) test cases for every function in the API through the analysis of declarations in header files.

The quality of generated tests allows to check absence of critical errors in simple use cases. The tool is able to build and execute generated tests and detect crashes (segfaults), aborts, all kinds of emitted signals, non-zero program return code and program hanging.

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

  • 自动生成测试数据和输入参数(即使对于复杂的数据类型)
  • 现代且高度可重复使用的专用类型,而不是固定装置和模板