如何对 BSD 套接字进行单元测试



我正在用 BSD 套接字在 Ubuntu 中编写一个基于服务器/客户端的C++应用程序。我正在使用谷歌C++测试框架作为我的单元测试框架。

想知道有没有办法在我的单元测试中创建服务器和客户端,这样我就可以测试服务器的侦听/接受,并为双方发送/接收。

问题是,如果我要测试服务器的套接字接受(在侦听端口后),我如何在此测试中让一些客户端连接到它?我是否可以使用多线程让客户端连接到在同一TEST()(或TEST_F())范围内进行测试的服务器?

我当然可以编写一个客户端并手动连接到被测服务器,但它违背了自动化单元测试的目的。

我读了一些关于 Google Mock 的东西,它看起来更像是我的健全性检查(查看正在调用哪些函数、调用了多少次、返回了什么等)。

请帮忙,谢谢。

好的,让我们从创建网络套接字的抽象开始。我们需要它来模拟对系统函数的调用。从这样开始:

class Socket {
public:
    virtual bool connect(const struct sockaddr *address, socklen_t address_len) = 0;
    virtual Socket* accept(struct sockaddr *restrict address, socklen_t *restrict address_len) = 0;
    /* more functions */
}

上面的代码并没有抽象很多东西及其与 unix 类的绑定,因为它使用的是 sockaddrsocklen_t 。您还应该为这两种类型创建抽象,以具有独立于平台的代码,但这取决于您的设计。

不需要创建一个具体的TCP/UDP类来在实际应用程序中使用它。

class TCPSocket : public Socket { 
public:
    TCPSocket() {
        socket_ = socket(PF_INET, SOCK_STREAM, 0);
        if (socket_ == -1) {
            /* handle errors */
        } 
    }
    TCPSocket(int sock) : socket_(sock) {}
    bool connect(const struct sockaddr *address, socklen_t address_len) override {
        return connect(socket_, address, address_len) == 0;
    }
    Socket* accept(struct sockaddr *restrict address, socklen_t *restrict address_len) override {
        int s = accept(socket_, address, address_len);
        if (s == -1) {
            /* handle errors */
        }
        return new TCPSocket(s);
    }
private:
    int socket_;
} 

噗嗤:)让我们继续上课。

假设您的类名为 A 并且具有测试method的方法。您的类应该在构造函数中采用Socket*,或者method应该将Socket*作为参数。然后在测试代码中,您可以指定模拟。

class MockSock : public Socket {
public:        
    MOCK_METHOD2(connect, bool(const struct sockaddr*, socklen_t));
    MOCK_METHOD2(accept, Socket*(struct sockaddr*, socklen_t*));
}

然后只需实例化 MockSock 并将其传递给具有正确EXPECT_CALL值的Amethod

最新更新