【发布时间】:2021-03-15 02:09:09
【问题描述】:
我正在开发一个 API,它使用 C 调用约定函数来包装 C++ 行为。 API 由可用于多种语言的共享库 (dll) 的集合组成。在 C++ 类对象通过 dll 边界的情况下,使用 C 不透明指针或“句柄”来引用底层 C++ 对象,类似于 Win32 API。这种包装函数的示例头文件原型是
extern "C" { __declspec(dllexport) int __cdecl MyObjConfig(MyObj_t* handle); }
许多 API 函数/类与硬件外围设备接口。在许多情况下,能够在有代表性的硬件系统上进行测试是不切实际的。我想找到一种模拟较低级别组件的方法,以便可以在模拟环境中测试使用这些库的高级库或可执行文件。但是,我不愿意在底层源代码中包含短语,例如
if(is_test) { return 0; }
例如,我想模拟一个函数float GetSensorData() 的行为,这样我就可以通过返回对传感器正常数据的合理模仿来测试链接到 GetSensorData 的父 dll 并调用获取传感器数据的可执行文件,而无需明确设置传感器。此外,除了确保它链接到 GetSensorData 的 dll 仿制品之外,我还想避免更改可执行文件的源代码。
我对创建 dll 模拟的自动化框架感兴趣的一个关键部分是我不想维护每个库的两个单独版本:一个测试版本和一个实际版本。相反,我想处理实际并以编程方式生成“模拟”编译。
谁能提出一个好的方法来做到这一点?我看过 Gtest 和 CMock / Unity。两者似乎都适合自己测试 dll,但似乎没有很好的能力来容纳
extern "C" { __declspec(dllexport) int __cdecl
函数原型声明。
谢谢!
【问题讨论】:
标签: c++ c unit-testing mocking embedded