C ++单元测试框架

时间:2008-09-17 21:21:32

标签: c++ unit-testing

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

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

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

18 个答案:

答案 0 :(得分:66)

我刚刚推出了自己的框架CATCH。它仍在开发中,但我相信它已经超过了大多数其他框架。 不同的人有不同的标准,但我试图覆盖大部分地方而没有太多的权衡。 查看我的链接博客条目,了解品尝者。我的五大特色是:

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

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

它还具有Objective-C绑定。

[更新]

几年前刚回到我的这个答案。感谢所有好评! 显然,Catch在那个时代已经发展了很多。它现在支持BDD样式测试(给定/当/时),标签,现在在标题中,以及大量内部改进和改进(例如更丰富的命令行,清晰和富有表现力的输出等) 。 A more up-to-date blog post is here.

答案 1 :(得分:23)

查看Google C ++测试框架。

Google已将其用于所有内部C ++项目,因此它必须非常好。

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

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

答案 2 :(得分:22)

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

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

Boost.Test不需要用作库。它有单头标题。

答案 3 :(得分:19)

我刚回复very similar question。我最终使用了Noel Llopis的UnitTest ++。我比boost :: test更喜欢它,因为它没有坚持用宏来实现测试工具的主程序 - 它可以插入你创建的任何可执行文件。它确实遭受了与boost :: test相同的阻碍,因为它需要链接一个库。我使用过CxxTest,它确实比C ++中的任何其他东西更接近 - 自动生成测试(尽管它需要Perl)成为你的构建系统的一部分来做到这一点)。 C ++只是不提供.NET语言和Java所做的反射挂钩。 Visual Studio Team System中的MsTest工具 - Developer's Edition将自动生成非托管C ++的测试存根,但这些方法必须从DLL导出才能执行此操作,因此它不适用于静态库。 .NET世界中的其他测试框架也可能具有此功能,但我不熟悉其中的任何一个。所以现在我们将UnitTest ++用于非托管C ++,而我目前正在为托管库决定MsTest和NUnit。

答案 4 :(得分:8)

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

答案 5 :(得分:6)

好问题!几年前,我永远四处寻找值得使用的东西,并且做得很短。我正在寻找一些非常轻量级的东西,并且不需要我链接到一些库...你知道我可以在几分钟内起床和运行的东西。

然而,我坚持并最终在cxxtest上运行。

来自网站:

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

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

答案 6 :(得分:4)

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

答案 7 :(得分:3)

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

  • 我从未听说过会生成存根的单元测试框架。我一般都不相信代码生成,只是因为它很快就过时了。当你有大量的课程时,它可能会变得有用吗?

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

答案 8 :(得分:2)

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

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

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

答案 9 :(得分:2)

Aeryn是另一个值得关注的框架

答案 10 :(得分:2)

我正在使用tut-framework

答案 11 :(得分:2)

答案 12 :(得分:1)

CppUnit是对JUnit的原始致敬。

答案 13 :(得分:0)

我认为自动删除测试函数将更多地是一个函数(框架的脚本或者)所讨论的开发环境。据推测,CodeGear的C ++ Builder应用程序将快速生成用户函数的测试代码。

答案 14 :(得分:0)

我也是UnitTest ++的粉丝。

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

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

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

答案 15 :(得分:0)

Eclipse / JUnit是java的可靠包,并且两者都有C ++扩展/等价物。它可以做你正在谈论的事情。当然,你必须改变IDE ......

答案 16 :(得分:0)

Andrew Marlow的Fructose图书馆值得一试...... http://fructose.sourceforge.net/

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

答案 17 :(得分:0)

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

所以,它非常简单明了。除了github上包含的示例之外,还有主要站点igloo-testing.org的示例和更多详细信息。我将在稍后更新此内容,因为我获得了更多使用它和其他框架的经验。

相关问题