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

时间:2008-09-18 10:08:47

标签: c++ unit-testing refactoring

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

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

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

22 个答案:

答案 0 :(得分:81)

将单元测试应用于遗留代码是非常原因 Working Effectively with Legacy Code。 Michael Feathers是作者 - 正如其他答案中所提到的,他参与了CppUnitCppUnitLite的创作。

alt text

答案 1 :(得分:39)

谷歌最近发布了自己的单元测试C ++应用程序库,名为Google Test。

Project on Google Code

答案 2 :(得分:30)

查看几个可用套件之间的优秀comparison。该文章的作者后来发展了UnitTest++

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

答案 3 :(得分:24)

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

答案 4 :(得分:21)

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

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

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

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

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

答案 5 :(得分:17)

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

作为一个代码示例说得比单词更好,想象一下你想测试一个calculator对象,该对象适用于view接口(即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 );
}

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

答案 6 :(得分:14)

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

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

它还具有Objective-C绑定。

答案 7 :(得分:9)

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

答案 8 :(得分:7)

答案 9 :(得分:7)

UnitTest++,小&简单。

答案 10 :(得分:5)

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

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

  • 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运行测试。

答案 11 :(得分:3)

另请参阅密切相关的问题“选择c ++单元测试工具/框架”的答案,here

答案 12 :(得分:3)

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

你会在这里找到example of unit-test written with TUT

答案 13 :(得分:2)

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

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

答案 14 :(得分:2)

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

答案 15 :(得分:1)

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

他现在推荐CppUnitLite

答案 16 :(得分:1)

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

答案 17 :(得分:1)

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

答案 18 :(得分:1)

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

答案 19 :(得分:1)

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

答案 20 :(得分:0)

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

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

答案 21 :(得分:0)

我正在使用Typemock Isolator++进行MS测试。试一试!