c - 带有编译器特定关键字的单元测试 C

标签 c unit-testing unity-test-framework

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

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

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

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

我原以为我可以通过让 Ceedling 生成一个模拟来阻止添加这些 BSP 头文件,方法是将 #include "mock_a.h" 添加到我的测试文件中,但是 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;

最佳答案

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

以我原帖中的例子为例

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

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

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

然后在测试文件中添加一个像#include "mock_foo.h"这样的包含。

关于c - 带有编译器特定关键字的单元测试 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41695992/

相关文章:

c - C中的逻辑数组

C语言——Malloc无限空间?

c - 使用 free 理解 malloc 和指针递增

visual-studio - 是否存在为 .NET 类预编写单元测试的工具?

c - 如何手动指定 Ceedling 无法获取的源文件?

c - 编译 C 库时的警告

c# - 你是如何扩展你的断言类的

unit-testing - Kotlin 中的测试无法访问 protected 方法

ruby - 如何以普通用户身份运行 bundle install