代码之家  ›  专栏  ›  技术社区  ›  Rob

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

  •  60
  • Rob  · 技术社区  · 16 年前

    我使用的是我的C++代码的Boost测试框架,但是它存在两个问题,这可能是所有C++测试框架中常见的问题:

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

    有人知道一个更好的测试框架吗?还是我永远嫉妒Java/.NET开发人员提供的测试工具?

    18 回复  |  直到 16 年前
        1
  •  19
  •   Community rohancragg    7 年前

    我刚对一个 very similar question .我最终使用了诺埃尔·洛皮斯的UnitTest++。我更喜欢它而不是boost::test,因为它没有坚持用宏实现测试工具的主程序——它可以插入您创建的任何可执行文件。它确实会遇到与boost::test相同的负担,因为它需要链接一个库。我已经使用了CXXTEST,它比C++中的任何东西都更接近自动生成测试(尽管它需要Perl作为构建系统的一部分来完成)。C++不提供.NET语言和Java所做的反射钩子。VisualStudioTeam Stase-开发人员版中的MSTEST工具将自动生成非托管C++的测试存根,但这些方法必须从DLL导出,才能做到这一点,因此它不能与静态库一起工作。.NET世界中的其他测试框架也可能具有这种能力,但我对其中任何一种都不熟悉。所以现在我们使用UNITTest++来管理非托管C++,而我目前在MSTestNoST和NUnice之间为托管库进行决策。

        2
  •  66
  •   philsquared    10 年前

    我刚推出了自己的框架, CATCH ,就在那里。它仍在开发中,但我相信它已经超越了大多数其他框架。 不同的人有不同的标准,但我试图在没有太多折衷的情况下覆盖大多数领域。 请看一下我链接的博客文章,看看有没有品味。我的五大特点是:

    • 仅标题
    • 功能和方法测试的自动注册
    • 将标准C++表达式分解为LHS和RHS(这样就不需要一个完整的断言宏)。
    • 支持基于函数的fixture中的嵌套节
    • 使用自然语言的名称测试-生成函数/方法名称

    做一代树桩-但这是一个相当专业的领域。我想 Isolator++ 是第一个真正实现这一目标的工具。注意,模拟/存根框架通常独立于单元测试框架。catch尤其适用于模拟对象,因为测试状态不是由上下文传递的。

    它还具有objective-c绑定。

    [更新]

    就在几年前我的回答中。感谢大家的好评! 显然,在那个时候,渔获物已经发展了很多。它现在支持BDD风格的测试(给定/何时/然后),标签,现在在 单一的 标题,以及内部改进和改进的加载(例如,更丰富的命令行、清晰和表达的输出等)。 A more up-to-date blog post is here.

        3
  •  23
  •   J Miller    16 年前

    看看谷歌C++测试框架。

    它被谷歌用于所有的内部C++项目,所以它必须是相当好的。

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

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

        4
  •  22
  •   user49248    16 年前

    测试允许按名称运行测试用例。或测试套件。或者其中一些。

    测试并没有坚持执行MAIN,尽管它确实使实现变得容易。

    没有必要将测试用作库。它有单头变量。

        5
  •  8
  •   DarenW    9 年前

    我非常喜欢 UnitTest++ 它很轻,但能起到作用。您可以在那里轻松地运行单个测试。

        6
  •  6
  •   Scott Saad    10 年前

    好问题!几年前,我环顾四周,寻找值得使用的东西,结果发现不足。我在找一些非常轻量的东西,不需要我在一些库中链接…你知道的 我可以在几分钟内起床跑步。

    但是,我坚持了下来,最后跑了过去 cxxtest .

    从网站:

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

    真的。。。超简单! 包含一个头文件,从测试类派生,然后关闭并运行。在过去的四年里,我们一直在使用它,我仍然没有找到任何我更满意的东西。

        7
  •  4
  •   Steve Duitsman    16 年前

    尝试 WinUnit . 听起来很好,建议 John Robbins .

        8
  •  3
  •   small_duck    16 年前

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

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

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

        9
  •  2
  •   Ray Tayek    16 年前
        10
  •  2
  •   gtjthm    16 年前

    我在用 tut-framework

        11
  •  2
  •   David Sykes    10 年前

    Aeryn 另一个框架值得研究吗

        12
  •  2
  •   CDVN    10 年前

    Visual Studio具有内置的单元测试框架,这是为Win32控制台应用程序设置测试项目的重要链接:

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

    如果您正在处理一个静态的dll项目,那么设置起来就容易得多,正如其他人指出的那样,外部测试框架(如gtest和boost)具有额外的特性。

        13
  •  1
  •   duffymo    16 年前

    CppUnit 是对朱尼特的最初敬意。

        14
  •  0
  •   Aaron    16 年前

    Eclipse/JUnit是Java的一个坚实的包,并且有两个C++扩展/等价物。它能做到你所说的。当然,你得换一下IDES…

        15
  •  0
  •   ravenspoint    16 年前

    我也是UnitTest++的粉丝。

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

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

    它不会自动生成测试存根,正如在原始问题中所要求的那样。我不禁想到,这样的特性会比它的价值更麻烦,产生大量无用的代码“测试”访问函数。

        16
  •  0
  •   Kris Kumler    16 年前

    我可以想象,自动删除测试函数将更像是一个函数(框架脚本或相关开发环境的脚本)。据推测,CodeGear的C++Builder应用程序将快速生成用户函数的测试代码。

        17
  •  0
  •   Tony Delroy    13 年前

    安德鲁·马洛的果糖图书馆值得一看… http://fructose.sourceforge.net/

    我记得在他写果糖的时候,他的文档包含了对其他产品的相当详细的分析和比较,但是没有找到直接指向该文档的URL。

        18
  •  0
  •   leetNightshade    10 年前

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

    所以,这非常简单明了。除了Github上包含的示例外,在主站点还有一些示例和更多详细信息, igloo-testing.org . 我稍后会更新这个,因为我在IT和其他框架方面有更多的经验。