【发布时间】:2010-09-10 09:49:17
【问题描述】:
我为我的 C++ 代码使用了 Boost Test 框架,但它有两个问题可能是所有 C++ 测试框架共有的:
- 无法创建自动测试存根(例如,通过从选定的类中提取公共函数)。
- 您不能运行单个测试 - 您必须运行整个“套件”测试(我猜除非您创建了许多不同的测试项目)。
有谁知道更好的测试框架,还是我永远嫉妒 Java/.NET 开发人员可用的测试工具?
【问题讨论】:
标签: c++ unit-testing
我为我的 C++ 代码使用了 Boost Test 框架,但它有两个问题可能是所有 C++ 测试框架共有的:
有谁知道更好的测试框架,还是我永远嫉妒 Java/.NET 开发人员可用的测试工具?
【问题讨论】:
标签: c++ unit-testing
我刚刚推出了自己的框架CATCH。它仍在开发中,但我相信它已经超越了大多数其他框架。 不同的人有不同的标准,但我试图在没有太多权衡的情况下涵盖大部分内容。 请查看我的链接博客条目以供品酒师使用。我的前五个功能是:
它不生成存根 - 但这是一个相当专业的领域。我认为Isolator++ 是第一个真正实现这一目标的工具。请注意,模拟/存根框架通常独立于单元测试框架。 CATCH 特别适用于模拟对象,因为测试状态不会通过上下文传递。
它还具有 Objective-C 绑定。
[更新]
几年前我的这个答案刚刚发生。感谢所有伟大的 cmets! 显然,Catch 在那段时间里发展了很多。它现在支持 BDD 样式测试(given/when/then),标签,现在在 single 标题中,以及大量内部改进和改进(例如,更丰富的命令行,清晰和富有表现力的输出等) . A more up-to-date blog post is here.
看看 Google C++ 测试框架。
Google 将它用于他们所有的内部 C++ 项目,所以它一定很不错。
http://googletesting.blogspot.com/2008/07/announcing-new-google-c-testing.html
【讨论】:
Boost.Test 允许按名称运行测试用例。或测试套件。或其中几个。
Boost.Test 并不坚持实现 main,尽管它确实很容易做到。
Boost.Test 不需要用作库。它有单个标题变体。
【讨论】:
我刚刚回复了very similar question。我最终使用了 Noel Llopis 的 UnitTest++。比起 boost::test,我更喜欢它,因为它并不坚持使用宏来实现测试工具的主程序——它可以插入到您创建的任何可执行文件中。它确实遭受了与 boost::test 相同的负担,因为它需要链接一个库。我使用过 CxxTest,它确实比 C++ 领域中的任何其他东西更接近于自动生成测试(尽管它需要 Perl成为您构建系统的一部分来执行此操作)。 C++ 只是不提供 .NET 语言和 Java 提供的反射钩子。 Visual Studio Team System - Developer's Edition 中的 MsTest 工具将自动生成非托管 C++ 的测试存根,但必须从 DLL 导出方法才能执行此操作,因此它不适用于静态库。 .NET 世界中的其他测试框架也可能具有这种能力,但我对其中任何一个都不熟悉。所以现在我们将 UnitTest++ 用于非托管 C++,而我目前正在为托管库选择 MsTest 和 NUnit。
【讨论】:
我是UnitTest++ 的忠实粉丝,它非常轻巧,但能胜任。您可以在那里轻松地运行单个测试。
【讨论】:
好问题!几年前,我一直在四处寻找一些值得使用的东西,但最终还是失败了。我一直在寻找一种非常轻量级且不需要我在某些库中链接的东西……你知道我可以在几分钟内启动并运行的东西。
但是,我坚持了下来,最终遇到了cxxtest。
来自网站:
哇...超级简单! 包含一个从 Test 类派生的头文件,然后您就可以开始运行了。过去四年我们一直在使用它,但我仍然没有找到任何让我更满意的东西。
【讨论】:
试试WinUnit。听起来很棒,John Robbins 推荐。
【讨论】:
我喜欢 Boost 单元测试框架,主要是因为它非常轻量级。
我从未听说过会生成存根的单元测试框架。我通常对代码生成非常不相信,只是因为它很快就过时了。也许当你有大量的类时它会变得有用?
测试驱动开发的支持者可能会说,每次都运行整个测试套件至关重要,以确保没有引入回归。如果运行所有测试花费了太多时间,可能是您的测试太大,或者对 CPU 密集型函数的调用过多而应该被模拟出来?如果仍然存在问题,围绕 boost 单元测试的薄包装应该允许您选择测试,并且可能比学习另一个框架并移植所有测试更快。
【讨论】:
我正在使用tut-framework
【讨论】:
Aeryn 是另一个值得一看的框架
【讨论】:
Visual Studio 有一个内置的单元测试框架,这是为 win32 控制台应用程序设置测试项目的一个很好的链接:
http://codeketchup.blogspot.ie/2012/12/unit-test-for-unmanaged-c-in-visual.html
如果您正在处理静态 DLL 项目,则设置起来要容易得多,因为其他人指出 GTest 和 Boost 等外部测试框架具有额外的功能。
【讨论】:
CppUnit 最初是对 JUnit 的致敬。
【讨论】:
Eclipse/JUnit 是一个可靠的 java 包,两者都有 C++ 扩展/等效项。它可以做你所说的。当然,您必须更改 IDE...
【讨论】:
我也是 UnitTest++ 的粉丝。
问题在于源代码分发包含近 40 个单独的文件。这是荒谬的。管理一个简单项目的源代码控制和构建任务主要是管理所有这些单元测试文件。
我已修改 UnitTest++,以便通过添加一个 .h 和 .cpp 文件将其与项目集成。这被我称为“最可爱”。详情在http://ravenspoint.com/blog/index.php?entry=entry080704-063557
它不会按照原始问题的要求自动生成测试存根。我不禁想到这样的功能会比它的价值更麻烦,会生成大量无用的代码“测试”访问器函数。
【讨论】:
我想自动存根测试函数将更像是一个函数(框架的脚本或)相关的开发环境。假设 CodeGear 的 C++Builder 应用程序将快速生成用户功能的测试代码。
【讨论】:
Andrew Marlow 的果糖库值得一试...http://fructose.sourceforge.net/
我记得他的文档包含在他编写 Fructose 时对其他产品的相当详细的分析和比较,但找不到直接指向该文档的 URL。
【讨论】:
我正在尝试Igloo,它也是一个只有头文件的 C++ 测试套件,即使它包含的两个依赖项也只是头文件。
所以,它非常简单明了。除了 github 上包含的示例外,主站点igloo-testing.org 上还有示例和更多详细信息。随着我对它和其他框架的更多经验,我稍后会更新它。
【讨论】: