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

时间:2008-10-28 11:13:01

标签: c++ unit-testing cppunit googletest boost-test

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

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

10 个答案:

答案 0 :(得分:112)

新播放器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测试会自动检测到您的测试,并且不需要您枚举它们才能运行它们
  • 轻松扩展您的断言词汇
  • 死亡测试(参见高级指南)
  • SCOPED_TRACE用于子程序循环
  • 您可以决定运行哪些测试
  • XML 测试报告生成
  • 灯具 / 模拟 / 模板 ......

答案 1 :(得分:103)

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

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

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

答案 2 :(得分:90)

See this question进行一些讨论。

他们推荐文章: Exploring the C++ Unit Testing Framework Jungle,作者:Noel Llopis。 最近的:C++ Test Unit Frameworks

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

答案 3 :(得分:50)

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

答案 4 :(得分:21)

维基百科有一个全面的list of unit testing frameworks,其中的表格可以识别是否支持。

答案 5 :(得分:14)

我最近发布了xUnit++,特别是作为Google Test和Boost Test Library的替代品(查看comparisons)。如果您熟悉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";
  • 赛程
  • 数据驱动测试(理论)
  • 根据以下内容选择要运行的测试
    • 属性匹配
    • 名称substring matchin
    • 测试套件

答案 6 :(得分:4)

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

答案 7 :(得分: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.
    }

}

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

答案 8 :(得分:3)

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

答案 9 :(得分:2)

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

  

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

     

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

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

  • 自动生成测试数据和输入参数(即使对于复杂数据类型)
  • 现代且高度可重复使用specialized types而不是灯具和模板