带有编译器特定关键字的单元测试 C
Unit test C with compiler specific keywords
我正在为一些嵌入式 C 编写单元测试,运行 在主机上(尚未在目标上测试)并使用 GCC 编译。我一直在使用Ceedling构建系统配合Unity测试框架进行测试
我想测试的文件之一包括一个文件(比如 a.h),该文件包含另一个文件(比如 cpu.h),该文件是嵌入式设备的板级支持包的一部分供应商,并使用特定于目标编译器的关键字(例如 __cregister
,例如 extern __cregister volatile unsigned int IER;
.
BSP 中包含此类文件的另一个问题是内联汇编 asm()
部分,例如 #define FOO_ASM asm("FOO")
.
这两者在构建测试时当然会引发错误,因为 GCC 无法识别这些关键字。
我原以为我可以通过让 Ceedling 生成一个模拟,通过将 #include "mock_a.h"
添加到我的测试文件来阻止这些 BSP headers 被添加进来,但是 GCC 仍然编译 a.h , 因此 b.h.
是否有解决此类问题的最佳实践方法?
我可以在有问题的 BSP 文件中添加类似下面的内容,但我不愿意更改供应商代码,因为新版本发布会更改或覆盖我的更改,我宁愿了解如何正确隔离该单元.
// Unknown how __cregister is initially defined
#ifdef TEST
#undef __cregister // Redefine __cregister to nothing
#define __cregister
#endif
extern __cregister volatile unsigned int IER;
最后我按照我对 OP 的评论中 link 中概述的方法进行了操作。
所以对于我原来的例子 post
/* 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"
这样的包含。
我正在为一些嵌入式 C 编写单元测试,运行 在主机上(尚未在目标上测试)并使用 GCC 编译。我一直在使用Ceedling构建系统配合Unity测试框架进行测试
我想测试的文件之一包括一个文件(比如 a.h),该文件包含另一个文件(比如 cpu.h),该文件是嵌入式设备的板级支持包的一部分供应商,并使用特定于目标编译器的关键字(例如 __cregister
,例如 extern __cregister volatile unsigned int IER;
.
BSP 中包含此类文件的另一个问题是内联汇编 asm()
部分,例如 #define FOO_ASM asm("FOO")
.
这两者在构建测试时当然会引发错误,因为 GCC 无法识别这些关键字。
我原以为我可以通过让 Ceedling 生成一个模拟,通过将 #include "mock_a.h"
添加到我的测试文件来阻止这些 BSP headers 被添加进来,但是 GCC 仍然编译 a.h , 因此 b.h.
是否有解决此类问题的最佳实践方法?
我可以在有问题的 BSP 文件中添加类似下面的内容,但我不愿意更改供应商代码,因为新版本发布会更改或覆盖我的更改,我宁愿了解如何正确隔离该单元.
// Unknown how __cregister is initially defined
#ifdef TEST
#undef __cregister // Redefine __cregister to nothing
#define __cregister
#endif
extern __cregister volatile unsigned int IER;
最后我按照我对 OP 的评论中 link 中概述的方法进行了操作。
所以对于我原来的例子 post
/* 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"
这样的包含。