Skip to content

socket协议的接口测试

Socket 协议的接口测试

简介

在计算机网络中,Socket(套接字)是一种通信机制,它允许不同计算机之间的进程进行数据交换。

应用场景

虽然直接使用 Socket 协议的情况较少,但在某些特定的场景下仍然可以使用它。例如,在一些特定的物联网应用中,可能需要与底层硬件或其他系统进行直接的、定制化的通信。

并且大部分的协议都是基于 Socket 协议进行抽象优化,所以了解 Socket 协议的测试方法,也有助于提升对于多种其他类型协议的测试能力。

实现方案

环境准备

学院提供的在线 echo socket 服务,发送什么信息,则返回什么信息:

  • Host:socket.hogwarts.ceshiren.com
  • Port:30001

Socket 协议的测试方案

Socket 的协议测试和其他类型的接口测试没有太大的区别,都是从客户端向服务端发起请求信息之后,接收到服务端的响应,查看是否符合预期结果。

如果使用代码进行实现,则一共需要以下几步:

  • 创建连接:需要输入 Socket 服务的 host 和端口号。
  • 发送消息:从客户端发送消息给服务端。
  • 接受消息:服务端返回对应的数据信息。
  • 关闭连接:关闭和服务端的数据连接。

使用 Python 实现:

# 导入socket库:
import socket

class SocketReq:
    def send_socket(self, send_data:str):
        # 创建一个socket实例对象:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 建立连接:
        s.connect(('socket.hogwarts.ceshiren.com', 30001))
        # 将 string 的消息转码为二进制
        byte_data = send_data.encode("utf-8")
        # 发送消息
        s.send(byte_data)
        # 接收数据:
        d = s.recv(1024)
        # 关闭连接
        s.close()
        # 将二进制的响应转码为string
        return d.decode("utf-8")

使用 Java 实现:

public class SocketReq {
    public String sendSocket() {
        String hostName = "socket.hogwarts.ceshiren.com";
        int port = 30001;
        String response;
        try {
            // 创建连接
            Socket clientSocket = new Socket(hostName, port);
            // 获取输入流和输出流
            OutputStream outToServer = clientSocket.getOutputStream();
            DataOutputStream out = new DataOutputStream(outToServer);
            InputStream inFromServer = clientSocket.getInputStream();
            DataInputStream in = new DataInputStream(inFromServer);
            // 发送消息
            String message = "Hello, server!";
            out.writeUTF(message);
            System.out.println("发送消息给服务器:" + message);
            // 接收数据
            response = in.readUTF();
            System.out.println("从服务器接收到的消息:" + response);
            // 关闭连接
            clientSocket.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return response;
    }
}

以上是与服务端发送与接受消息的实现过程,但是在接口测试中,还需要对服务端返回的消息进行测试。所以需要接受到返回消息,并对返回的消息完成测试验证,因为演示服务为发送什么信息,则返回什么信息,则预期结果设定为发送的消息即可。

使用 Python 实现:

# 测试用例
def test_send_socket():
    socket_req = SocketReq()
    assert socket_req.send_socket("Hogwarts 测试开发学社") == "Hogwarts 测试开发学社"

使用 Java 实现:

// 测试用例
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class SocketCaseTest {
    @Test
    void sendSocket() {
        SocketCase socketCase = new SocketCase();
        String res = socketCase.sendSocket("Hogwarts 测试开发学社");
        assertEquals("Hogwarts 测试开发学社", res);
    }
}

总结

  • Socket 协议的测试方案