gpt4 book ai didi

c - 基于不透明结构的 C API 的单元测试

转载 作者:行者123 更新时间:2023-11-30 14:31:09 25 4
gpt4 key购买 nike

我有一个使用基于不透明结构的 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 中),我通常会将数据结构的内存占用量与已知状态进行比较。

在我的示例中,我不知道数组的某些内部状态是否已损坏。

你会如何处理这个问题?我真的很想避免在实现文件中添加仅用于单元测试的代码,我真的很强调模块的松散耦合,并且将单元测试注入(inject)到实现中对我来说似乎相当具有侵入性。

我的第一个想法是将实现文件包含到我的单元测试中,将我的单元测试静态链接到我的库。

例如:

#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);
}

这是个好主意吗?

当然,单元测试不会从封装中受益,但它们的作用是确保它确实有效。

最佳答案

我只会测试 API,并专注于测试每个可能的极端情况。

我可以看到人们对检查内存结构是否符合您的预期感兴趣。如果您这样做,您将把测试与实现的细节紧密耦合,并且我认为创建大量的长期维护。

我的想法是,API 就是契约(Contract),如果您履行了该契约(Contract),那么您的代码就可以工作。如果您稍后更改实现,那么您需要知道的事情之一可能是契约(Contract)得到维护。您的单元测试将验证这一点。

关于c - 基于不透明结构的 C API 的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1965440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com