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)) << " where i = " << 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_FLASE
和REQUIRE_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)) << "Failed with i = " << i;
测试日志记录:Log.Debug << "Starting test"; Log.Warn << "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 ++单元测试框架的比较[关闭]的主要内容,如果未能解决你的问题,请参考以下文章