在C++中设计可测试性

Ryu*_*Ryu 7 c# c++ testing unit-testing

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

我习惯于编码接口,依赖注入,控制框架的反转和模拟对象.由于C#有很多不同的语言特性,我不确定有多少模式仍然适用.我还想象C++的独特功能/限制可能会带来不同的测试策略.

我看过单元测试框架,我喜欢Google Test,但是编写我的新代码以尽可能测试它也很重要.

  • 是否有任何开源项目可以推荐为C++测试正确吗?
  • 是否有更详细地涉及此主题的书籍或文章?
  • 其他框架/库的建议

谢谢

Eva*_*van 5

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

我想共享的背景给我们留下了未来的常见问题。我很惊讶遗留应用程序中我们的类的依赖关系是多么紧密。

正如您似乎已经强调的那样,令人担忧的是,C# 中的最佳实践可能并不是 C++ 中的最佳方式。经过大量研究、我自己的一些 Stack Overflow 问题以及一些原型设计,我最终得到了一个 C++ 架构,它在很多方面反映了我认为在 C# 中效果最好的架构。

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

  • 依赖注入

    我们类的构造函数采用我们可能想要模拟的依赖项接口作为参数。在某些情况下,这意味着为依赖项编写包装器,例如 boost::filesystem,它主要在模板化头文件中实现。在我看来,值得付出小小的努力,因为它更松散地将我们与可能改变或由我们交换的库结合在一起,它允许我们使用模拟实现进行单元测试。

  • 边走边测试!

    这应该是不言而喻的,但是在编写类时编写测试可以让您在可测试性方面检查设计的完整性。我不在乎你先测试,做 TDD,或者不管你怎么称呼它,我的理念是在你开始使用你的代码库中的类之前编写你的测试。

  • Google Test 作为我们的单元测试框架

    到目前为止,我已经使用了 Cxxtest(遗留应用程序)和 Google Test。Google Test 在执行时提供了许多灵活的选项来确定您运行的测试集。我们将类命名约定拆分为 UnitTest_xxxx 和 IntegrationTest_xxxx。然后在命令行中,我可以告诉 gtest 只使用一个名称、另一个名称或两个名称运行测试。然后我的构建服务器可以在晚上对整个测试套件执行长时间运行的测试,但在每次签入时进行单元测试。 Cxxtest 可以做同样的事情,但需要做更多的工作,并且由于很多原因通常很笨重。

  • 测试时模拟对象的 Google Mock

    依赖注入的明显好处是在测试期间使用模拟对象。可以简单地编写每个接口的假实现,但 Google Mock 允许快速启动假对象,并提供典型的检查,您可以从一个好的 .NET 模拟框架(如 Moq 或 RhinoMock)中获得。


小智 2

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