C单元测试:存根fread / fwrite功能

时间:2011-12-18 11:01:01

标签: c unit-testing stub

我开始在C中编写一个小程序作为开发练习,我想对这个程序进行大量的单元测试。问题是它不时使用fread / fwrite和其他标准函数 - 我不希望我的单元测试打开任何文件,所以如果我可以为fread / fwrite编写存根,那就太好了。

任何人都有解决此问题的方法吗?

提前感谢您的回答!

编辑:我忘记了一件重要的事情:读取存根需要在不同的测试中表现不同。在一个中,读取返回值必须是<然后传递了多个要读取的元素(模拟过早的eof)并且在其他读取的返回值中必须等于传递的元素数量才能读取

3 个答案:

答案 0 :(得分:1)

我可以推荐Working Effectively with Legacy Code本书,因为它在很多章节中都涉及到这一点。我在类似的情况下自己使用过它。

对于过程语言中的单元测试有两个建议(除了转换为面向对象的语言):

  • 使用“链接缝”。使用API​​调用周围的包装函数,并使用不同的目标文件进行编译,具体取决于您是在编译测试还是可交付成果。测试版本将在包装函数内部调用,而版本代码的版本会将调用传递给fread,fwrite等。
  • 使用“预处理接缝”,您可以使用#ifdefs通过在特定于测试的#ifdef下定义本地版本或使用稍微更易维护的包装函数选项来更改fread / fwrite / etc的行为(再次)根据是否定义了特定于测试的#ifdef来改变行为。

答案 1 :(得分:0)

如果我正确理解了这个问题,最简单的方法是使用宏(跳过讨论它的邪恶):

#ifdef UNIT_TESTS
    #define fwrite(ptr, size, nmemb, stream) (nmemb)
#endif

同样适用于fread。现在,您可以使用编译器标志在使用单元测试进行编译时指定宏UNIT_TESTS(例如gcc的gcc -DUNIT_TESTS ...)。

答案 2 :(得分:0)

我也会使用宏。

使用以下命令创建文件:

#define fopen FOPEN
#define fread FREAD
#define fwrite FWRITE

然后将其添加为强制包含,以便在所有其他包含之前进入。

然后,您可以在存根代码中实现FOPEN以执行任何操作。