具有编译器特定关键字的单元测试C.

时间:2017-01-17 11:30:10

标签: c unit-testing unity-test-framework

我正在编写一些嵌入式C的单元测试,它在主机上运行(尚未在目标上进行测试)并使用GCC进行编译。我一直在使用Ceedling构建系统和Unity测试框架进行测试。

我想测试的一个文件包括一个文件(比如啊),其中包含另一个文件(比如cpu.h),它是嵌入式设备供应商提供的板级支持包的一部分,并使用特定于目标编译器(例如__cregister,例如extern __cregister volatile unsigned int IER;

另一个问题,再次使用BSP中包含的此类文件,是内联汇编asm()部分,例如#define FOO_ASM asm("FOO")

当构建测试时,这两者都会引发错误,因为GCC无法识别这些关键字。

我曾经以为我可以通过将Ceedling生成模拟器来添加{I}来添加#include "mock_a.h"来阻止这些BSP标头添加到我的测试文件中,但是GCC仍然编译a.h,因此b.h。

有解决此类问题的最佳做法吗?

我可以在有问题的BSP文件中添加类似下面的内容,但我不愿意改变供应商代码,这些代码会在新版本发布时更改或覆盖我的更改,我宁愿了解如何正确隔离单元。< / p>

// Unknown how __cregister is initially defined
#ifdef TEST
    #undef __cregister // Redefine __cregister to nothing
    #define __cregister
#endif

extern __cregister volatile unsigned int IER;

1 个答案:

答案 0 :(得分:1)

最后,我在OP的评论中遵循了link中概述的方法。

所以我原来的帖子中的例子

/* foo.h */
extern __cregister volatile unsigned int IER;
#define FOO_BAR_ASM asm("BAR");

我在test/support/目录中创建了具有相同名称的以下文件,并从测试构建设置中删除了真实BSP文件的包含路径:

/*foo.h - in test/support */
extern volatile unsigned int IER;
#define FOO_BAR_ASM

然后在测试文件中添加了类似#include "mock_foo.h"的包含。