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))
}
}
这些测试示例覆盖了正常消息处理、错误处理和连接管理的基本场景。

