《測試驅動的JavaScript開發(JavaScript敏捷測試指南)》是2012年機械工業出版社出版的圖書,作者是Christian Johansen。
基本介紹
- 書名:測試驅動的JavaScript開發(JavaScript敏捷測試指南)
- 作者:Christian Johansen
- ISBN:9787111362746
- 定價:69.00元
- 出版社:機械工業出版社
- 出版時間:2012年02月
- 分類:計算機
內容簡介,作者簡介,編輯推薦,目錄,
內容簡介
本書是一本完整的、基於最佳實踐的JavaScript測試指南,同時又有著測試驅動開發方法所帶來的質量保證。本書涵蓋了將最先進的自動化測試用於JavaScript開發環境的方方面面,帶領讀者走過整個開發的生命周期,從項目啟動到應用程式部署。書面向的是JavaScript開發人員。無論您是一位Ruby開發人員,主要關注Ruby on Rails;或者是一名Java或.NET開發人員,忙於構建Web套用;又或者是一名前端Web開發人員,以JavaScript、CSS和HTML為首要工具;甚至是一名後端開發人員,對JavaScript知之甚少,本書將對您非常有用。
作者簡介
Christian Johansen居住在挪威奧斯陸,就職於當地的Shortcut AS公司,這是一家專注於開源技術、Web套用和移動套用的軟體企業。在學校里,他學習了信息學、數學和數字信息處理。Christian在職業生涯中,專門從事Web應用程式和前端技術,如JavaScript、CSS和HTML,這些技術他在HTML 4.01規格定稿的時代就充滿激情地參與了。為一名顧問,Christian在挪威曾與許多高端的公司合作,包括金融和電信行業的領頭公司,他在那裡開發從小到大的Web應用程式,內容涉及從普通的CMSbacked電子商務企業網站到自助服務的應用程式。近幾年,Christian一直是一名活躍的部落格寫手。出於和無償給予了他如此巨大收穫的社區相同的分享和貢獻的願望,Christian參與了相當數量的開源項目並為它們做了不少貢獻。與了多個JavaScript代碼數量少到可以忽略不計的項目之後,Christian感受到了“牛仔風格”的開發之痛。為了提高代碼質量、開發者的信心,以及修改和維護代碼的能力,並大大地簡化這個過程,他在過去的幾年中花費了大量的工作和業餘時間來研究JavaScript中的單元測試和測試驅動開發。作為一個鐵桿的TDD支持者,同時又使用傳統的伺服器端的開發語言,那么牛仔風格的JavaScript開發手段自然也就呼之欲出了。這種激情的集大成之作,就是你現在你手中的這本書。
編輯推薦
本書是一本完整的、基於最佳實踐的JavaScript敏捷測試指南
本書涵蓋了將最先進的自動化測試用於JavaScript開發環境的方方面面
本書將帶領讀者走過整個應用程式開發的生命周期,從項目啟動到應用程式部署
本書涵蓋了將最先進的自動化測試用於JavaScript開發環境的方方面面
本書將帶領讀者走過整個應用程式開發的生命周期,從項目啟動到應用程式部署
目錄
譯者序
前言
致謝
關於作者
第一部分 測試驅動開發
第1章 自動化測試 1
1.1 單元測試 1
1.1.1 單元測試框架 2
1.1.2 JavaScript日期函式strftime 2
1.2 斷言 5
1.3 測試函式、用例和套件 7
1.4 集成測試 10
1.5 單元測試的好處 12
1.5.1 回歸測試 12
1.5.2 重構 12
1.5.3 跨瀏覽器的測試 13
1.5.4 其他的一些好處 13
1.6 單元測試中的陷阱 13
1.7 小結 13
第2章 測試驅動開發的過程 15
2.1 測試驅動開發的目的與目標 15
2.1.1 開發順序的顛倒 15
2.1.2 測試驅動開發中的設計 15
2.2 過程 16
2.2.1 步驟1:編寫一個測試 17
2.2.2 步驟2:觀看測試失敗 17
2.2.3 步驟3:使測試通過 18
2.2.4 步驟4:重構以消除冗餘 20
2.2.5 打肥皂、沖洗、重複 20
2.3 讓測試驅動開發簡便易行 21
2.4 測試驅動開發的好處 21
2.4.1 有效的代碼 21
2.4.2 遵循單一職責原則 22
2.4.3 強制有意識的開發 22
2.4.4 提高生產效率 22
2.5 小結 22
第3章 行業工具 23
3.1 xUnit測試框架 23
3.1.1 行為驅動開發 23
3.1.2 持續集成 23
3.1.3 異步測試 24
3.1.4 xUnit測試框架的特點 24
3.1.5 斷言 25
3.1.6 依賴關係 25
3.2 瀏覽器內的測試框架 26
3.2.1 YUI Test 26
3.2.2 其他瀏覽器內的測試框架 28
3.3 無頭測試框架 29
3.3.1 交叉檢查 29
3.3.2 Rhino與env.js 29
3.3.3 無頭測試框架的缺點 30
3.4 一個掌管一切的測試運行器 30
3.4.1 JsTestDriver是怎樣工作的 30
3.4.2 JsTestDriver的缺點 31
3.4.3 安裝 31
3.4.4 在IDE里使用JsTestDriver 35
3.4.5 提高命令行效率 36
3.4.6 斷言 37
3.5 小結 38
第4章 從測試中學習 39
4.1 用單元測試探索JavaScript 39
4.1.1 觀察法編程的缺陷 41
4.1.2 學習測試的最佳點 41
4.2 性能測試 42
4.2.1 基準和相對性能 43
4.2.2 性能評測和定位瓶頸 50
4.3 小結 51
第二部分 開發人員的JavaScript
第5章 函式 53
5.1 定義函式 53
5.1.1 函式聲明 53
5.1.2 函式表達式 54
5.1.3 Function構造器 55
5.2 調用函式 56
5.2.1 arguments對象 56
5.2.2 形參和arguments 57
5.3 作用域和執行上下文 58
5.3.1 執行上下文 59
5.3.2 變數對象 59
5.3.3 活動對象 60
5.3.4 全局對象 60
5.3.5 作用域鏈 61
5.3.6 再訪函式表達式 62
5.4 this關鍵字 64
5.4.1 隱式地設定this 65
5.4.2 顯式地設定this 65
5.4.3 使用原初類型當做this 66
5.5 小結 67
第6章 函式和閉包的套用 68
6.1 綁定函式 68
6.1.1 this被丟棄:一個Lightbox的例子 68
6.1.2 通過一個匿名函式解決this問題 69
6.1.3 Function.prototype.bind 70
6.1.4 綁定參數 71
6.1.5 局部套用 73
6.2 被立即調用的匿名函式 74
6.2.1 Ad Hoc作用域 74
6.2.2 命名空間 76
6.3 狀態函式 79
6.3.1 生成唯一的標識符 79
6.3.2 疊代器 81
6.4 記憶 84
6.5 小結 86
第7章 對象和原型繼承 87
7.1 對象和屬性 87
7.1.1 屬性訪問 88
7.1.2 原型鏈 89
7.1.3 通過原型鏈實現對象擴展 90
7.1.4 可枚舉屬性 91
7.1.5 屬性的特性 94
7.2 使用構造器創建對象 98
7.2.1 prototype和[[Prototype]] 98
7.2.2 使用new創建對象 98
7.2.3 構造器原型 99
7.2.4 構造器的問題 102
7.3 偽經典結構的繼承 103
7.3.1 繼承函式 104
7.3.2 訪問[[Prototype]] 105
7.3.3 實現super 105
7.4 封裝和信息隱藏 110
7.4.1 私有方法 110
7.4.2 私有成員和特權方法 112
7.4.3 函式式繼承 113
7.5 對象組合和混搭體 115
7.5.1 Object.create方法 115
7.5.2 tddjs.extend方法 117
7.5.3 混搭體 120
7.6 小結 121
第8章 ECMAScript 5 122
8.1 JavaScript不遠的未來 122
8.2 對象模型的更新 123
8.2.1 屬性的特性 123
8.2.2 原型繼承 125
8.2.3 Getter和Setter 127
8.2.4 使用屬性的特性 128
8.2.5 作為屬性標識符的保留關鍵字 131
8.3 嚴格模式 131
8.3.1 啟用嚴格模式 131
8.3.2 嚴格模式帶來的改變 132
8.4 各種新內容及改進 134
8.4.1 原生的JSON 134
8.4.2 Function.prototype.bind 135
8.4.3 關於數組 135
8.5 小結 135
第9章 不唐突的JavaScript 137
9.1 不唐突的JavaScript的目標 137
9.2 不唐突的JavaScript的規則 138
9.2.1 唐突的標籤式面板 138
9.2.2 簡潔的標籤式面板標記 140
9.2.3 TDD和漸進增強 141
9.3 不要做任何假設 141
9.3.1 不要假設只有你一個人 141
9.3.2 不要假設標記是正確的 142
9.3.3 不要假設所有用戶的需求都一樣 142
9.3.4 不要假設支持 142
9.4 規則何時適用 143
9.5 不唐突的標籤式面板的例子 143
9.5.1 建立測試 143
9.5.2 tabController對象 145
9.5.3 activateTab方法 147
9.5.4 使用標籤控制器 149
9.6 小結 152
第10章 特性檢測 154
10.1 瀏覽器嗅探 154
10.1.1 用戶代理嗅探 154
10.1.2 對象檢測 155
10.1.3 瀏覽器嗅探的狀態 156
10.2 正確使用對象檢測 156
10.2.1 檢查對象是否存在 156
10.2.2 類型檢查 157
10.2.3 原生和宿主對象 157
10.2.4 使用測試樣例 160
10.2.5 何時測試 161
10.3 特性檢測DOM事件 161
10.4 特性檢測CSS屬性 163
10.5 跨瀏覽器事件處理例程 164
10.6 使用特性檢測 167
10.6.1 向前進 167
10.6.2 無法檢測到的特性 167
10.7 小結 168
第三部分 JavaScript測試驅動開發實踐
第11章 觀察者模式 169
11.1 JavaScript中的觀察者 169
11.1.1 觀察物庫 170
11.1.2 設定環境 170
11.2 添加觀察者 171
11.2.1 第一個測試 171
11.2.2 重構 173
11.3 檢查觀察者 174
11.3.1 測試 175
11.3.2 重構 177
11.4 通知觀察者 177
11.4.1 確保觀察者被調用 177
11.4.2 傳遞參數 178
11.5 錯誤處理 179
11.5.1 添加假的觀察者 179
11.5.2 有問題的觀察者 180
11.5.3 記錄調用順序 181
11.6 觀察任意對象 182
11.6.1 讓構造器成為過去式 183
11.6.2 用對象來替換構造器 185
11.6.3 重命名方法 186
11.7 觀察任意事件 187
11.7.1 支持observe中的事件 187
11.7.2 支持notify中的事件 188
11.8 小結 191
第12章 抽象化瀏覽器區別:Ajax 192
12.1 以測試驅動來開發一個請求API 192
12.1.1 發現瀏覽器的不一致 192
12.1.2 開發策略 192
12.1.3 目標 193
12.2 實現請求接口 193
12.2.1 項目布局 193
12.2.2 選擇接口風格 194
12.3 創建一個XMLHttpRequest對象 194
12.3.1 第一個測試 194
12.3.2 XMLHttpRequest背景知識 195
12.3.3 實現tddjs.ajax.create 196
12.3.4 更強的特性檢測 197
12.4 編寫Get請求 198
12.4.1 需要一個URL 198
12.4.2 為XMLHttpRequest對象創建樁 199
12.4.3 處理狀態的變化 205
12.4.4 處理狀態變化 206
12.5 使用Ajax API 209
12.5.1 集成測試 210
12.5.2 測試結果 211
12.5.3 微妙的麻煩 212
12.5.4 本地請求 213
12.5.5 測試狀態 214
12.6 發出POST請求 217
12.6.1 為POST做準備 217
12.6.2 傳送數據 220
12.6.3 設定請求頭信息 225
12.7 重審請求API 225
12.8 小結 229
第13章 使用Ajax和Comet將數據流式化 230
13.1 數據輪詢 230
13.1.1 項目結構 230
13.1.2 輪詢器:tddjs.ajax.poller 231
13.1.3 定時器測試 238
13.1.4 可配置的頭和回調 242
13.1.5 單行接口 245
13.2 Comet 247
13.2.1 永不消失的框架 247
13.2.2 流式化XMLHttpRequest 248
13.2.3 HTML5 248
13.3 長輪詢的XMLHttpRequest 248
13.3.1 實現長輪詢支持 248
13.3.2 避免快取問題 251
13.3.3 特性檢測 252
13.4 Comet客戶端 252
13.4.1 訊息格式 253
13.4.2 介紹ajax.cometClient 254
13.4.3 分發數據 255
13.4.4 添加觀察者 258
13.4.5 伺服器連線 259
13.4.6 跟蹤請求和接收到的數據 264
13.4.7 發布數據 267
13.4.8 特性檢測 267
13.5 小結 267
第14章 基於Node.js的伺服器端JavaScript 269
14.1 Node.js運行時環境 269
14.1.1 環境設定 269
14.1.2 起點 271
14.2 控制器 272
14.2.1 CommonJS規則模組 272
14.2.2 定義模組:首測 272
14.2.3 建立控制器 273
14.2.4 基於POST方式添加訊息 274
14.2.5 對請求做出回響 280
14.2.6 將應用程式用於實踐 281
14.3 域模型和存儲器 283
14.3.1 創建聊天室 283
14.3.2 Node中的輸入輸出 283
14.3.3 添加聊天信息 283
14.3.4 獲取聊天信息 287
14.4 Promises 290
14.4.1 用promise重構addMessage方法 291
14.4.2 使用promise對象 294
14.5 事件產生器 295
14.5.1 讓chatRoom對象成為一個事件產生器 295
14.5.2 等待聊天信息 297
14.6 回到控制器 300
14.6.1 完成Post方法 300
14.6.2 通過GET方法輸出數據流 302
14.6.3 回響頭和回響體 307
14.7 小結 308
第15章 TDD與DOM操作:聊天室客戶端程式 309
15.1 客戶端的藍圖 309
15.1.1 目錄結構 309
15.1.2 選擇方法 310
15.2 用戶表單 311
15.2.1 視圖的設定 311
15.2.2 處理提交事件 316
15.2.3 特徵測試 324
15.3 用Node.js後端使用客戶端 325
15.4 聊天信息列表 327
15.4.1 設定模型 327
15.4.2 設定視圖 330
15.4.3 添加聊天信息 331
15.4.4 來自同一用戶的重複內容 334
15.4.5 特徵測試 335
15.4.6 動手實驗 335
15.5 聊天信息表單 336
15.5.1 建立測試用例 337
15.5.2 設定視圖 337
15.5.3 發布聊天信息 339
15.5.4 特徵測試 342
15.6 聊天室客戶端的最終版本 343
15.6.1 收尾工作 344
15.6.2 部署時的注意事項 346
15.7 小結 347
第四部分 測試模式
第16章 模擬對象和創建樁 349
16.1 測試替身概述 349
16.1.1 特技替身 349
16.1.2 假對象 350
16.1.3 啞對象 350
16.2 測試驗證 351
16.2.1 狀態驗證 351
16.2.2 行為驗證 351
16.2.3 驗證策略的作用 352
16.3 樁 352
16.3.1 使用樁來避免不方便的接口 352
16.3.2 使用樁讓系統通過特定代碼路徑 353
16.3.3 使用樁來製造麻煩 353
16.4 測試間諜 354
16.4.1 測試間接輸入 354
16.4.2 檢測調用細節 355
16.5 使用樁庫 355
16.5.1 創建樁函式 355
16.5.2 給方法創建樁 356
16.5.3 內建行為驗證 358
16.5.4 創建樁和Node.js 359
16.6 模擬對象 360
16.6.1 恢復被模擬的函式 360
16.6.2 匿名的模擬對象 361
16.6.3 多重期望 361
16.6.4 對this值的期望 362
16.7 模擬對象還是樁 363
16.8 小結 364
第17章 編寫良好的單元測試 365
17.1 提高可讀性 365
17.1.1 清楚地命名測試以表明意圖 365
17.1.2 用設定、套用和驗證塊對測試進行結構化 367
17.1.3 使用更高級的抽象保持測試的簡單性 367
17.1.4 減少重複,而不是減少明確性 369
17.2 將測試作為行為規範 370
17.2.1 一次只測試一種行為 370
17.2.2 每個行為只測試一次 371
17.2.3 在測試中隔離行為 371
17.3 與測試中的缺陷做鬥爭 373
17.3.1 在測試通過之前運行它們 373
17.3.2 首先編寫測試 374
17.3.3 攪亂和破壞代碼 374
17.3.4 使用JsLint 374
17.4 小結 375
參考文獻 376