當前位置:首頁 » 網頁前端 » 2021web單元測試答案
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

2021web單元測試答案

發布時間: 2023-03-08 07:52:13

㈠ Go: WebSockets單元測試

WebSockets通過TCP連接提供客戶端與伺服器之間的雙向即時通信。這意味著,我們可以維護一個TCP連接,然後發送和監聽該連接上的消息,而不是不斷地通過新建TCP連接去輪詢web伺服器的更新。

在Go的生態中,WebSocket協議有幾個不同的實現。有些庫是協議的純實現。另外一些人則選擇在WebSocket協議的基礎上構建,為他們特定的用例創建更好的抽象。
下面是一個不全面的Go WebSocket協議實現列表:

在線拍賣是以實時通信為核心的行業之一。在一場拍賣中,幾秒鍾的時間就決定了你是贏了還是失去了一件你一直想要的收藏品。

讓我們以gorilla/websocket庫實現的簡單拍賣應用程序作為本文的示例。
首先,我們將定義兩個非常簡單的結構體Bid和Auction,我們將在WebSocket處理程序中使用它們。 Auction 有一個Bid方法,我們將使用該方法接收客戶端發送來的競價請求。

這兩種類型都相當簡單,包含的欄位非常少。NewAuction構造函數構建一個帶有持續時間、itemID和*Bids的Aution實例。

我們將通過 Bid 方法來實現拍賣的競標動作:

Auction的Bid方法就是物品競拍發生的地方。它接收一個 amount 和 userID 作為參數,並向 Auction 對象中添加Bid實例。而且它會檢查競拍是否結束以及的競拍價格是否大於已有的最大競價。如果這些條件中的任何一個不滿足,它將向調用者返回適當的錯誤。

有了結構體定義和Bid方法,讓我們深入到WebSockets機制。

想像一下,一個可以在拍賣中實時出價的網站。它通過WebSockets發送的每一條JSON消息都會包含用戶的標識符( UserID )和出價的金額( amount )。一旦伺服器接受了消息,它將參與競價並向客戶端返回一個競拍結果。

在伺服器端,此通信將由 net/http 處理程序完成。它將處理所有WebSocket的業務邏輯,有幾個值得注意的步驟:
1、將接收到的HTTP連接升級為WebSocket連接。
2、接收來自客戶端的消息。
3、從消息中解碼出bid對象。
4、參與競價。
5、 向客戶端發送競拍結果。
下面我們來實現這個處理程序。首先定義 inbound 和 outbound 消息類型,用於接收和發送客戶端消息。

它們都分別表示入站/出站消息,這就是在客戶端和伺服器之間的交互數據。 inbound 入站消息將表示一個出價,而 outbound 類型表示一個簡單的返回消息,其Body中包含一些文本。

接下來定義 bidsHandler ,包含ServeHTTP方法實現HTTP連接的升級:

首先定義 websocket.Upgrader ,接收處理程序的 http.ResponseWriter 和 *http.Resquest 並升級連接。 因為這只是一個應用程序示例 upgrader.CheckOrigin 方法將只返回true,而不檢查傳入請求的來源。一旦 upgrader 完成連接的升級,將返回 *websocket.Conn 對象保存在 ws 變數中。 *websocket.Conn 將接收所有客戶端發送來的消息,也是處理程序讀取請求內容的地方。同樣,處理程序將會向 *websocket.Conn 寫入消息,它將向客戶端發送響應消息。

for 循環做了幾件事:首先,使用 ws.ReadMessage() 讀取websocket消息,改函數返回消息類型(二進制或文本)和消息內容( m )以及可能發生的錯誤( err )。然後,檢查客戶端是否意外地關閉了連接。

錯誤處理完成並讀取到消息,我們將使用 json.Unmarshal 對其進行解碼。接著調Bid方法參與競拍。然後使用 json.Marshal 對返回內容進行序列化,使用 ws.WriteMessage 方法發送給客戶端。

盡管編寫WebSocket處理程序比普通HTTP處理程序要復雜得多,但測試它們很簡單。事實上,測試WebSockets處理程序就像測試HTTP處理程序一樣簡單。這是因為WebSockets是在HTTP上構建的,所以測試WebSockets使用的工具與測試HTTP伺服器相同。

首先添加測試用例:

首先,我們從定義測試用例開始。每個用例有一個 name ,這是測試用例的可讀名稱。此外,每個測試用例都有一個 bids 切片和一個ration持續時間,用於創建一個測試拍賣對象 Auction 。測試用例還有一個入站消息 inbound 和一個出站回復 outbound —這是測試用例將發送給處理程序並期望從處理程序返回的消息。

在TestBidsHandler中我們添加三種不同的測試用例——一個是客戶端發起了錯誤的報價,低於目前最大報價,另一個測試用例,客戶端添加了一個正常的報價,第三個客戶端參與的拍賣已結束。
下面完成測試函數:

我們在subtest函數體中添加了一些新函數。 newWSServe r將創建一個測試伺服器並將其升級為WebSocket連接,同時返回伺服器和WebSocket連接。然後, sendMessage 函數將通過WebSocket連接將消息從測試用例發送到測試伺服器。之後,通過 receiveWSMessage ,我們將從伺服器讀取響應,並通過將其與測試用例的進行比較來斷言其正確性。

那麼,這些新的函數的作用是什麼呢?讓我們逐一分析。

newWSServer 函數使用 httptest.NewServer 函數將處理程序掛載到測試HTTP伺服器上。通過 httpToWS ,實現了將伺服器的 URL 轉為websocket URL (它只是將URL中的 http 協議替換為 ws ,或將 https 替換為 wss 協議)。

為了建立WebSocket連接,我們使用 WebSocket.DefaultDialer ,它是一個所有欄位都設置為默認值的dialer。調用 Dial 方法通過WebSocket伺服器URL (wsURL)返回WebSocket連接。

sendMessage 函數接收一個WebSocket連接和 inbound 消息作為參數。將消息序列化成json以二進制格式在websocket連接中發送。

receiveWSMessage 函數以 ws WebSocket連接為參數,通過 ws.ReadMessage() 讀取請求消息,然後反序列化成 outbound 類型返回。
如果我們運行測試,我們將看到它們通過: