C++ 使用C/C+进行单元测试+;:教训,记住什么?

C++ 使用C/C+进行单元测试+;:教训,记住什么?,c++,unit-testing,tdd,C++,Unit Testing,Tdd,使用C/C++进行单元测试: 你教那些以前没有做过单元测试或者来自Java/Junit的人什么 从您的角度来看,要记住/练习的最重要的一课/事情是什么,可以节省大量的时间或压力(特别是关于C/C++) 单元测试必须在每次签入时自动运行(或者,编写然后忘记的单元测试不是单元测试) 在修复bug之前,编写一个单元测试来公开它(它应该失败)。然后修复错误,并在测试变为绿色时感到高兴 为了更简单的测试,牺牲一点类的“美”是可以的(比如提供不应该真正公开的公共方法,但有助于测试/模拟) 读这个。。。无论如

使用C/C++进行单元测试: 你教那些以前没有做过单元测试或者来自Java/Junit的人什么

从您的角度来看,要记住/练习的最重要的一课/事情是什么,可以节省大量的时间或压力(特别是关于C/C++)

  • 单元测试必须在每次签入时自动运行(或者,编写然后忘记的单元测试不是单元测试)
  • 在修复bug之前,编写一个单元测试来公开它(它应该失败)。然后修复错误,并在测试变为绿色时感到高兴
  • 为了更简单的测试,牺牲一点类的“美”是可以的(比如提供不应该真正公开的公共方法,但有助于测试/模拟)

  • 读这个。。。无论如何,你会的。。

    我想重新表述ripper234,并添加更多规则:

  • 每个模块(通常是DLL项目)都应该有单独的UT项目。所有UT类都应该是访问私有方法/成员所需的所有DLL类的朋友
  • 如果要更改模块,请先更改UT。在签入之前,确保DLL及其UT编译、链接和UT运行时没有崩溃和故障。在每次签入之前,不需要对所有模块运行所有UT-这是浪费时间
  • 所有UT应在夜间构建中与所有DLL一起自动重建。所有UT和模块应在构建期间编译和链接
  • 所有UT应在夜间构建成功后自动运行,并对结果进行总结
  • 所有UT结果的摘要应发布给开发人员,如果有任何故障或崩溃,应尽快纠正

  • 最重要的一课:测试总比不测试好。

    一个单元测试用例应该只测试一件事

    与C#和Java相比,我在C/C++中更经常看到单元测试用例测试整个工作流


    可能是因为大多数C/C++xUnit框架需要几个步骤来注册一个测试用例,所以在添加新特性时只向现有测试用例添加几行代码的诱惑更大。

    如果处理没有测试的遗留代码库,您很可能会开始(正如我不得不做的那样)使用单元测试框架进行实现的功能测试。不要惊慌——您的代码是如此相互关联,以至于可能不可能编写正确的单元测试。也不要自满——一旦功能测试到位,您需要重构,以便真正的单元测试成为可能。你的代码会更好

    我反对所有这些自动授予测试类友谊的建议

    就我个人而言,我更喜欢关注以下内容,以便访问需要测试的类的内部:

  • 依赖于 在可能的情况下分类;有时,这意味着稍微扩展公共接口,以便于测试。不要过多地反对这些扩展,但也不要让它们太多地推动您的设计
  • 考虑添加一个监视界面 也可以由“真实”代码使用 作为测试代码,以启用对 正在测试的代码。(我仍然惊讶于这是设计过程中非常好的一部分)
  • 考虑通过“受保护接口”向派生类提供对类的某些部分的访问,并派生相关类的“可测试”版本,然后对其进行检测和测试
    总之,我更喜欢在测试点中看到设计,而不是与测试类建立全面的友谊。当然,前者比后者更难做到,但是,IMHO会产生更好的代码和更好的测试

    我不同意1。所有UT都应该在夜间构建期间自动运行,因为它们通常需要很多时间。在每次签入之前,您应该只为您的模块运行UT。这也是错误的——交UT类的朋友,他们会看到所有的东西(如运行时间超过1/10秒,则UT根据定义不是UT)。因此,在每次提交时自动运行它是可以的。我也不同意3。您可以在不牺牲其设计的情况下检查类的内部,例如,在测试的类中声明一个仅存在于UT中的friend observer类。当然,除非测试被破坏,否则在这种情况下,您将在错误的前提下发送。事实上,我认为一个类的一个测试比100个测试更重要。第一个测试总是最难的,特别是对于遗留代码,因为它迫使您打破类周围的依赖关系,以便您可以首先对其进行测试。我同意,但是,我也喜欢看到“单元测试”将测试对象A插入到对象B中,等等,我知道这些测试更多的是“集成测试”,但它们也非常有用。没有人禁止你进行集成测试。你不应该叫它们单元测试,甚至不应该叫“单元测试”。将它们称为集成测试,不要将它们与单元测试混合使用。@Len-好的观点。我通常非常努力地避免仅仅为了测试而使用公共方法。当测试某些代码变得困难时,您的测试会告诉您您的设计有问题。你真的,真的想要更好的设计。花点时间,事情就会变得简单。听听你的代码,闻一闻你的代码——友谊只是为了测试!