C ++单元测试框架的比较[关闭]

Posted

技术标签:

【中文标题】C ++单元测试框架的比较[关闭]【英文标题】:Comparison of C++ unit test frameworks [closed] 【发布时间】:2010-09-19 13:35:30 【问题描述】:

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

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

【问题讨论】:

Unit testing for C++ code - Tools and methodology 的可能重复项 我有自己的基于 IOC 的测试框架,我更喜欢它,因为它不仅是所有其他人所做的克隆,而且解决了我发现其他人的所有问题。您通过派生类而不是使用宏来编写测试用例。宏只用于断言,因为它们给你反射。测试统计的定制输出。从 IOC 脚本运行,因此您可以选择测试的内容、频率和参数。 从开发的角度来看,这非常棒,因为当我添加自己的测试时,我可以运行它而无需同时运行其他所有人的测试。所以我知道我的代码正在运行。 【参考方案1】:

一个新的播放器是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)) &lt;&lt; " where i = " &lt;&lt; i; Google Test 自动检测您的测试,并且不需要您枚举它们即可运行它们 轻松扩展您的断言词汇 死亡测试(参见高级指南) SCOPED_TRACE 用于子程序循环 您可以决定运行哪些测试 XML 测试报告生成 夹具 / 模拟 / 模板...

【讨论】:

我真的很喜欢在其他一些框架上使用 google test,尤其是它的模拟功能可以在 googlemock 框架中找到。 我在我的新测试框架 CATCH 中提供了所有这些功能(尽管有些尚未公开)以及更多功能。请参阅我的答案以获取链接。 将它与 Google C++ Mocking 框架相结合,使其成为真正强大的用于单元测试 C++ 代码的 xUnit 测试框架。 @CashCow 运行构建与测试检测不同。使用 build 运行取决于您的构建系统。测试检测意味着您没有必须列出另一个类中的所有测试,只需创建测试方法即可。 我不喜欢他们过度使用宏,以及使用 TEST 之类的常用词可能会与某些东西发生冲突的事实。 GTEST 会更好,不太可能发生冲突。【参考方案2】:

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

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

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

【讨论】:

请考虑添加CHECK_FLASEREQUIRE_FLASE 宏。 我认为最好的框架。 doctest 是我对 Catch 的重新实现,非常注重编译速度 - 查看 FAQ 以了解它们有何不同 @einpoklum Catch 没有被放弃 - 创建者正在开发库的第 2 版。 doctest 是 Catch 1 的一种重新实现,带有一些额外的设计决策 在比较所有测试框架(我现在必须选择其中一个)时,我真的很茫然。你会写自己的答案来比较和对比 doctest 与 Catch 和其他产品吗?【参考方案3】:

See this question 进行一些讨论。

他们推荐的文章: Exploring the C++ Unit Testing Framework Jungle,诺埃尔·洛皮斯。 最近的:C++ Test Unit Frameworks

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

【讨论】:

正如我所写:所有答案都只是推荐其中一个框架,但不要将框架与另一个框架进行比较。 你对这篇文章也不满意? 一个批评:这篇文章虽然不错,但来自 2004 年,不包括 Google 测试。 在第一个链接中,您将看到两个比较。除了谷歌的新框架,大多数信息(是?)仍然相关。 (而且CppUnit不是最有趣的,用起来太笨拙了) 修复了链接并通过更新的比较扩展了答案【参考方案4】:

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

【讨论】:

我曾经使用 Boost 测试并喜欢它,只是它似乎在发布之间发生了显着变化。当 API 发生变化时,向我的客户出售单元测试,而不是花费更多的时间(和他们的钱)来修复测试,而不是修复它打算测试的代码,这已经够困难的了。最后我放弃了它,自己写了——不过这是大约 5 年前的事了。【参考方案5】:

***有一个全面的list of unit testing frameworks,其中包含标识支持与否的功能的表格。

【讨论】:

【参考方案6】:

我最近发布了xUnit++,专门作为 Google 测试和 Boost 测试库的替代品(查看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)) &lt;&lt; "Failed with i = " &lt;&lt; i; 测试日志记录:Log.Debug &lt;&lt; "Starting test"; Log.Warn &lt;&lt; "Here's a warning"; 夹具 数据驱动测试(理论) 选择要运行的测试基于: 属性匹配 名称子串匹配 测试套件

【讨论】:

问题要求比较。 IMO,展示您的框架与至少两个流行的框架之间的差异是至关重要的:googletest 和 Boost。特别是,如果您宣传 xUnit++ 作为这两者的替代品。如果更新将 +1 :) 很公平。 :) 我已经在wiki 上找到了comparison table,但我会尝试在我的回答中直接总结一些不同之处。 我决定直接链接 wiki 表,它把总结弄得乱七八糟。 该链接对我有用,谢谢! +1 你的项目已经停止了吗?最后一次提交可以追溯到 09/2015 ......无论如何,很好的答案。谢谢。【参考方案7】:

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

【讨论】:

【参考方案8】:

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。很不错!

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

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

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

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

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

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

【讨论】:

以上是关于C ++单元测试框架的比较[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

哪个免费的C#单元测试框架? [关闭]

在 Windows 上使用哪个单元测试框架进行 C 开发? [关闭]

C中单元测试的自动生成器[关闭]

现在常用的C/C++单元测试工具有那些?

C的单元测试框架[重复]

数据库的单元测试框架[关闭]