326

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

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

4

10 回答 10

131

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

#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_TRACEfor 子程序循环
  • 您可以决定运行哪些测试
  • XML测试报告生成
  • 夹具/模拟/模板...
于 2010-08-25T12:16:14.097 回答
126

我刚刚推出了我自己的框架CATCH。它仍在开发中,但我相信它已经超越了大多数其他框架。不同的人有不同的标准,但我试图在没有太多权衡的情况下涵盖大部分内容。请查看我的链接博客条目以供品酒师使用。我的前五个功能是:

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

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

于 2010-12-28T03:14:31.410 回答
108

请参阅此问题进行一些讨论。

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

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

于 2008-10-28T11:19:14.523 回答
55

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++ Unit Testing Framework: A Boost Test Tutorial

于 2010-08-25T12:24:23.750 回答
26

Wikipedia 有一个完整的单元测试框架列表,其中包含标识支持与否的功能的表格。

于 2009-06-26T20:50:44.997 回答
16

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

主要特点:

  • 难以置信的快:测试同时运行。
  • 便携的
  • 自动测试注册
  • 许多断言类型(Boost 在 xUnit++ 上没有任何东西)
  • 本机比较集合
  • 断言分为三个级别:
    • 致命错误
    • 非致命错误
    • 警告
  • 简单的断言记录:Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
  • 测试记录:Log.Debug << "Starting test"; Log.Warn << "Here's a warning";
  • 夹具
  • 数据驱动测试(理论)
  • 选择要运行的测试基于:
    • 属性匹配
    • 名称子串匹配
    • 测试套件
于 2012-10-25T04:58:28.697 回答
5

CppUTest - 非常漂亮的轻量级框架,带有模拟库。值得仔细看看。

于 2011-06-07T18:40:12.703 回答
4

CPUnit ( http://cpunit.sourceforge.net ) 是一个类似于 Google 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。非常好!

于 2011-07-15T16:47:27.233 回答
3

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

于 2009-11-16T14:56:51.830 回答
3

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

用于共享 C/C++ 库的基本单元测试的自动生成器。它能够为参数生成合理的(在大多数情况下,但不幸的是不是所有情况下)输入数据,并通过分析标题中的声明为 API 中的每个函数编写简单(“健全”或“浅薄”质量)的测试用例文件。

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

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

  • 自动生成测试数据和输入参数(即使是复杂的数据类型)
  • 现代且高度可重用的专用类型,而不是固定装置和模板
于 2011-01-25T15:28:15.623 回答