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

你知道有什么好工具可以帮助我用 C++ 编写单元测试吗?也许类似于 Junit 或 Nunit 的东西?

任何人都可以就为没有考虑单元测试而编写的模块编写单元测试的方法提供一些好的建议吗?

有帮助吗?

解决方案

将单元测试应用于遗留代码是 很有道理 有效地处理遗留代码 被写了。迈克尔·羽毛 (Michael Feathers) 是作者 - 正如其他答案中提到的,他参与了两者的创作 Cpp单元CppUnitLite.

alt text

其他提示

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

Google 代码上的项目

看看一个优秀的 比较 在几个可用的套房之间。那篇文章的作者后来发展了 单元测试++.

我特别喜欢它的地方(除了它处理异常等事实)好)是围绕测试用例和测试装置定义的“管理”数量非常有限。

升压有一个 测试库 其中包含对单元测试的支持。也许值得一看。

诺埃尔·洛皮斯 内部游戏 是的作者 探索 C++ 单元测试框架丛林, ,对各种 C++ 单元测试框架的全面评估(但现已过时),以及一本关于游戏编程的书。

他使用 CppUnitLite 相当长一段时间,修复了各种问题,但最终与另一位单元测试库作者联手,并制作了 单元测试++. 。我们在这里使用 UnitTest++,到目前为止我非常喜欢它。(对我来说)它具有精确的力量平衡和较小的占地面积。

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

我真的很喜欢我用过的大多数 boost 库,但恕我直言,boost::test 有点太严厉了。我特别不喜欢它要求您(据我所知)使用 boost::test 宏来实现测试工具的主程序。我知道这不是“纯粹的”TDD,但有时我们需要一种在 GUI 应用程序中运行测试的方法,例如,当在命令行上传递特殊的测试标志时,boost::test 无法支持这种类型的场景。

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

我正在使用优秀的 升压测试 图书馆与一个鲜为人知但非常棒的图书馆结合在一起 图书馆 :一个基于 boost 的模拟对象库。

代码示例胜于雄辩,假设您想测试一个 calculator 作用于 a 的对象 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 );
}

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

我刚刚推出了自己的框架, 抓住, ,在那里。它仍在开发中,但我相信它已经超越了大多数其他框架。不同的人有不同的标准,但我试图在没有太多权衡的情况下涵盖大部分内容。请查看我链接的博客文章以供品尝。我最看重的五个特点是:

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

它还具有 Objective-C 绑定。

测试测试 是一个轻量级、易于使用且跨平台的类似于 JUnit/CppUnit/xUnit 的 C++ 框架。

CppUnit 就是这样。请参阅下面的链接:

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

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

单元测试++, ,小而简单。

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

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

  • 谷歌测试/谷歌模拟: 许多贡献者并被 Google 本身使用。这可能会存在一段时间并接收更新。对于我的私人代码库,我将切换到这种组合,希望能跳上最快的火车。

  • BoostTest + 海龟: 不经常更新,但测试框架是 boost 的一部分,因此应该维护。另一方面,海龟主要由一个人饲养,但它有怨恨的活动,所以它并没有死。我几乎所有的测试经验都是通过这种组合进行的,因为我们已经在我之前的工作中使用了 boost 库,并且我目前将它用于我的私人代码。

  • CppUT测试: 提供测试和模拟。该项目从 2008 年到 2015 年一直活跃,最近有很多活动。这一发现有点令人惊讶,因为在网络上搜索时,许多活动明显较少的项目会更频繁地出现(例如 CppUnit,其最后一次更新是在 2013 年)。我没有深入研究过这个问题,所以我不能透露任何细节。编辑(2015 年 12 月 16 日): 我最近尝试了一下,发现这个框架有点笨拙和“C 风格”,特别是在使用模拟类时。而且它的断言种类似乎比其他框架要少。我认为它的主要优点是它可以与纯 C 项目一起使用。

  • Q测试: Qt 框架附带的测试库。维护应该可以保证一段时间,但我使用它而不是作为支持库,因为在我看来测试注册比其他框架更笨拙。据我了解,它迫使您每个测试装置都有一个测试可执行文件。但是测试辅助函数在测试 Qt-Gui 代码时非常有用。它没有模拟。

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

模拟框架

模拟框架的数量比测试框架的数量少得多,但以下是我发现最近有活动的框架。

  • 河马: :从 2008 年至今一直活跃,但强度较低。

  • 假装: :从 2013 年开始活跃,但现在或多或少是由一个人开发的。

结论

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

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

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

你会发现一个 使用 TUT 编写的单元测试示例 这里。

我尝试过 CPPunit,但它不是很用户友好。

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

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

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

他现在推荐 CppUnitLite

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

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

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

我认为 视觉断言 在VS集成方面做得很好。它允许您从 VS 运行和调试测试,并且不需要创建可执行文件来运行测试。

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

这是一个非常简单的框架,仅包含头文件,因此易于移植。

我正在使用 MS 测试 Typemock 隔离器++. 。试一试!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top