在我的模块中,有像宏这样的功能。这对于模块测试来说不是障碍,但对于包含此模块的其他模块来说却是障碍。
我的问题是:有没有办法让.h文件的一部分只对CMock可见?
例如:
Module_1.h:
#ifdef MODULE_TEST_CMOCK
void FunctionLikeMacro_1(unsigned int x);
unsigned int FunctionLikeMacro_2(void);
#else
#define FunctionLikeMacro_1(x) (HWREGISTER_1 = (unsigned int)x)
#define FunctionLikeMacro_2 ((unsigned int)HWREGISTER_2)
#endif这是我喜欢的方式。但是我应该在哪里定义MODULE_TEST_CMOCK呢?我不能在Project.yml中定义它,因为使用此更改,我的Module_1模块测试将失败。但另一方面,在我的Module_2模块测试中,我不能期望调用FunctionLikeMacro_1和FunctionLikeMacro_2,因为它需要Module_1.h的模拟版本。
谢谢您抽时间见我。:)
发布于 2020-05-11 00:04:25
根据docs/CeedlingPacket.md的说法,您可以向要编译到project.yml中:defines:部分的每个测试文件添加特定的定义
定义:通过配置的工具在测试和发布编译中使用的命令行定义
..。
<test_name>:
添加指定的预处理器定义。例如:
:定义::test_foo_config:- FOO_SPECIFIC_FEATURE
因此,在您的示例中,您必须为所有想要在其中模拟Module_1.h的测试文件添加MODULE_TEST_CMOCK到project.yml中的:defines:部分。
我使用您的示例头文件和两个测试文件进行了尝试:直接包含Module_1.h的test/test_module1.c和包含mock_Module_1.h的test/test_module2.c。我将此添加到我的project.yml中
:defines:
:test_module2:
- MODULE_TEST_CMOCK这似乎运行得很好。我可以使用test/test_module2.c中的FunctionLikeMacro_2_IgnoreAndReturn(),测试行为与预期一致,而宏直接用于test/test_module1.c中的测试。
发布于 2020-05-15 04:01:48
当Ceedling编译和构建您的测试时,它使用定义测试集进行编译,因此您可以编写头文件,以便在编译测试时更改它们的性质。例如,如果您正在做嵌入式工作,并且您通过宏完成所有的寄存器I/O,那么您可以将其转换为用于单元测试的函数,然后只需模拟它们。
// my_reg_io.h
#ifndef TEST // production code
#define WRITE_REG(add, val) *(add) = (val)
#define READ_REG(add) *(add)
#else // test code
// mockable prototypes
void _my_fake_write(void *add, int val);
int _my_fake_read(void *add);
#define WRITE_REG(add, val) _my_fake_write((add), (val))
#define READ_REG(add) _my_fake_read(add)
#endif在读取的情况下,您可以使用stub mock将行为注入到代码中,以测试硬件接口,而不需要硬件。非常有用。
https://stackoverflow.com/questions/60866393
复制相似问题