【发布时间】:2011-04-25 14:54:33
【问题描述】:
我正在编写一个 C++ 类来包装套接字(我知道有很好的库可以用来做这件事——我正在自己动手练习):
class Socket {
public:
int init(void); // calls socket(2)
// other stuff we don't care about for the sake of this code sample
};
这个类又被其他几个人使用,我知道我可以通过子类化和模拟对googlemock 进行单元测试。
但是我想开发这个类test first,目前有点卡住了。我不能在 C 标准库(即socket.h,在这种情况下)上使用 googlemock,因为它不是 C++ 类。我可以围绕我需要的 C 标准库函数创建一个精简的 C++ 包装类,例如
class LibcWrapper {
public:
static int socket(int domain, int type, int protocol);
static int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
static int listen(int sockfd, int backlog);
static int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
static ssize_t write(int fd, const void *buf, size_t count);
static int close(int fd);
};
现在我可以模拟它并对我的Socket 类进行单元测试(现在可能需要将其重命名为Network 或类似名称)。 LibcWrapper 也可以用于其他类,并且它本身不需要进行单元测试,因为它只是提供了一堆类方法。
这对我来说开始听起来不错。我是否已经回答了自己的问题,或者是否存在用于测试驱动这种 C++ 开发的标准模式?
【问题讨论】:
-
googlemock cookbook 在你的情况下建议类似的东西。
-
@Beduin:回答这个问题,我会投赞成票。 :)
-
我最近发现,使用集成 (?) 测试来验证此类类通常更有意义且更节省时间。例如,您可以通过分叉一个进程轻松验证您的包装器是否处理连接重置,该进程 1) 将原始套接字连接到包装器,在主进程中运行,然后 2) 立即发生段错误,导致连接重置。
-
@Andres:我确实有一个功能测试来验证使用我的套接字的代码,但我在这里要测试的是代码单元(即
Network::init())是否调用socket()、Network::listen()调用bind()和listen()等等,所以我认为除了功能测试之外还需要单元测试。 -
@Josh Glover 在这种情况下,我同意 100%。 :)
标签: c++ unit-testing