【问题标题】:C++ unit testing framework [closed]C++ 单元测试框架
【发布时间】:2010-09-10 09:49:17
【问题描述】:

我为我的 C++ 代码使用了 Boost Test 框架,但它有两个问题可能是所有 C++ 测试框架共有的:

  • 无法创建自动测试存根(例如,通过从选定的类中提取公共函数)。
  • 您不能运行单个测试 - 您必须运行整个“套件”测试(我猜除非您创建了许多不同的测试项目)。

有谁知道更好的测试框架,还是我永远嫉妒 Java/.NET 开发人员可用的测试工具?

【问题讨论】:

    标签: c++ unit-testing


    【解决方案1】:

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

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

    生成存根 - 但这是一个相当专业的领域。我认为Isolator++ 是第一个真正实现这一目标的工具。请注意,模拟/存根框架通常独立于单元测试框架。 CATCH 特别适用于模拟对象,因为测试状态不会通过上下文传递。

    它还具有 Objective-C 绑定。

    [更新]

    几年前我的这个答案刚刚发生。感谢所有伟大的 cmets! 显然,Catch 在那段时间里发展了很多。它现在支持 BDD 样式测试(given/when/then),标签,现在在 single 标题中,以及大量内部改进和改进(例如,更丰富的命令行,清晰和富有表现力的输出等) . A more up-to-date blog post is here.

    【讨论】:

    • 优秀的测试套件。
    • (+1) 即使在早期阶段,也是最好和最容易使用的一个。唯一缺少的是模型,虽然我很少需要它们,所以我没有抱怨。
    • +1。单个标题包含 == 很棒。
    • 这太棒了。使用表达式模板替换其他测试套件的各种断言宏的方式非常巧妙。
    • doctest 是我对 Catch 的重新实现,非常注重编译速度 - 查看 FAQ 看看它们之间有什么不同
    【解决方案2】:

    看看 Google C++ 测试框架。

    Google 将它用于他们所有的内部 C++ 项目,所以它一定很不错。

    http://googletesting.blogspot.com/2008/07/announcing-new-google-c-testing.html

    http://code.google.com/p/googletest

    【讨论】:

      【解决方案3】:

      Boost.Test 允许按名称运行测试用例。或测试套件。或其中几个。

      Boost.Test 并不坚持实现 main,尽管它确实很容易做到。

      Boost.Test 不需要用作库。它有单个标题变体。

      【讨论】:

        【解决方案4】:

        我刚刚回复了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。

        【讨论】:

          【解决方案5】:

          我是UnitTest++ 的忠实粉丝,它非常轻巧,但能胜任。您可以在那里轻松地运行单个测试。

          【讨论】:

          • UnitTest++ 的链接不再有效。 :(
          • 它从 sourceforge 转移到了 github。
          【解决方案6】:

          好问题!几年前,我一直在四处寻找一些值得使用的东西,但最终还是失败了。我一直在寻找一种非常轻量级且不需要我在某些库中链接的东西……你知道我可以在几分钟内启动并运行的东西。

          但是,我坚持了下来,最终遇到了cxxtest

          来自网站:

          • 不需要 RTTI
          • 不需要成员模板函数
          • 不需要异常处理
          • 不需要任何外部库(包括内存管理、文件/控制台 I/O、图形库)
          • 完全作为一组头文件(和一个 python 脚本)分发。

          哇...超级简单! 包含一个从 Test 类派生的头文件,然后您就可以开始运行了。过去四年我们一直在使用它,但我仍然没有找到任何让我更满意的东西。

          【讨论】:

          • 也许你应该试试 CATCH。我说“也许”是因为它确实需要异常和成员模板函数。其余的与您的列表相同(没有 Python 脚本)。有关更多信息,请参阅我的答案。
          • 该链接不再有效,他们迁移到 github。 github.com/CxxTest/cxxtest
          • @leetNightshade 已更新。谢谢你。 :)
          【解决方案7】:

          试试WinUnit。听起来很棒,John Robbins 推荐。

          【讨论】:

          • 我正在使用它,相当轻巧且易于上手。测试套件被组织成 DLL,然后由 winunit exec 加载。启动单一测试的可能性,请参阅winunit.codeplex.com/…
          【解决方案8】:

          我喜欢 Boost 单元测试框架,主要是因为它非常轻量级。

          • 我从未听说过会生成存根的单元测试框架。我通常对代码生成非常不相信,只是因为它很快就过时了。也许当你有大量的类时它会变得有用?

          • 测试驱动开发的支持者可能会说,每次都运行整个测试套件至关重要,以确保没有引入回归。如果运行所有测试花费了太多时间,可能是您的测试太大,或者对 CPU 密集型函数的调用过多而应该被模拟出来?如果仍然存在问题,围绕 boost 单元测试的薄包装应该允许您选择测试,并且可能比学习另一个框架并移植所有测试更快。

          【讨论】:

          • 生成存根是将编写测试的开销减少到几次击键的唯一方法。
          【解决方案9】:
          【解决方案10】:

          我正在使用tut-framework

          【讨论】:

            【解决方案11】:

            Aeryn 是另一个值得一看的框架

            【讨论】:

            【解决方案12】:

            Visual Studio 有一个内置的单元测试框架,这是为 win32 控制台应用程序设置测试项目的一个很好的链接:

            http://codeketchup.blogspot.ie/2012/12/unit-test-for-unmanaged-c-in-visual.html

            如果您正在处理静态 DLL 项目,则设置起来要容易得多,因为其他人指出 GTest 和 Boost 等外部测试框架具有额外的功能。

            【讨论】:

              【解决方案13】:

              CppUnit 最初是对 JUnit 的致敬。

              【讨论】:

              • 作为 JUnit 的粉丝,这看起来对我有用。
              • 这个线程中的许多其他答案比我的更频繁。您可以通过查看其他一些建议来为自己提供服务。我的帖子已有 6 年历史,它基于我使用 CppUnit 的经验,现在已经 13 岁了。
              • 正确!这里有很多很棒的选择。但是,我查找了 CppUnit,它似乎符合我的要求。 :-)
              【解决方案14】:

              Eclipse/JUnit 是一个可靠的 java 包,两者都有 C++ 扩展/等效项。它可以做你所说的。当然,您必须更改 IDE...

              【讨论】:

                【解决方案15】:

                我也是 UnitTest++ 的粉丝。

                问题在于源代码分发包含近 40 个单独的文件。这是荒谬的。管理一个简单项目的源代码控制和构建任务主要是管理所有这些单元测试文件。

                我已修改 UnitTest++,以便通过添加一个 .h 和 .cpp 文件将其与项目集成。这被我称为“最可爱”。详情在http://ravenspoint.com/blog/index.php?entry=entry080704-063557

                它不会按照原始问题的要求自动生成测试存根。我不禁想到这样的功能会比它的价值更麻烦,会生成大量无用的代码“测试”访问器函数。

                【讨论】:

                  【解决方案16】:

                  我想自动存根测试函数将更像是一个函数(框架的脚本或)相关的开发环境。假设 CodeGear 的 C++Builder 应用程序将快速生成用户功能的测试代码。

                  【讨论】:

                    【解决方案17】:

                    Andrew Marlow 的果糖库值得一试...http://fructose.sourceforge.net/

                    我记得他的文档包含在他编写 Fructose 时对其他产品的相当详细的分析和比较,但找不到直接指向该文档的 URL。

                    【讨论】:

                      【解决方案18】:

                      我正在尝试Igloo,它也是一个只有头文件的 C++ 测试套件,即使它包含的两个依赖项也只是头文件。

                      所以,它非常简单明了。除了 github 上包含的示例外,主站点igloo-testing.org 上还有示例和更多详细信息。随着我对它和其他框架的更多经验,我稍后会更新它。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-02-14
                        • 1970-01-01
                        • 1970-01-01
                        • 2023-04-10
                        • 2023-03-11
                        • 1970-01-01
                        相关资源
                        最近更新 更多