當前位置:
首頁 > 最新 > 用內置的模塊編寫測試

用內置的模塊編寫測試

你是否曾經有過這樣的衝動:迫切地想為你的一個很重要的功能編寫一個測試腳本,最後你卻因為在閱讀相關的測試類庫的時候望而卻步呢?的確,剛開始編寫測試,總是很難的。然而如果使用Node的assert模塊編寫測試,那麼壓根就不需要使用其他特定的類庫來編寫測試腳本。如果說你只是為一個很小的模塊編寫測試,那麼通過一種可以省去安裝各種依賴的方式來實現你的測試將會是很棒的。本技巧就會為你展示如何編寫簡潔而又富有表現力的單文件測試。

斷言模塊在Node中是與生俱來的。你可以認為它就是一個專門用來驗證輸出和期望是否一致的一個工具。在內容的實現上,它是通過比較一個實際值actual和一個期望值expected來實現的。assert.equal方法參數定義就很完美地展示了這一點,它們兩個參數分別就是:actual、expected。當然,你也可以傳入第三個參數message作為它的可選參數來代表一個消息,當測試結果失敗的時候,人們也可以知道到底發生了什麼事情。現在我們舉個例子,比如你現在編寫一個這樣的測試場景:你需要計算一個在線商城的訂單價格,現在購物車裡有3個商品,每件的單價都是3.99美元,你通過下面的測試來保證計算邏輯的正確性。

assert.equal(

order.subtotal, 11.97,

"The price of three items at $3.99 each"

);

對於使用一個只擁有一個參數的assert方法,比如assert(value),期望的結果是true,其模式和上面其實是一樣的(補充說明:就是說,只要value不是0就返回真).可以嘗試運行下面的代碼,來發現測試失敗的時候到底發生了什麼:

載入斷言模塊。

斷言模塊就是用來驗證傳入的值是否為真。

assert.equal用來判斷返回的值和設置的值是否相等。

square方法就是我們要測試的目標方法。

在很多的測試腳本中都會看到第一行代碼,它用來載入assert模塊。assert變數也是assert.ok的一個別稱——換句話說,你既可以使用assert(),也可以使用assert.ok()。

有時候很容易就忘記assert.equal的參數順序,所以,你或許會發現為了這個還需要經常去翻閱Node的文檔。然而其實這兩個參數的順序即使反了也沒有什麼關係——有些人可能會覺得把expected參數放到第一個會讓他們在代碼里查找對應的值變得更加簡單——但是,不管怎麼樣,你最好保持前後定義的一致性。這也就是為什麼在上面的例子中,我們顯式地為變數命名成actual和expected。

上面的測試用例中,需要測試的目標方法其實是意想得到錯誤的。所以當你通過運行上面的測試腳本node assertions.js(上面的代碼放在assertions.js文件中),你將會得到下面這樣的一個有錯誤提示的跟蹤堆棧。

斷言失敗的文件和代碼行數。

如果光從跟蹤堆棧上來看,感覺很難發現到底錯在哪裡。但是由於上面的測試用例在斷言方法中包含了一段消息,這段消息在錯誤發生的時候會顯示出來,通過這消息的描述我們就可以發現怎麼回事。當然,從堆棧跟蹤的結果中,也可以發現它已經告訴我們錯誤發生在assertions.js的。除了上面的方法之外,在assert模塊中還有其他用來驗證測試結果的有用方法,其中有一個最重要的就方法就是:assert.deepEqual,通過這個方法,我們可以判斷兩個對象的相等性,這個方法非常重要,因為assert.equal只能用來比較一些外圍屬性的相等性(補充:如果你了解淺拷貝和深拷貝的概念,對這個理解就會顯得很明了)。淺等性用來比較一些原始屬性或者字元串的相等,然而deepEqual可以更進一步地比較兩個對象內置的對象和值。

當你在編寫一些返回複雜類型對象的測試用例時,你也許會發現deepEqual很有用的。再回顧前面那個在線上商城的例子,你的購物車或許看上去是這樣的:],subtotal:4.95},這個對象里包含了一組購物車對象和一個小計值,這個值是通過另外一個對象計算而來的。現在,如果要通過單元測試來驗證這個對象,你就可以使用assert.deepEqual,因為它可以用來比較對象而不僅僅限於原始類型的值。下面的代碼展示了deepEqual的使用:

載入assert模塊。

使用assert.deepEqual比較對象。

登錄系統有一個錯誤。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 行家匯 的精彩文章:

模擬PayPal的IPN請求
Node為中間件注入創建seams
web應用程序的測試
一個restify應用和Restify路由用法
Node使用事件來組織應用結構及觸發事件

TAG:行家匯 |

您可能感興趣

編寫項目材料的一點思考
面試專題:簡歷編寫
基因組編寫:當前進展及應用
文論教材編寫的大膽嘗試
從0開始編寫信息收集器
為 man 手冊頁編寫解析器的備忘錄
嘗試用Node.js編寫一個區塊鏈
通過Rust編寫操作系統之內存的分頁與管理介紹(上)
如何編寫軟體的操作手冊?
微軟開源驅動程序模塊框架 輕鬆編寫Windows驅動程序
質量是教材編寫的生命線
iOS 和 Mac 應用今年開始融合,開發者使用同一套開發工具編寫應用
基因組編寫項目瞄準超安全細胞
無需編寫代碼,API業務流程測試零代碼實現
使用Django編寫簡易測試報告生成器
全軍後勤訓練新大綱配套教材編寫工作啟動
用C#編寫Linux守護進程
教你編寫一個手勢解鎖控制項
C#編寫簡單的聊天程序
貸後指引啟動編寫 網貸行業迎來全方位監管