关于C ++代码的单元测试:C ++代码的单元测试 – 工具和方法

Unit testing for C++ code - Tools and methodology

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

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

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


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

alt text


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

Google Code上的项目


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

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


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


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 ++是我在(有限的)体验中遇到的最简单的设置和使用测试框架。


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

作为一个代码示例说得比单词更好,想象一下你想测试一个在view接口上工作的calculator对象(这是Turtle的介绍性示例):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 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 );
}

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


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

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

它还具有Objective-C绑定。


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


UnitTest ++,小而简单。


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

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

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


我目前正在寻找一个单元测试和模拟框架,可以在我们公司使用长期代码库。如您所知,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 + Turtle和GoogleTest + GoogleMock之间进行选择。我认为这两个将有长期维护。如果你只有一个短暂的代码库,你可以尝试Catch,它有一个很好的语法。然后你需要另外选择一个模拟框架。如果您使用Visual Studio,您可以下载BoostTest和GoogleTest的测试运行适配器,这将允许您使用集成到VS中的测试运行器GUI运行测试。


另请参阅此处与密切相关的问题"选择c ++单元测试工具/框架"的答案


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

你会在这里找到一个用TUT编写的单元测试的例子。


CppUTest是一个优秀,轻量级的C和C ++单元测试框架。


我已经尝试过CPPunit并且它不是非常用户友好。

我所知道的唯一选择是使用C ++ .NET来包装C ++类并使用.NET单元测试框架(NUnit,MBUnit等)编写单元测试。


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


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


如果您使用的是Visual Studio 2008 SP1,我强烈建议您使用MSTest编写单元测试。然后我使用Google mock来编写模拟。与IDE的集成是理想的,并且在编辑三个位置以添加一个测试方面允许并且不承担CPPunit的开销。


我认为VisualAssert在VS集成方面做得很好。它允许您从VS运行和调试测试,并且您无需创建可执行文件即可运行测试。


ObjectMentor的Michael Feathers在开发CppUnit和CppUnitLite方面发挥了重要作用。

他现在推荐CppUnitLite


我正在使用带有Typemock Isolator ++的MS Test。试试看!


检查果糖:http://sourceforge.net/projects/fructose/

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


推荐阅读

    linux命令补全工具?

    linux命令补全工具?,工具,系统,软件,地址,命令,名称,智能,环境,信息,终端,简

    linux关闭系统的命令?

    linux关闭系统的命令?,系统,工作,命令,时间,用户,指令,通知,目的,终端,表示,

    linux系统nl命令?

    linux系统nl命令?,系统,工作,命令,信息,文件,标准,工具,单位,公式,内容,nl是

    linux命令修复系统?

    linux命令修复系统?,系统,地址,时间,工作,数据,一致,第一,工具,流程,命令,当L

    linux更新系统的命令?

    linux更新系统的命令?,系统,工作,单位,管理,信息,命令,地址,基础,数据,工具,l

    linux系统开发命令?

    linux系统开发命令?,工作,系统,地址,信息,命令,目录,数据,管理,单位,功能,Win

    linux系统命令awk?

    linux系统命令awk?,数据,系统,工具,基础,标准,名称,单位,命令,文本,语法,Linu

    linux命令行退出系统?

    linux命令行退出系统?,系统,工作,时间,地址,信息,命令,软件,工具,发行,电脑,

    linux系统剪切命令?

    linux系统剪切命令?,工作,地址,系统,位置,管理,信息,目录,命令,标准,工具,Lin

    小红帽系统linux命令?

    小红帽系统linux命令?,系统,设备,密码,管理,连续,位置,命令,目录,文件,方法,

    linux系统命令vim?

    linux系统命令vim?,系统,工作,发行,模式,连续,工具,官方网站,状态,环境,时间

    linux系统常用命令表?

    linux系统常用命令表?,系统,基础,工作,工具,管理,网络,命令,数据,标准,地址,l

    linux系统命令无效?

    linux系统命令无效?,系统,密码,数据,工具,网络,信息,软件,情况,在线,时报,lin

    linux系统解压缩命令?

    linux系统解压缩命令?,系统,工具,管理,文件,命令,名称,电脑,格式,文件名,目

    linux系统用户命令?

    linux系统用户命令?,系统,工作,地址,信息,管理,命令,目录,时间,电脑,名称,请

    linux系统清缓存命令?

    linux系统清缓存命令?,数据,系统,地址,服务,网络,电脑,缓存,工具,环境,设备,l

    linux系统命令中nl?

    linux系统命令中nl?,系统,工作,信息,地址,命令,基础,实时,工具,标准,对比,Lin

    linux系统中vi命令?

    linux系统中vi命令?,位置,状态,档案,系统,首开,工作,数据,环境,数字,正规,lin

    linux系统负载命令?

    linux系统负载命令?,系统,情况,信息,电脑,工具,管理,状态,时间,命令,灵活,Lin

    linux系统初始化命令?

    linux系统初始化命令?,系统,基础,工作,服务,信息,命令,软件,网络,密码,发行,l