当前位置:  开发笔记 > 编程语言 > 正文

C++代码的单元测试 - 工具和方法

如何解决《C++代码的单元测试-工具和方法》经验,为你挑选了11个好方法。

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

你知道一个很好的工具可以帮助我用C++编写单元测试吗?也许类似于Junit或Nunit?

任何人都可以为编写单元测试的方法提供一些很好的建议,这些模块是在没有单元测试的情况下编写的吗?



1> Joe Schneide..:

将单元测试应用于遗留代码是编写" 有效使用遗留代码"的原因 .Michael Feathers是作者 - 正如其他答案所述,他参与了CppUnit和CppUnitLite的创作.

替代文字


从什么时候开始c ++遗产?!
这不是C++的遗产 - 如果我没记错的话,那本书将遗留项目定义为没有或很少单元测试的项目.这样的项目确实倾向于/很难/编写单元测试,因为测试驱动的开发从未影响代码库,因此编写它们是微不足道的.
@Nils:正如本书的亚马逊评论家之一所提到的那样,"遗留代码是没有单元测试的代码",这正是这个问题的关键所在.
添加了缩略图 - 已投票.这本书比任何工具都更有帮助.
我认为CPPUnit可以让编写测试更简单.我们使用CPPUnit,但我不满意.我需要为每个测试更新两个文件,在我看来,测试应该像编写一样简单:'TEST("testname"){ASSERT(1 == 1);}'另一方面,本书是每个人都必须拥有,不仅是那些使用遗留代码的人,也是创造它的人;)

2> agnul..:

Google最近发布了自己的库,用于测试C++应用程序,称为Google Test.

Google Code上的项目


另一个不错的观点是嘲弄的可能性:http://code.google.com/p/googlemock/

3> andreas buyk..:

查看几个可用套件之间的出色比较.该文章的作者后来开发了UnitTest ++.

我特别喜欢它(除了它处理异常等事实之外)是围绕测试用例和测试夹具定义的"管理"量非常有限.


这不是我们的根本谬误吗?他对可用的项目有很好的洞察力-但是他没有改进它们,而是开始自己的项目。

4> Jonas..:

Boost有一个测试库,其中包含对单元测试的支持.可能值得一试.


我可以推荐这个优秀的工具包.

5> Brian Stewar..:

Games From Within的 Noel Llopis 是探索C++单元测试框架丛林的作者,这是对各种C++单元测试框架的综合(但现在已过时)评估,以及一本关于游戏编程的书.

他使用CppUnitLite已经有一段时间了,修复了各种各样的东西,但最终与另一个单元测试库作者联手,并制作了UnitTest ++.我们在这里使用UnitTest ++,到目前为止我非常喜欢它.(对我而言)它具有足够的功率平衡和小占地面积.

我使用了自行开发的解决方案,CxxTest(需要Perl)和boost :: test.当我在我目前的工作中实现单元测试时,它几乎归结为UnitTest ++ vs boost :: test.

我真的很喜欢我使用的大多数升级库,但是恕我直言,boost :: test有点过于苛刻.我特别不喜欢它需要你(AFAIK)使用boost :: test宏来实现测试工具的主程序.我知道它不是"纯粹的"TDD,但有时我们需要一种方法来运行带有GUI应用程序的测试,例如当在命令行上传入一个特殊的测试标志时,boost :: test不能支持这种类型场景.

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



6> icecrime..:

我正在使用优秀的Boost.Test库以及一个鲜为人知但非常棒的Turtle库:一个基于boost的模拟对象库.

由于代码示例比单词更好,想象您想测试一个calculatorview接口上工作的对象(即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 );
}

看看在模拟对象上声明期望有多简单和冗长?显然,如果没有达到预期,测试就会失败.


+1为龟:)

7> philsquared..:

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

仅限标题

自动注册基于功能和方法的测试

将标准C++表达式分解为LHS和RHS(因此您不需要一整套断言宏).

支持基于函数的fixture中的嵌套部分

使用自然语言进行名称测试 - 生成函数/方法名称

它还具有Objective-C绑定.


[doctest](https://github.com/onqtam/doctest)是我对Catch的重新实现,主要关注编译速度 - 查看[FAQ](https://github.com/onqtam/doctest/blob/master /doc/markdown/faq.md#how-is-doctest-different-from-catch)看看他们是如何不同的

8> David Sykes..:

CxxTest是一个轻松,易于使用和跨平台的JUnit/CppUnit/xUnit类C++框架.



9> Jorge Ferrei..:

CppUnit就是这样.见以下链接:

http://cppunit.sourceforge.net/cppunit-wiki

http://en.wikipedia.org/wiki/CppUnit



10> yrp..:

UnitTest ++,小而简单.



11> Knitschi..:

我目前正在寻找一个单元测试和模拟框架,可以在我们公司使用长期代码库.如您所知,c ++ 的单元测试框架列表很长,所以我应用了一些过滤器来将其缩小为手动填充,可以更仔细地查看.第一个过滤标准是它必须是免费的.第二个标准是项目活动.我也寻找模拟框架,因为如果你想编写单元测试你需要一个.

我想出了以下列表(大约)按活动排序,最高活动位于顶部:

GoogleTest/GoogleMock:许多贡献者并由Google本身使用.这可能会在这里停留一段时间并接收更新.对于我的私人代码库,我将切换到这个组合,希望跳上最快的火车.

BoostTest + Turtle:经常不更新,但测试框架是boost的一部分,所以应该维护它.另一方面,乌龟主要由一个人维护,但它反复活动,所以它没有死.我使用这个组合几乎完成了所有的测试经验,因为我们之前的工作已经使用了boost库,而且我目前将它用于我的私有代码.

CppUTest:提供测试和模拟.该项目从2008年到2015年一直活跃,并且近期有很多活动.这个发现有点令人惊讶,因为在网上搜索时,很多活动明显少的项目会更频繁出现(比如CppUnit在2013年的最新更新).我没有深入研究这个问题所以我不能透露细节. 编辑(16.12.2015):我最近尝试了这个,发现这个框架有点笨拙和"C-stylish",特别是在使用模拟类时.此外,它似乎比其他框架有更少的断言.我认为它的主要优势在于它可以用于纯C项目.

QTest: Qt框架附带的测试库.应该保证维护一段时间,但我使用它作为支持库,因为测试注册是IMO比其他框架更笨拙.据我了解,它迫使你每个测试夹具有一个test-exe.但是在测试Qt-Gui代码时,测试辅助函数可以很好地使用.它没有嘲笑.

Catch:它最近有活动,但主要由一个人开发.这个框架的好处是替代夹具方法,它允许您在测试本身中编写可重用的夹具代码.它还允许您将测试名称设置为字符串,当您倾向于将整个句子作为测试名称编写时,这很好.我知道这种风格会被撕掉并放入googleTest ;-)

模拟框架

模拟框架的数量远小于测试框架的数量,但这里是我发现最近有活动的框架.

Hippomock:现在从2008年的单位出发,但强度很低.

FakeIt:现在从2013年开始活跃,但是由一个人或多或少开发.

结论

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

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有