如何将CMock / Unity与Automake集成?

时间:2014-09-26 20:09:52

标签: c unit-testing autotools automake cmock

这是我第一次在这里提问,所以如果我能改进我的问题,请告诉我。

我正在寻找有关如何干净地构建单元测试的指导,这些单元测试需要使用CMock生成的源文件的模拟版本替换源文件。这是必需的,因为CMock要求使用模拟的单元测试代码与模拟源而不是原始源链接。

例如,如果我测试的函数test_me()在测试源文件test.c中调用foo(),那么在模拟foo()时我将编译test_test_me: test_me.c, Mockfoo.c, and test.c.

test_me()通常编译为test_me: test_me.c and foo.c

Mockfoo.c是使用CMock使用foo.h提供的Ruby脚本生成的。

如您所见,foo.c必须替换为Mockfoo.c才能创建测试程序test_test_me。需要Mockfoo.c,因此test_test_me可以链接到foo的模拟调用,而不是原始的foo调用。当依赖项数量增加时,更换源代码变得困难。

例如,如果test_me使用库libfoo.a中的foo,bar和baz,它由foo.o,bar.o和baz.o组成,我想模拟对foo的调用,那么我需要使用编译单元Mockfoo.o,bar.o和baz.o构建libfoo.a,然后链接到使用模拟foo调用的test.o。当你有模拟的排列(例如Mockfoo,Mockbar,但不是baz)和具有不同自动规则,标志等的大型源代码树时,这会变得更加复杂。

此外,添加模拟必须简单,因为我们的单元测试通常需要模拟。

某些背景信息:

我感兴趣的是在重构代码或将新代码添加到我刚刚加入的大型C项目的情况下,使用CMock/Unity添加单元测试。

该项目目前使用Automake作为其构建工具,它将继续存在。

我是Automake的新手。我熟悉SCons和CMock。

1 个答案:

答案 0 :(得分:1)

这个问题已经发布了很久以前。我将为面临类似问题的任何人发布我的解决方案。

与CMock / Unity接口最可靠的方法是使用rake,基于Ruby的构建工具。可以从Makefile.am调用rake。可以创建目标来为指定的每个虚假目标调用rake来构建单元测试。

在我的特定情况下,由于构建环境的限制,我无法使用rake。相反,我选择使用具有CMock / Unity功能的cmocka,并且很容易与automake集成。