如何为网络客户端编写单元测试?

pet*_*555 8 c++ unit-testing googletest gmock c++11

我需要编写简单的http客户端.为我的班级进行单元测试可能会很棒.但我不知道如何写出适当且可测试的课程.

例如,我有一个像这样的客户端:

class HTTPClient
{
public:
     HTTPCLient(const std::string& host, const std::string& port): session(host, port) {}

     void send()
     {
         session.sendRequest(someRequest);
         Response response = session.receiveResponse();
         // ...
     }

private:
    SomeLibrary::ClientSession session;
};
Run Code Online (Sandbox Code Playgroud)

如何测试send方法(我真的发送我想要的东西)?我无法嘲笑它.我可以 在构造函数中编写HTTPClient接收SomeLibrary::ClientSession对象(在测试中我会传递模拟)但它是好的设计吗?我认为会话等的实现方式应该隐藏在我的课堂中.

你有什么主意吗?

Sam*_*hik 5

我很高兴前几天写了一个HTTP客户端库.

为了测试HTTP客户端库,我只编写了简单的测试代码,开始std::thread监听一些随机端口localhost.然后我告诉客户端使用hostport参数进行测试请求,就像你的情况一样,指向我的线程正在监听的端口.线程的代码被编程为接受连接,读取HTTP请求,保存它,然后使用预设的HTTP响应进行响应.

这就是我测试我的客户端库,验证客户端发送的实际请求以及客户端如何处理预设HTTP响应的方法.后来,我开发了这个单元测试代码来发送各种HTTP错误和格式错误的HTTP响应,以便测试和验证客户端代码如何处理这些情况.

并且,为了一个好的衡量标准,整个事情都被一个alarm()电话所保护,所以如果某些事情陷入无限循环,那么整个过程最终会自杀.

这就是你如何以同样的方式测试自己的代码.