it-swarm.cn

C++单元测试框架

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

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

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

60
Rob

我只是回答了一个 非常相似的问题 。我最终使用了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。

19
Brian Stewart

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

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

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

它还具有Objective-C绑定。

[更新]

几年前刚回到我的这个答案。感谢所有好评!显然,Catch在那个时代已经发展了很多。它现在支持BDD样式测试(给定/当/时),标签,现在在 single header,以及内部改进和改进的加载(例如更丰富的命令行,清晰和富有表现力的输出等)。 这是一篇更新的博客文章。

66
philsquared

看看Google C++测试框架。

它被谷歌用于他们所有的内部C++项目,因此它必须非常好。

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

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

23
Jeff Miller

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

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

Boost.Test不需要用作库。它有单头变体。

22
user49248

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

8
yrp

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

但是,我坚持并最终在 cxxtest 中运行。

来自网站:

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

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

6
Scott Saad

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

4
Steve Duitsman

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

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

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

3
small_duck

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

2
David Sykes
2
Ray Tayek

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

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

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

2
dvn

我正在使用 tut-framework

2
gtjthm

CppUnit 是对JUnit的原始致敬。

1
duffymo

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

0
Aaron

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

0
Kris Kumler

我也是UnitTest ++的粉丝。

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

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

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

0
ravenspoint

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

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

0
leetNightshade

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

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

0
Tony Delroy