将单元测试添加到旧的普通C项目中


12

标题说明了一切。我公司正在将微控制器设备的旧固件项目重复使用,完全用纯C语言编写。

有些部分显然是错误的,需要更改,并且这些部分来自C#/ TDD背景,我不喜欢无测试地随机重构内容以确保功能保持不变的想法。此外,我已经看到,在很多情况下,通过微小的更改就引入了难以发现的错误(如果使用回归测试,我相信这是可以解决的)。为避免这些错误,需要格外小心:很难在代码周围跟踪大量的全局变量。

总结一下:

  • 在重构之前,如何在现有的紧密耦合代码中添加单元测试?
  • 您推荐什么工具?(重要性不高,但仍然很高兴知道)

我没有直接参与编写此代码(我的责任是一个可以通过多种方式与设备交互的应用程序),但是如果有可能使用它们时,如果抛弃了良好的编程原则,那将是很糟糕的。

Answers:


7

索取一份迈克尔·费瑟斯(Michael Feathers)的著作《有效处理旧版代码》。它旨在处理此类情况。即使它更侧重于C ++和Java之类的面向对象语言,我相信它仍然可能对您有很大帮助。

看起来它的一部分(或早期草案)甚至可以在这里免费获得。


+1,谢谢。但是,我相信我在用更多的OO代码重构OO代码方面相当擅长。我不知道如何测试过程代码,以及如何使用较少耦合的过程代码重构过程代码。
Groo

@Groo,这本书本身并不是关于重构的。它是关于如何将没有任何单元测试的一堆意大利面条代码转换为一堆很好地被单元测试覆盖的(有些意大利面条)代码。这样的代码很难测试,因此您需要首先进行重构以使其可测试。但是,正如您也提到的那样,在没有单元测试的情况下进行重构是有风险的,因此这是一个难题22 这本书指导您如何对代码进行最小,最安全的更改,从而使您可以使用单元测试来覆盖它,从而随后开始对其进行认真的重构。
彼得Török

那本书是一个很好的建议,它涵盖了C和OO语言。
ThomasW 2012年

7

对于技术,可能是迈克尔羽毛预定彼得Török的回答将是非常全面的。如果您不想看这本书,我建议分三个步骤:

  1. 检查不可测试的代码,并将该代码功能的一小部分复制到可测试的功能中。重要的是,新函数的行为显然应与您要复制的函数等效-我并不是在提倡围绕遗留代码编写单元测试,因此您需要非常小心,并限制范围。为了保持对重构的信心。
  2. 围绕这些新功能编写单元测试。
  3. 修改原始代码以调用新功能。

重复此过程几次,您应该发现旧代码库的质量已大大提高。

就工具而言,请注意C ++可以调用C,因此任何C ++单元测试框架都可以用来测试C代码。例如,我们使用CPPUnit对项目中的一堆C代码进行单元测试。


+1感谢您的提示和CPPUnit链接。
Groo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.