首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的可测试性设计

C++中的可测试性设计
EN

Stack Overflow用户
提问于 2012-03-13 03:36:10
回答 4查看 2.5K关注 0票数 9

我想了解在C++中设计可测试应用程序的最佳方法,也许与C#相比(因为它是我的背景,适合测试)。

我习惯于对接口、依赖注入、控制框架的反转和模拟对象进行编码。由于C#有许多不同的语言特性,所以我不确定这些模式应该应用多少。我还设想C++的独特特性/限制可能会导致不同的测试策略。

我看过单元测试框架,我喜欢谷歌测试,但是编写新的代码以尽可能地测试也是很重要的。

  • 有什么开源项目可以推荐作为C++测试做对吗?
  • 有更详细的书籍或文章深入这个主题吗?
  • 关于增加框架/图书馆的建议

谢谢

EN

回答 4

Stack Overflow用户

发布于 2013-05-03 15:30:30

我自己也处于同样的情况,现在。来自C#背景,现在我正在编写新的(并扩展遗留的) C++应用程序。

我想,共同的背景给我们留下了共同的问题。我感到惊讶的是,在遗留应用程序中,我们的类之间的依赖关系是如此紧密。

正如您所强调的那样,需要关注的是,在C#中的最佳实践可能不是C++中的最佳方法。经过大量的研究,一些堆栈溢出了我自己的问题,还有一些原型,我最终得到了一个C++体系结构,它在很多方面反映了我在C#中最成功的地方。

以下是我使用的主要原则:

  • 依赖注入 类的构造函数接受依赖项的接口,我们可能希望将这些依赖项模拟为参数。在某些情况下,这意味着编写依赖关系的包装器,例如,boost::filesystem,它主要是在模板化的头中实现的。在我看来,值得付出一点小小的努力,因为更松散地将我们从可能由我们更改或交换的库中分离出来,并且它允许我们使用模拟实现进行单元测试。
  • 试一试吧! 这是不言而喻的,但是在编写类时编写测试可以让您在可测试性方面检查您的设计。我不在乎你先测试,做TDD,或者你叫它什么,我的哲学就是在你开始使用代码库中的类之前,先写你的测试。
  • Google测试作为我们的单元测试框架 到目前为止,我已经使用了Cxxtest (遗留应用程序)和Google。Google在执行时提供了许多灵活的选项来确定您运行的测试集。我们将类命名约定划分为UnitTest_xxxx和IntegrationTest_xxxx。然后,在命令行,我可以告诉gtest只运行一个名称,另一个,或两者兼具的测试。然后,我的构建服务器可以在晚上对整个测试套件执行长时间运行的测试,但是单元测试在每次签入时都会执行。Cxxtest可以做同样的事情,但需要做更多的工作,而且由于许多原因,通常都很笨重。
  • Google在测试时模拟对象 依赖注入的明显好处是在测试期间使用模拟对象。可以简单地编写每个接口的伪实现,但是Google允许快速拆分假对象,并提供您期望的良好.NET模拟框架(如Moq或RhinoMock )的典型检查。
票数 6
EN

Stack Overflow用户

发布于 2012-03-13 03:42:52

我使用过CPP股,它是JUnit的一个端口。它非常容易使用,并以XML格式提供输出,这是很棒的。至于如何使用它,您可以使用看看这里的食谱。

票数 2
EN

Stack Overflow用户

发布于 2013-05-03 15:49:10

在某些情况下,我看到您提到的所有技术(对接口的编码、依赖注入、控制框架的反转和模拟对象)都被滥用,最终使事情变得更加困难。虽然这些技术可以得到很好的利用,但有时我看到它们被宣传,好像它们是通向质量的唯一道路。我不同意。

在我看来,保证C++中代码质量的最重要的开发技术是使用面向对象技术(),如模块化、开放-封闭原则、自文档化、命令-查询分离等。

特别是,我认为必不可少的两种技术是Design (见问题在C++中实现断言检查的最佳方法是什么?C++中的按合同设计?)和UnitueTesting(参见相关问题123.)。对于它们,您在C++中都有合理的工具,如链接的问题所示。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9678035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档