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


299

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

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



我有自己的基于IOC的测试框架,我更喜欢它,因为它不仅是所有其他工具的克隆,而且还解决了我发现其他所有问题的问题。您可以通过派生类而不是使用宏来编写测试用例。宏仅用于断言,因为它们会给您反映。定制输出测试统计信息。从IOC脚本运行,因此您可以选择要测试的内容,测试的频率和参数。
CashCow 2014年

从开发的角度来看,它是很棒的,因为当我添加自己的测试时,我可以运行它,而不必同时运行其他所有人。所以我知道我的代码正在工作。
CashCow 2014年

Answers:


99

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

他们推荐以下文章: Noel Llopis的“ 探索C ++单元测试框架Jungle”。以及更新的版本:C ++测试单元框架

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


如我所写:所有答案只是建议一个框架,而没有将框架与另一个框架进行比较。
女服务员

您也对这篇文章不满意吗?
Gishu

7
一项批评:该文章虽然不错,但来自2004年,不包括Google Test。
richq

2
在第一个链接中,您将看到两个比较。除了Google的新框架外,大多数信息仍然有用。(而且CppUnit不是最有趣的,使用起来太笨拙了)
卢克·赫米特

1
修复了链接并通过最近的比较来扩展了答案
Sam Saffron

120

新的播放器是Google Test(也称为Google C ++ Testing Framework),它非常不错。

#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测试报告生成
  • 装置 / 模拟 / 模板 ...

3
我真的很喜欢在其他一些框架上使用google test,尤其是它的模拟功能可以在googlemock框架中找到。
Mike

8
我在新的测试框架CATCH中提供了所有这些功能(尽管有些功能尚未公开)和更多功能。看到我的答案链接。
philsquared

2
将它与Google C ++ Mocking框架结合在一起,使其成为用于单元测试C ++代码的真正强大的xUnit测试框架。
ratkok 2011年

5
@CashCow与构建一起运行与测试检测有所不同。与build一起运行取决于您的build系统。测试检测机构不具备列出在另一个类中的所有测试,只需要创建一个测试方法,就是这样。
2014年

我不喜欢他们对宏的过度使用,也不喜欢使用像TEST这样的通用词可能与某些东西冲突的事实。GTEST会更好,不会发生冲突。
CashCow

112

我刚刚推出了自己的框架CATCH。它仍在开发中,但我相信它已经超越了大多数其他框架。不同的人有不同的标准,但我试图在没有太多取舍的情况下涵盖大多数领域。看看我的品酒师链接博客条目。我的五个主要功能是:

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

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


请考虑添加CHECK_FLASEREQUIRE_FLASE宏。
Emile Cormier 2014年

6
我认为最好的框架。
CoffeDeveloper

3
doctest是我对Catch的重新实现,重点是编译速度- 请查看FAQ以了解它们的不同之处
onqtam,2013年

@einpoklum Catch不会被放弃-创建者正在使用库的版本2。doctest是对Catch 1的重新实现,具有一些额外的设计决策
onqtam,2016年

2
在比较所有测试框架(我现在必须选择其中的一个)时,我真的很茫然。您是否会编写自己的答案,将doctest与Catch和其他产品进行比较和对比?
einpoklum

53

Boost测试库是一个很好的选择,特别是如果您已经在使用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测试教程


我曾经使用Boost测试并喜欢它,除了它在发布之间似乎有很大变化。将API出售给我的客户足够困难,而不必花费更多的时间(和他们的钱)在API更改时修复测试,而不是修复原本打算测试的代码。最后,我放弃了它,写了我自己的书-那是大约5年前的事了。
组件

5
教程链接已损坏
mloskot

2
@mloskot它再次起作用。
克里斯·杰斯特·杨

@mloskot抱歉,如果您发现它已损坏,请直接给我发送电子邮件。比评论更容易找到。:)
2015年

@Wernight是,再次工作。Thx
mloskot 2015年


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";
  • 治具
  • 数据驱动的测试(理论)
  • 根据以下条件选择要运行测试
    • 属性匹配
    • 名称子串匹配
    • 测试套件

2
问题是要进行比较。IMO,至关重要的是要介绍您的框架以及至少两个流行的框架之间的区别:googletest和Boost。特别是,如果您宣传xUnit ++作为这两个的替代方案。如果更新,将为+1 :)
mloskot

很公平。:)我已经在Wiki上有了一个比较表,但是我将尝试直接在我的答案中总结一些差异。
moswald 2013年

1
我决定直接直接链接Wiki表,这使摘要混乱不堪,将其全部列出。
moswald

该链接对我有用,谢谢!+1
mloskot

1
您的项目被终止了吗?上一次提交的日期可以追溯到09/2015 ...无论如何,很好的答案。谢谢。
zertyz


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。非常好!



2

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

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

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

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

  • 自动生成测试数据和输入参数(即使对于复杂的数据类型)
  • 现代且高度可重用的专用类型,而不是固定装置和模板
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.