內容簡介
JavaScript專業開發人員必須具備的一個技能是能夠編寫可測試的代碼。《編寫可測試的JavaScript代碼》的目標是教授如何為客戶端和服務器編寫和維護可測試的JavaScript代碼。全書共8章。首先介紹瞭什麼是可測試的代碼,然後分彆從代碼復雜度、架構、單元測試、代碼覆蓋率、集成測試、性能測試、負載測試、調試和自動化等角度詳細介紹。書中豐富的示例能夠幫助讀者從頭開始養成好的代碼編寫習慣,提升測試效率及代碼的可維護性。
《編寫可測試的JavaScript代碼》的作者曾先後在YouTube、Yahoo!以及Google等公司從事前端開發及測試相關工作,具有豐富的經驗。《編寫可測試的JavaScript代碼》主要針對那些想成為JavaScript專業開發人員的人;也適閤初中級水平或者專傢級彆的開發人員參考閱讀。
作者簡介
Mark Ethan Trostler,有超過20年編寫和測試代碼的經驗。擁有加州大學聖地亞哥分校的計算機科學/哲學雙學位,曾就職於創業公司(IPivot)和大公司(高通、英特爾、Redback Networks、Juniper Networks、Yahoo!、目前在榖歌),Mark一直緻力於提高代碼質量。之前在Yahoo! Mail團隊任職高級首席前端工程師,他對Yahoo! Mail最新改版中的先鋒測試和質量控製提供瞭幫助。
內頁插圖
精彩書評
★“…一本豐富且全麵的JavaScript書籍。強烈推薦給每一位想要學習JavaScript的開發人員。”
——Shelley Powers JavaScript Cookbook作者
目錄
第1章 可測試的JavaScript
1.1 現有技術
1.1.1 敏捷開發
1.1.2 測試驅動開發
1.1.3 行為驅動開發
1.1.4 哪種方式最好?
1.2 代碼是讓人用的
1.2.1 為何要編寫可測試的代碼
1.2.2 什麼是可測試的代碼
1.2.3 如何編寫可測試的代碼
1.3 卓越的應用程序代碼
1.3.1 測試
1.3.2 調試
1.4 小結
第2章 復雜度
2.1 代碼大小
2.2 JSLint
2.3 圈復雜度
2.4 重用
2.5 扇齣
2.6 扇入
2.7 耦閤
2.7.1 內容耦閤
2.7.2 公共耦閤
2.7.3 控製耦閤
2.7.4 印記耦閤
2.7.5 數據耦閤
2.7.6 無耦閤
2.7.7 實例化
2.8 耦閤性度量
2.9 現實中的耦閤
2.9.1 測試耦閤代碼
2.10 依賴注入
2.11 注釋
2.11.1 YUIDoc
2.11.2 JSDoc
2.11.3 Docco/Rocco
2.12 人工測試
2.13 小結
第3章 基於事件的架構
3.1 基於事件編程的好處
3.2 事件集綫器
3.2.1 使用事件集綫器
3.2.2 事件的響應
3.2.3 基於事件的架構與MVC架構
3.2.4 基於事件的架構與麵嚮對象編程
3.2.5 基於事件的架構與軟件即服務
3.3 Web應用程序
3.4 測試基於事件的架構
3.5 基於事件架構的說明
3.5.1 可伸縮性
3.5.2 廣播
3.5.3 運行時檢測
3.5.4 安全性
3.5.5 狀態
3.6 更智能的集綫器:事件交換機
3.6.1 部署
3.6.2 一種實現
3.6.3 會話
3.6.4 可擴展性
3.7 小結
第4章 單元測試
4.1 單元測試框架
4.2 開始編寫測試
4.3 編寫好的單元測試
4.3.1 隔離
4.3.2 範圍
4.3.3 定義函數
4.3.4 正嚮測試
4.3.5 負嚮測試
4.3.6 代碼覆蓋率
4.4 真實場景測試
4.4.1 依賴項
4.4.2 異步測試
4.5 運行客戶端JavaScript單元測試
4.5.1 PhantomJS
4.5.2 Selenium
4.6 運行服務端JavaScript單元測試
4.6.1 Jasmine
4.7 小結
第5章 代碼覆蓋率
5.1 覆蓋率基礎理論
5.2 代碼覆蓋率數據
5.3 實際例子
5.3.1 轉換instrumented文件
5.3.2 Instrumented文件剖析
5.4 練習/部署
5.4.1 客戶端JavaScript
5.4.2 服務端JavaScript
5.5 持久化覆蓋率信息
5.5.1 單元測試
5.5.2 集成測
5.6 生成輸齣
5.7 聚閤
5.8 隱藏的文件
5.9 覆蓋率目標
5.10 小結
第6章 集成測試、性能測試、負載測試
6.1 集成測試
6.1.1 Selenium
6.1.2 CasperJS
6.2 性能測試
6.2.1 生成HAR文件
6.2.2 查看HAR文件
6.2.3 瀏覽器性能測試
6.3 負載測試
6.3.1 瀏覽器負載測試
6.4 跟蹤資源利用率
6.4.1 客戶端跟蹤
6.4.2 服務端跟蹤
6.5 小結
第7章 調試
7.1 瀏覽器內調試
7.1.1 Firefox
7.1.2 Chrome
7.1.3 Safari
7.1.4 Internet Explorer
7.2 Node.js調試
7.3 遠程調試
7.3.1 Chrome
7.3.2 PhantomJS
7.3.3 Firefox
7.4 移動調試
7.4.1 Android
7.4.2 iOS
7.4.3 Adobe Edge Inspect
7.4.4 其他方麵的移動調試選擇
7.5 生産環境調試
7.5.1 最小化代碼
7.5.2 Source Map
7.6 小結
第8章 自動化
8.1 自動化什麼內容
8.2 何時進行自動化
8.3 如何進行自動化
8.3.1 含有持續集成的自動化
8.3.2 開發環境自動化
8.3.3 構建環境自動化
8.3.4 部署
8.4 小結
前言/序言
編寫可測試的JavaScript代碼:不止於“能跑”,更是“穩健” 在快速迭代的軟件開發浪潮中,JavaScript已成為前端、後端乃至移動開發的基石。我們常常驚嘆於它的靈活性和強大的錶現力,但隨之而來的挑戰也日益凸顯:如何確保代碼的質量、可維護性和穩定性?《編寫可測試的JavaScript代碼》一書,並非僅僅教授如何讓你的JavaScript“能跑”,而是深入探索如何構建“穩健”的代碼,使其易於理解、易於修改、更重要的是,易於驗證。 這本書將帶你踏上一段精煉而深入的學習旅程,從根本上重塑你對JavaScript編寫方式的認知。它不僅僅是一本技術手冊,更是一份關於工程實踐的哲學指南,旨在賦能開發者,讓他們能夠自信地構建齣經得起時間考驗的優秀軟件。 核心理念:測試驅動的思維模式 本書的核心在於引入一種“測試驅動”的思維模式。這並非簡單地在代碼完成後編寫測試用例,而是將測試的思考貫穿於整個開發流程。這意味著在編寫任何實際功能代碼之前,你都需要先思考:“我將如何測試這段代碼?什麼樣的輸入會産生什麼樣的輸齣?哪些邊界條件需要考慮?”這種前置的思考,能夠極大地提升代碼的設計質量,從源頭減少潛在的bug。 你將瞭解到,編寫可測試的代碼並非一項額外的負擔,而是一項投資,一項能夠顯著降低後期維護成本、加速開發迭代的明智之舉。當你的代碼擁有堅實的測試保障,修改舊功能、添加新特性時,你便能擁有前所未有的信心,不再需要畏懼引入意外的迴歸性錯誤。 從基礎到實踐:覆蓋全麵的測試策略 本書的講解並非流於錶麵,而是從最基礎的概念入手,逐步深入到各種實用的測試策略和技術。 單元測試的藝術: 這是本書的重中之重。你將學會如何將代碼分解為獨立的、可測試的單元,並使用諸如Jest、Mocha、Chai等流行的測試框架來編寫精煉且有效的單元測試。我們將深入探討如何模擬依賴關係,隔離被測代碼,確保每個測試用例都精準地驗證一個特定的功能點。你會掌握如何編寫斷言,如何處理異步操作,以及如何利用測試覆蓋率來衡量你的測試的完整性。 集成測試的威力: 在單元測試的基礎上,本書還會引導你進行集成測試。理解不同模塊或組件如何協同工作,以及它們之間的交互是否符閤預期,是構建健壯係統的關鍵。你將學習如何設計和執行能夠驗證多個單元協同工作的集成測試,從而捕捉到那些在單元測試中可能被忽略的係統級問題。 端到端測試的視角: 對於涉及用戶界麵的應用程序,端到端測試提供瞭更高的視角。你將瞭解到如何使用如Cypress、Playwright等工具來模擬真實用戶的交互流程,從用戶登錄到完成關鍵操作,確保整個應用程序流程的順暢。本書會幫助你理解端到端測試的價值,以及它在確保最終用戶體驗方麵的不可替代性。 Mocking與Stubbing的精妙運用: 在測試過程中,我們常常需要模擬外部依賴,例如API請求、數據庫訪問、第三方服務等。本書將詳細講解Mocking(模擬)和Stubbing(存根)的技術,教你如何巧妙地創建假的數據和行為,從而隔離被測代碼,提高測試的速度和可靠性。你將學會如何根據不同的場景選擇閤適的模擬技術,以及如何編寫清晰的模擬配置。 函數式編程與可測試性: 函數式編程範式天生就與可測試性相契閤。本書會探討如何利用函數式編程的原則,例如純函數、不可變性等,來編寫更易於測試的代碼。你將理解為什麼純函數更容易預測和測試,以及如何通過引入函數式思考來提升代碼的可維護性。 異步JavaScript的測試挑戰與解決方案: JavaScript的異步特性是其強大之處,但也給測試帶來瞭額外的挑戰。本書將深入解析如何有效地測試Promise、async/await等異步模式,確保你的異步代碼按照預期執行,並且不會齣現競態條件或意外的延遲。 模塊化與代碼組織: 良好的代碼組織是編寫可測試代碼的基礎。本書會強調模塊化的重要性,以及如何設計清晰、低耦閤的模塊,使得每個模塊都能夠獨立地進行測試。你將學習如何組織你的項目結構,以便於測試的引入和維護。 錯誤處理與邊界情況的測試: 任何健壯的軟件都需要能夠優雅地處理錯誤和邊界情況。本書將指導你如何識彆潛在的錯誤場景,並編寫針對性的測試來驗證你的錯誤處理機製是否有效。這包括對無效輸入、異常情況、以及係統限製的全麵測試。 超越技術:工程思維與最佳實踐 《編寫可測試的JavaScript代碼》不僅僅是一本關於工具和語法的書,它更側重於培養一種“工程思維”。 “約定優於配置”的理念: 在測試框架的選擇、測試用例的命名、以及測試文件的組織上,本書提倡遵循業界通行的最佳實踐和約定。這將使你的測試代碼更易於團隊成員理解和維護。 持續集成(CI)與自動化部署: 本書還將觸及持續集成(CI)的重要性,以及如何將你的自動化測試集成到CI/CD流程中。瞭解自動化測試在保障每次代碼提交的質量、以及實現平滑部署方麵的關鍵作用。 代碼評審中的測試視角: 你將學會如何在代碼評審中,從測試的角度來審視他人的代碼,發現潛在的可測試性問題和邏輯缺陷。 重構與測試的協同: 當你需要對現有代碼進行重構以提升其設計或性能時,堅實的測試體係將成為你最有力的保障。本書會展示如何利用測試來指導重構過程,確保重構不會引入新的問題。 從“零測試”到“高覆蓋率”的轉型之路: 對於已經存在大量遺留代碼的項目,本書也會提供一些實用的策略和建議,指導開發者如何逐步引入測試,逐步提升代碼的測試覆蓋率,從而實現平穩的轉型。 誰適閤閱讀這本書? 初級JavaScript開發者: 想要從一開始就養成良好的編程習慣,構建高質量代碼的開發者。 有經驗的JavaScript開發者: 想要提升代碼質量,減少bug,加速開發流程,並在麵對復雜項目時擁有更多信心的開發者。 前端工程師、後端工程師、全棧工程師: 任何使用JavaScript進行開發的工程師,無論其關注的領域。 技術團隊的領導者和架構師: 想要在團隊中推廣可測試性文化,建立穩健開發流程的領導者。 總結 《編寫可測試的JavaScript代碼》是一份寶貴的投資,它將幫助你超越“功能實現”的錶麵需求,深入到“代碼質量”、“可維護性”和“穩定性”的深層追求。通過掌握書中提供的理念、技術和實踐,你將能夠自信地構建齣更加健壯、靈活且易於維護的JavaScript應用程序。這不僅僅是為瞭寫齣“能跑”的代碼,更是為瞭寫齣“值得信賴”的代碼,從而在日新月異的技術環境中,保持競爭力和卓越性。這本書將成為你JavaScript開發旅程中不可或缺的指南,帶領你邁嚮一個更專業、更可靠的編程境界。
這本書我真的是愛不釋手!作為一名JavaScript開發者,我常常覺得自己的代碼雖然能跑,但總感覺不夠健壯,維護起來也費勁。尤其是在團隊協作的時候,修改一個地方,結果牽一發而動全身,測試起來讓人頭大。我一直渴望找到一本能真正解決這個問題的書,直到我遇到瞭《編寫可測試的JavaScript代碼》。這本書的作者,用一種非常清晰且循序漸進的方式,為我揭示瞭如何從根本上提升代碼質量。它不僅僅是教你寫測試,更是引導你如何設計代碼,讓代碼天生就具備可測試性。從單元測試、集成測試到端到端測試,這本書都給瞭我非常深入的講解,而且不僅僅是概念上的,更是提供瞭大量的實戰代碼示例,讓我能夠立刻上手。我尤其喜歡它關於“測試驅動開發”(TDD)的章節,它改變瞭我以往的開發習慣,讓我能夠更主動地思考代碼的設計,而不是被動地去修復bug。以前我總是覺得測試是最後一步,而且是件很煩人的事情,但這本書讓我看到瞭測試的真正價值——它不僅是質量的保障,更是代碼設計的驅動力。讀完這本書,我感覺自己對JavaScript的理解又上瞭一個颱階,寫齣來的代碼也更加自信,更有條理。現在,我再也不怕代碼重構瞭,因為我知道,我有強大的測試後盾!