C ++代码unit testing – 工具和方法

我正在研究一个已经发展了几年的大型c ++系统。 作为提高现有代码质量的一部分,我们参与了一个大型的长期重构项目。

你知道一个好的工具,可以帮助我用C ++编写unit testing吗? 也许类似于Junit或Nunit?

任何人都可以对编写没有unit testing的模块编写unit testing的方法提供一些很好的build议吗?

对遗留代码应用unit testing是编写遗留代码的有效工作的原因 。 Michael Feathers是作者 – 正如其他答案中提到的,他参与了CppUnit和CppUnitLite的创build。

替代文字http://ecx.images-amazon.comhttp://img.dovov.comI/51RCXGPXQ8L._SL160_AA115_.jpg

谷歌最近发布了自己的库unit testingC ++应用程序,称为谷歌testing。

Google代码上的项目

检查几个可用的套房之间的一个很好的比较 。 该文章的作者后来开发了UnitTest ++ 。

我特别喜欢的是(除了处理exception等事实外),testing用例和testing夹具定义的“pipe理”数量非常有限。

Boost有一个包含对unit testing支持的testing库 。 这可能值得一试。

游戏内部的 Noel Llopis是“ 探索C ++unit testing框架丛林”的作者 ,这是对各种C ++unit testing框架的全面(但是现在过时的)评估,还有一本关于游戏编程的书。

他使用了CppUnitLite很长一段时间,修复了各种各样的东西,但最终与另一个unit testing库作者联手,并生成了UnitTest ++ 。 我们在这里使用UnitTest ++,到目前为止,我非常喜欢它。 它对我来说占有一个很小的空间,恰到好处的权力平衡。

我使用了本土解决scheme,CxxTest(需要Perl)和boost :: test。 当我在当前的工作中在这里实现unit testing时,它几乎归结为UnitTest ++ vs boost :: test。

我真的很喜欢我用过的大多数boost库,但是恕我直言,boost :: test有点过于霸道。 我特别不喜欢它需要你(AFAIK)使用boost :: testmacros来实现testing工具的主程序。 我知道它不是“纯粹的”TDD,但是有时我们需要一种方法来运行GUI应用程序的testing,例如,当在命令行中传入一个特殊的testing标志时,boost :: test不能支持这种types情景。

UnitTest ++是设置和使用我在(有限)体验中遇到的最简单的testing框架。

我正在使用优秀的Boost.Test库与一个不太知名的,但如此真棒的Turtle库:一个基于boost的模拟对象库。

作为一个代码示例说话比单词更好,想象一下你想testing一个在view界面上工作的calculator对象(这就是Turtle的介绍性例子):

 // declares a 'mock_view' class implementing 'view' MOCK_BASE_CLASS( mock_view, view ) { // implements the 'display' method from 'view' (taking 1 argument) MOCK_METHOD( display, 1 ) }; BOOST_AUTO_TEST_CASE( zero_plus_zero_is_zero ) { mock_view v; calculator c( v ); // expects the 'display' method to be called once with a parameter value equal to 0 MOCK_EXPECT( v, display ).once().with( 0 ); c.add( 0, 0 ); } 

看看在模拟对象上声明期望是多么容易和冗长? 很显然,如果不能达到期望,testing就会失败。

我刚把自己的框架CATCH推到了那里。 它仍在开发中,但我相信它已经超越了大多数其他框架。 不同的人有不同的标准,但我试图覆盖大部分地面,没有太多的权衡。 看看我的链接的博客条目品尝师。 我的五大特点是:

  • 只有标题
  • 自动注册基于function和方法的testing
  • 将标准的C ++expression式分解成LHS和RHS(所以你不需要一整套assertmacros)。
  • 支持基于function的夹具中的嵌套部分
  • 使用自然语言命名testing – 生成函数/方法名称

它也有Objective-C绑定。

CxxTest是一个轻量级,易于使用和跨平台的C ++的JUnit / CppUnit / xUnit-like框架。

UnitTest ++ ,小而简单。

我目前正在寻找一个unit testing和模拟框架,可以在我们公司使用一个长期居住的代码库。 正如你所知,c ++ unit testing框架的列表很长,所以我应用了一些filter来将其减less到一个可以更仔细地查看的手工满。 第一个过滤标准是它必须是免费的。 第二个标准是项目活动。 我也寻找嘲笑框架,因为如果你想写unit testing你需要一个框架。

我想出了下面的列表(大约)按活动sorting,最高的活动在顶部:

  • GoogleTest / GoogleMock:许多贡献者,并由Google自己使用。 这可能会在这里一段时间,并收到更新。 对于我的私人代码库,我会切换到这个组合,希望跳上最快的列车。

  • BoostTest + Turtle:不经常更新,但是testing框架是提升的一部分,所以应该保持。 另一方面乌龟主要由一个人维护,但是它有怨恨活动所以没有死。 我用这个组合testing了几乎所有的testing经验,因为我在之前的工作中已经使用了boost库,而且我现在使用它作为我的私有代码。

  • CppUTest:提供testing和模拟 。 这个项目从2008年到2015年一直保持活跃,并有相当多的近期活动。 这个发现有点让人惊喜,因为在网上search的时候,很多活动less得多的项目(比如CppUnit在2013年的最后一次更新)就更经常出现。 我没有更深入的看这个,所以我不能详细说任何事情。 编辑(16.12.2015):最近我试了一下,发现这个框架有点笨拙和“C时尚”,尤其是当使用模拟类。 而且其他框架似乎也有较less的断言。 我认为它的主要优点是可以和纯C项目一起使用。

  • QTest: Qt框架附带的testing库。 维护应该保证一段时间,但我用它作为支持库,因为testing注册是IMO在其他框架中更笨拙。 据我所知,它迫使你有一个testing – exe每个testing夹具。 但是在testingQt-Gui代码时,testing帮助函数可以很好的使用。 它没有嘲笑。

  • 赶上:它有最近的活动,但主要是由一个人开发。 这个框架的好处是可以让你在testing中编写可重用的夹具代码。 它也可以让你设置testing名称为string,这是很好的,当你倾向于写作整个句子作为testing名称。 我希望这种风格会被撕裂并投入googleTest 😉

模拟框架

模拟框架的数量远小于testing框架的数量,但这里是我发现最近的活动。

  • Hippomock :现在活跃于2008年的单位,但只有低强度。

  • FakeIt :现在活跃于2013年的单位,但多多lessless由一个人开发。

结论

如果您的代码库长期运行,请在BoostTest + TurtleGoogleTest + GoogleMock之间进行select。 我认为这两个将有长期的维护。 如果你只有一个短暂的代码库,你可以试试Catch ,它有一个很好的语法。 那么你需要另外select一个模拟框架。 如果您使用Visual Studio,则可以下载BoostTest和GoogleTest的testing运行器适配器,这将允许您使用集成到VS中的testing运行器GUI运行testing。

这里也可以看到“select一个c ++unit testing工具/框架”这个密切相关的问题的答案

还有TUT ,Template-Unit-Test,一个基于模板的框架。 它的语法很尴尬(有些人称之为模板滥用),但它的主要优点是它全部包含在单个头文件中 。

你会在这里find一个用TUT编写的unit testing的例子 。

我试过CPPunit,它不是非常用户友好的。

我知道的唯一select是使用C ++ .NET来包装你的C ++类并用.NETunit testing框架(NUnit,MBUnit等)编写unit testing。

CppUTest是用于C和C ++unit testing的优秀的轻量级框架。

ObjectMentor的Michael Feathers在CppUnit和CppUnitLite的开发中发挥了作用。

他现在推荐CppUnitLite

看看CUnitWin32 。 它是为MS Visual C编写的。它包含一个示例。

看看cfix( http://www.cfix-testing.org ),它专门用于Windows C / C ++开发,支持用户模式和内核模式unit testing。

如果您在Visual Studio 2008 SP1上,我强烈build议使用MSTest编写unit testing。 然后,我使用Google模拟来编写模拟。 与IDE的集成是理想的,在编辑三个位置来增加一个testing的同时允许和不承担CPPunit的开销。

我认为VisualAssert在VS集成方面做得很好。 它可以让你运行和debugging来自VS的testing,你不需要创build一个可执行文件来运行testing。

看看果糖: http : //sourceforge.net/projects/fructose/

这是一个非常简单的框架,只包含头文件,因此便于携带。

我正在使用Typemock Isolator ++的 MS Test。 试一试!