Golang测试WebSocket连接的实现方法

Golang测试WebSocket连接的实现方法 我正在尝试为我的Go语言聊天API编写测试,但我对Go语言测试还比较陌生。我找不到关于如何测试更复杂函数的合适示例。例如,我有一个函数,它将特定WebSocket的消息发送到广播频道,但我无法想象如何测试它。有人能帮助我吗?以下是该函数:

func sendMessages(ws *websocket.Conn){
for {
	var msg Message
	// Read in a new message as JSON and map it to a Message object
	err := ws.ReadJSON(&msg)
	if err != nil {
		log.Printf("error: %v", err)
		delete(clients, ws)
		break
	}
	// Send the newly received message to the broadcast channel
	broadcast <- msg
	saveMessage(msg)
}

更多关于Golang测试WebSocket连接的实现方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang测试WebSocket连接的实现方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


对于测试WebSocket连接,可以使用gorilla/websocket包的测试工具。以下是一个完整的测试示例:

import (
    "net/http"
    "net/http/httptest"
    "testing"
    "github.com/gorilla/websocket"
    "github.com/stretchr/testify/assert"
)

func TestSendMessages(t *testing.T) {
    // 创建测试服务器
    server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        upgrader := websocket.Upgrader{}
        conn, err := upgrader.Upgrade(w, r, nil)
        if err != nil {
            t.Fatal(err)
        }
        defer conn.Close()
        
        // 调用被测试的函数
        sendMessages(conn)
    }))
    defer server.Close()
    
    // 将HTTP地址转换为WebSocket地址
    wsURL := "ws" + server.URL[4:]
    
    // 创建客户端连接
    conn, _, err := websocket.DefaultDialer.Dial(wsURL, nil)
    if err != nil {
        t.Fatal(err)
    }
    defer conn.Close()
    
    // 测试发送消息
    testMsg := Message{
        Content: "test message",
        User:    "test_user",
    }
    
    // 发送消息到服务器
    err = conn.WriteJSON(testMsg)
    if err != nil {
        t.Fatal(err)
    }
    
    // 验证消息是否被广播
    select {
    case msg := <-broadcast:
        assert.Equal(t, testMsg, msg)
    default:
        t.Error("消息未发送到广播频道")
    }
}

对于更复杂的测试场景,可以模拟WebSocket连接:

func TestSendMessagesWithMock(t *testing.T) {
    // 创建模拟连接
    mockConn := &MockConn{
        ReadMessageFunc: func() (int, []byte, error) {
            msg := Message{Content: "test", User: "user"}
            data, _ := json.Marshal(msg)
            return websocket.TextMessage, data, nil
        },
        CloseFunc: func() error {
            return nil
        },
    }
    
    // 重置广播通道
    broadcast = make(chan Message, 1)
    
    // 运行函数
    go sendMessages(mockConn)
    
    // 验证结果
    select {
    case msg := <-broadcast:
        if msg.Content != "test" {
            t.Errorf("期望内容为'test',实际为'%s'", msg.Content)
        }
    case <-time.After(1 * time.Second):
        t.Error("超时:未收到广播消息")
    }
}

如果需要测试错误处理:

func TestSendMessagesErrorHandling(t *testing.T) {
    mockConn := &MockConn{
        ReadMessageFunc: func() (int, []byte, error) {
            return 0, nil, websocket.ErrCloseSent
        },
    }
    
    // 记录初始客户端数量
    initialCount := len(clients)
    
    // 运行函数
    sendMessages(mockConn)
    
    // 验证客户端是否被删除
    if len(clients) != initialCount-1 {
        t.Errorf("期望客户端数量减少1,实际变化:%d -> %d", 
            initialCount, len(clients))
    }
}

这些测试示例覆盖了正常消息处理、错误处理和连接管理的基本场景。

回到顶部