10、測試
測試包含單元測試、性能測試、安全測試和功能測試等幾個方面,本章將從Node實踐的角度來介紹單元測試和性能測試。
10.1 單元測試
10.1.1 單元測試的意義
開發者自測。對于開發者而言,不僅要編寫單元測試,還應當編寫可測試代碼。
編寫可測試代碼原則:
- 單一職責
- 接口抽象
- 層次分離
10.1.2 單元測試介紹
1.斷言
2.測試框架
3.測試代碼的文件組織
4.測試用例
5.測試覆蓋率
6.mock
7.私有方法的測試
10.1.3 工程化與自動化
1.工程化
2.持續集成
10.1.4 小結
在這一節中,我們介紹了普通的單元測試的方方面面,對于一些特定場景下的單元測試方式并未做過多介紹比如測試Web應用等,讀者可以自行查看所用Web框架的測試方式,比如Connect或Express提供了supertest輔助庫來簡化單元測試的編寫。
在項目中經常會因為依賴方的變化而產生業務代碼的跟隨變動,如果沒有單元測試的覆蓋,依賴方邏輯發生變化后,很難定位該變動影響的范圍。一旦為項目覆蓋完善的單元測試項目的狀態將會因為測試報告而了然于心。完善的單元測試在一定程度上也昭示著項目的成熟度。
10.2 性能測試
單元測試主要用于檢測代碼的行為是否符合預期。在完成代碼的行為檢測后,還需要對已有代碼的性能作出評估,檢測已有功能是否能滿足生產環境的性能要求,能否承擔實際業務帶來的壓力。換句話說,性能也是功能。
性能測試的范疇比較廣泛,包括負載測試、壓力測試和基準測試等。由于這部分內容并非Node特有,為了收斂范疇,這里將只會簡單介紹下基準測試。
除了基準測試,這里還將介紹如何對Web應用進行網絡層面的性能測試和業務指標的換算。
10.2.1 基準測試
10.2.2 壓力測試
10.2.3 基準測試驅動開發
- 寫基準測試
- 寫/改代碼
- 收集數據
- 找出問題
- 回倒第2步
10.2.4 測試數據與業務數據的轉換
10.3 總結
測試是應用或者系統最重要的質量保證手段。有單元測試實踐的項目,必然對代碼的粒度和層次都掌握得較好。單元測試能夠保證項目每個局部的正確性,也能夠在項目迭代過程中很好地監督和反饋迭代質量。如果沒有單元測試,就如同黑夜里沒有秉燭的行走。
對于性能,在編碼過程中一定存在部分感性認知,與實際情況有部分偏差,而性能測試則能很好地斧正這種差異。
11、產品化
目前,在國內大多數人都將Node以實驗性質的方式來使用,國外已經有知名的項目將Node應用在實際的生產環境中,如eBay的數據中間層、Linkedin移動應用的服務器端等。本章將詳細介紹將Node產品化過程中需要注重的一些細節,這些細節其實是具備普適性的,并非Node所獨有。鑒于部分Node開發者可能從前端轉來,為了完善Node生態的介紹,所以添加了此章。盡管因為熟悉JavaScript,可以較好地上手Node,但是事實上從演示原型到產品還有較長的縫隙需要去填補。
在實際的產品中,需要很多非編碼相關的工作以保證項目的進展和產品的正常運行等,這些細節包括工程化、架構、容災備份、部署和運維等。只有這些任務在持續性進行,才表明項目是活著的。
11.1 項目工程化
所謂的工程化,可以理解為項目的組織能力。體現在文件上,就是文件的組織能力。對于不同類型的項目,其組織方式也有所不同。除此之外,還應當有能夠將整個項目串聯起來的靈魂性文件。
項目的組織就猶如行軍作戰的陣法和章法,混亂而無目的的軍隊幾乎不可能打勝仗,有其形有其魂的組織的生命周期才會更長,其形態才更穩固。
在項目工程化過程中,最基本的幾步是目錄結構、構建工具、編碼規范和代碼審查等。
11.2 部署流程
11.3 性能
11.4 日志
11.5 監控報警
11.6 穩定性
11.7 異構共存
11.8 總結
一般而言,決定用一項技術進行產品開發時,只有最早期是與這門技術完全相關的。隨著時間的遷移,要解決的已經不是原來的問題了,一門技術只能在一定層面上發揮出它的優勢來。用Node也是一樣,隨著開發的進展、涉及層面的增多,我們看到在產品的角度要解決的問題依然是大部分技術都要解決的問題。我們希望讀者能夠將Node納人到新的層面上進行考慮,使它更適應產品,在產品中發揮出更大的優勢來。
下一章介紹:搭建局域NPM倉庫