我有一个基于不透明结构的 API 编写的库。使用不透明结构有很多好处,我对此非常满意。
现在我的 API 在规范方面已经稳定了,我想写一个完整的单元测试电池,以确保在发布之前有一个坚实的基础。
我的担心很简单,你如何基于主要目标是隐藏内部逻辑的不透明结构对 API 进行单元测试?
例如,让我们以一个非常简单的对象,一个带有非常简单测试的数组为例:
WSArray a = WSArrayCreate();
int foo = 5;
WSArrayAppendValue(a, &foo);
int *bar = WSArrayGetValueAtIndex(a, 0);
if(&foo != bar)
printf("Eroneous value returned\n");
else
printf("Good value returned\n");
WSRelease(a);
当然,这会测试一些事实,比如数组实际上是用 1 个值执行的,但是当我编写单元测试时,至少在 C 中,我通常会将我的数据结构的内存占用与已知状态进行比较。
在我的示例中,我不知道数组的某些内部状态是否损坏。
你会怎么处理?我真的很想避免在实现文件中添加仅用于单元测试的代码,我非常强调模块的松散耦合,并且将单元测试注入实现对我来说似乎相当有侵略性。
我的第一个想法是将实现文件包含到我的单元测试中,将我的单元测试静态链接到我的库。
例如:
#include <WS/WS.h>
#include <WS/Collection/Array.c>
static void TestArray(void)
{
WSArray a = WSArrayCreate();
/* Structure members are available because we included Array.c */
printf("%d\n", a->count);
}
这是一个好主意吗?
当然,单元测试不会从封装中受益,但它们在这里是为了确保它实际工作。