我们有一个用 C 语言编写的大型多平台应用程序(C + + 的数量虽然不多,但仍在不断增加)。这些年来,它已经发展成为一个大型 C/C + + 应用程序所具备的许多特性:
#ifdef
见鬼由于这段代码是针对嵌入式设备的,因此在实际目标上运行它会带来很大的开销。因此,我们希望在本地系统上进行更多快速周期的开发和测试。但是,我们希望避免使用“复制/粘贴到。系统中的 c 文件,修复 bug,复制/粘贴回来”。如果开发人员不辞辛劳地这样做,我们希望以后能够重新创建相同的测试,并以自动化的方式运行。
这就是我们的问题: 为了使代码更加模块化,我们需要它更具有可测试性。但是为了引入自动化的单元测试,我们需要它更加模块化。
一个问题是,由于我们的文件非常大,我们可能有一个函数在一个文件中调用函数 在同一个文件里,我们需要存根,使一个良好的单元测试。当我们的代码变得更加模块化时,这似乎不是什么问题,但是这还有很长的路要走。
我们想做的一件事就是用注释标记“已知可测试”的源代码。然后,我们可以编写一个脚本,扫描可测试代码的源文件,在一个单独的文件中编译它,并将它与单元测试链接起来。当我们修复缺陷并添加更多功能时,我们可以慢慢地引入单元测试。
然而,有人担心维护这个方案(以及所有必需的存根函数)会变得太麻烦,开发人员将停止维护单元测试。因此,另一种方法是使用一种工具,自动为所有代码生成存根,并将该文件与存根链接起来。(我们发现唯一可以做到这一点的工具是一个昂贵的商业产品)但是这种方法在 要求看来,在我们可以开始之前,我们所有的代码都是更模块化的,因为只有外部调用可以被删除。
就个人而言,我宁愿让开发人员考虑他们的外部依赖性,并明智地编写自己的存根。但是,这可能会导致无法消除对一个过度增长的10,000行文件的所有依赖性。可能很难让开发人员相信他们需要维护所有外部依赖项的存根,但这是正确的方法吗?(我听到的另一个观点是,子系统的维护者应该维护他们子系统的存根。但我想知道“强制”开发人员编写自己的存根是否会导致更好的单元测试?)
当然,#ifdefs
为这个问题增加了一个完整的维度。
我们已经研究了几个基于 C/C + + 的单元测试框架,有很多选项看起来都不错。但是我们还没有找到任何东西来缓解从“没有单元测试的毛球代码”到“单元可测试代码”的转变。
所以我想问问其他经历过这些的人:
注意,我们的构建环境是基于 Linux/UNIX 的,因此我们不能使用任何仅适用于 Windows 的工具。