單元測試的藝術|以 JavaScript 為例

    「本書是我們的測試經典。JavaScript社群何其幸運,因為這本書改用我們喜愛的語言。」—Yoni Goldberg,Node.js 測試顧問,Node.js Best Practices 的作者

    收集中
    US$21.18

    內容簡介


    「本書是我們的測試經典。JavaScript社群何其幸運,因為這本書改用我們喜愛的語言。」
    —Yoni Goldberg,Node.js 測試顧問,Node.js Best Practices 的作者


    「這是一本測試名著!」
    —Jaume Lopez,Institut Guttmann

    「這本書教你測試哲學,以及單元測試的實作細節。」
    —Matteo Gildone
    Springer Nature

    「本書對於測試的對象、時機,以及如何做好測試提出適當的見解。」
    —Rich Yonts,Teradata

    單元測試的藝術並非只有掌握正確的工具和實踐方法而已,也包含瞭解優秀測試的運作原理、為每一個獨特的情況找出正確的策略,以及在測試過程一團亂時知道該怎麼做。本書提供的觀點和建議將改變你測試軟體的方式。

    《單元測試的藝術》第三版將教你寫出容易閱讀與維護的測試,不僅介紹測試的基本寫法,也深入探討範圍擴及整個組織的測試策略、問題排除、處理遺留碼(legacy code)和「冷酷」重構。你會愛上這些實際的範例和熟悉的情境,它們將讓你在閱讀的過程中彷彿親臨測試現場。這本第三版增加適用於物件導向、泛函設計,和模組化風格的技術。書中的範例使用 JavaScript。

    本書主題包括:
    •決定測試類型和策略
    •測試的進入點&退出點
    •重構遺留碼
    •fake、stub、mock 物件,與分隔框架
    •物件導向、泛函,與模組化測試風格

    書中的範例使用 JavaScript、TypeScript 與 Node.js。
    ACL065800

    作者介紹


    Roy Osherove 是國際公認的單元測試和敏捷軟體方法專家。
    Vladimir Khorikov 是 Manning 《Unit Testing Principles, Practices, and Patterns》和《Plural-sight》的作者,也是 Microsoft MVP。

    目錄


    【第一部分 邁出第一步】

    chapter1 單元測試基礎
    1.1 第一步
    1.2 定義單元測試(一步一步來)
    1.3 進入點和退出點
    1.4 退出點類型
    1.5 不同的退出點,不同的技術
    1.6 從零開始編寫測試
    1.7 優良單元測試的特點
    1.8 整合測試
    1.9 我們的最終定義
    1.10 測試驅動開發

    chapter2 第一個單元測試
    2.1 介紹Jest
    2.2 程式庫、斷言、執行器和報告器
    2.3 單元測試框架提供的功能
    2.4 介紹PasswordVerifier專案
    2.5 verifyPassword的第一個Jest測試
    2.6 嘗試使用beforeEach()方法
    2.7 嘗試工廠方法
    2.8 圓滿test()
    2.9 重構成參數化的測試程式
    2.10 檢查預期會被丟出來的錯誤
    2.11 設定測試分類

    【第二部分 核心技術】

    chapter3 使用stub來切斷依賴關係
    3.1 依賴項目的類型
    3.2 使用stub的理由
    3.3 被廣泛接受的stubbing設計方法
    3.4 泛函注入技術
    3.5 模組化注入技術
    3.6 使用具備建構函式的物件
    3.7 物件導向注入技術

    chapter4 使用mock物件來進行互動測試
    4.1 互動測試、mock和stub
    4.2 依賴logger
    4.3 標準風格:參數重構
    4.4 區分mock和stub的重要性
    4.5 模組化風格的mock
    4.6 泛函風格的mock
    4.7 物件導向風格的mock
    4.8 處理複雜的介面
    4.9 部分mock

    chapter5 分隔框架
    5.1 定義分隔框架
    5.2 動態偽造模組
    5.3 泛函動態mock和stub
    5.4 物件導向的動態mock和stub
    5.5 動態地stubbing行為
    5.6 分隔框架的優勢和陷阱

    chapter6 非同步程式的單元測試
    6.1 處理非同步資料抓取
    6.2 讓程式更適合進行單元測試
    6.3 處理定時器
    6.4 處理常見事件
    6.5 引入DOM測試庫

    【第三部分測試程式碼】

    chapter7 可信的測試
    7.1 如何知道你信任一個測試
    7.2 測試為何會失敗
    7.3 避免在單元測試中加入邏輯
    7.4 在通過的測試中,聞到虛假的信任感
    7.5 處理不穩定的測試

    chapter8 易維護性
    8.1 因測試失敗而被迫進行的更改
    8.2 讓維護工作更輕鬆的重構
    8.3 避免過度規範

    【第四部分設計和流程】

    chapter9 易讀性
    9.1 單元測試的命名
    9.2 魔法值和變數命名
    9.3 將斷言與操作分開
    9.4 設置和卸除

    chapter10 制定測試策略
    10.1 常見的測試類型和階層
    10.2 測試階層的反模式
    10.3 測試配方策略
    10.4 管理交付管道

    chapter11 制定測試策略
    11.1 成為改革代理人的步驟
    11.2 成功之道
    11.3 失敗之道
    11.4 影響因素
    11.5 棘手問題和答案

    chapter12 與遺留碼共舞
    12.1 從哪裡開始加入測試?
    12.2 決定一個選擇策略
    12.3 在重構之前編寫整合測試

    附錄 對函式和模組進行monkey-patch
    索引

    章節目錄

    • 1-1
      封面頁
    • 1-2
      書名頁
    • 1-3
      對本書的讚譽
    • 1-4
      目錄
    • 1-5
      第二版推薦序
    • 1-6
      第一版推薦序
    • 1-7
    • 1-8
      致謝
    • 1-9
      本書簡介
    • 1-10
      作者簡介
    • 1-11
      封面插圖記事
    • 1-12
      第一部分邁出第一步
    • 1-13
      Ch01 單元測試基礎
    • 1-14
      1.1 第一步
    • 1-15
      1.2 定義單元測試(一步一步來)
    • 1-16
      1.3 進入點和退出點
    • 1-17
      1.4 退出點類型
    • 1-18
      1.5 不同的退出點,不同的技術
    • 1-19
      1.6 從零開始編寫測試
    • 1-20
      1.7 優良單元測試的特點
    • 1-21
      1.7.1 何謂優良的單元測試?
    • 1-22
      1.7.2 單元測試檢查表
    • 1-23
      1.8 整合測試
    • 1-24
      1.9 我們的最終定義
    • 1-25
      1.10 測試驅動開發
    • 1-26
      1.10.1 TDD:並非優良單元測試的替代品
    • 1-27
      1.10.2 成功地進行TDD 的三項核心技能
    • 1-28
      Ch02 第一個單元測試
    • 1-29
      2.1 介紹Jest
    • 1-30
      2.1.1 準備我們的環境
    • 1-31
      2.1.2 準備我們的工作資料夾
    • 1-32
      2.1.3 安裝Jest
    • 1-33
      2.1.4 建立測試檔案
    • 1-34
      2.1.5 執行Jest
    • 1-35
      2.2 程式庫、斷言、執行器和報告器
    • 1-36
      2.3 單元測試框架提供的功能
    • 1-37
      2.3.1 xUnit 框架
    • 1-38
      2.3.2 xUnit、TAP 和Jest 結構
    • 1-39
      2.4 介紹Password Verifier 專案
    • 1-40
      2.5 verifyPassword 的第一個Jest 測試
    • 1-41
      2.5.1 Arrange-Act-Assert 模式
    • 1-42
      2.5.2 測試「測試程式」
    • 1-43
      2.5.3 用USE 來命名
    • 1-44
      2.5.4 字串比較和易維護性
    • 1-45
      2.5.5 使用describe()
    • 1-46
      2.5.6 結構暗示背景資訊
    • 1-47
      2.5.7 使用it() 函式
    • 1-48
      2.5.8 兩種Jest 風格
    • 1-49
      2.5.9 重構產品程式碼
    • 1-50
      2.6 嘗試使用beforeEach() 方法
    • 1-51
      2.6.1 beforeEach() 與捲動疲勞
    • 1-52
      2.7 嘗試工廠方法
    • 1-53
      2.7.1 用工廠方法來完全取代beforeEach()
    • 1-54
      2.8 圓滿test()
    • 1-55
      2.9 重構成參數化的測試程式
    • 1-56
      2.10 檢查預期會被丟出來的錯誤
    • 1-57
      2.11 設定測試分類
    • 1-58
      第二部分核心技術
    • 1-59
      Ch03 使用stub 來切斷依賴關係
    • 1-60
      3.1 依賴項目的類型
    • 1-61
      3.2 使用stub 的理由
    • 1-62
      3.3 被廣泛接受的stubbing 設計方法
    • 1-63
      3.3.1 使用參數注入來將時間stubbing 出來
    • 1-64
      3.3.2 依賴項目、注入,與控制
    • 1-65
      3.4 泛函注入技術
    • 1-66
      3.4.1 注入函式
    • 1-67
      3.4.2 透過部分應用來進行依賴注入
    • 1-68
      3.5 模組化注入技術
    • 1-69
      3.6 使用具備建構函式的物件
    • 1-70
      3.7 物件導向注入技術
    • 1-71
      3.7.1 建構函式注入
    • 1-72
      3.7.2 注入一個物件而不是一個函式
    • 1-73
      3.7.3 提取共用介面
    • 1-74
      Ch04 使用mock 物件來進行互動測試
    • 1-75
      4.1 互動測試、mock 和stub
    • 1-76
      4.2 依賴logger
    • 1-77
      4.3 標準風格:參數重構
    • 1-78
      4.4 區分mock 和stub 的重要性
    • 1-79
      4.5 模組化風格的mock
    • 1-80
      4.5.1 產品程式碼範例
    • 1-81
      4.5.2 以模組化注入風格來重構產品程式碼
    • 1-82
      4.5.3 使用模組化注入的測試範例
    • 1-83
      4.6 泛函風格的mock
    • 1-84
      4.6.1 使用currying 風格
    • 1-85
      4.6.2 使用高階函式而不進行currying
    • 1-86
      4.7 物件導向風格的mock
    • 1-87
      4.7.1 重構產品程式碼以便注入
    • 1-88
      4.7.2 使用介面注入來重構產品程式碼
    • 1-89
      4.8 處理複雜的介面
    • 1-90
      4.8.1 複雜介面範例
    • 1-91
      4.8.2 使用複雜的介面來編寫測試
    • 1-92
      4.8.3 直接使用複雜介面的缺點
    • 1-93
      4.8.4 介面隔離原則
    • 1-94
      4.9 部分mock
    • 1-95
      4.9.1 部分mock 的泛函範例
    • 1-96
      4.9.2 物件導向的部分mock 範例
    • 1-97
      Ch05 分隔框架
    • 1-98
      5.1 定義分隔框架
    • 1-99
      5.1.1 選擇一種風格:鬆散型vs. 定型
    • 1-100
      5.2 動態偽造模組
    • 1-101
      5.2.1 關於Jest 的API 的一些注意事項
    • 1-102
      5.2.2 考慮將直接依賴項目抽象化
    • 1-103
      5.3 泛函動態mock 和stub
    • 1-104
      5.4 物件導向的動態mock 和stub
    • 1-105
      5.4.1 使用寬鬆型態框架
    • 1-106
      5.4.2 切換到型態友善框架
    • 1-107
      5.5 動態地stubbing 行為
    • 1-108
      5.5.1 使用mock 和stub 的物件導向範例
    • 1-109
      5.5.2 使用substitute.js 的stub 和mock
    • 1-110
      5.6 分隔框架的優勢和陷阱
    • 1-111
      5.6.1 在多數情況下,你不需要mock 物件
    • 1-112
      5.6.2 難以閱讀的測試程式碼
    • 1-113
      5.6.3 驗證錯誤的內容
    • 1-114
      5.6.4 在每一個測試中有不只一個mock
    • 1-115
      5.6.5 過度規範測試
    • 1-116
      Ch06 非同步程式的單元測試
    • 1-117
      6.1 處理非同步資料抓取
    • 1-118
      6.1.1 使用整合測試來初步嘗試
    • 1-119
      6.1.2 等待行為完成
    • 1-120
      6.1.3 async/await 的整合測試
    • 1-121
      6.1.4 整合測試的挑戰
    • 1-122
      6.2 讓程式更適合進行單元測試
    • 1-123
      6.2.1 Extract Entry Point
    • 1-124
      6.2.2 Extract Adapter 模式
    • 1-125
      6.3 處理定時器
    • 1-126
      6.3.1 使用monkey-patching 來stubbing 定時器
    • 1-127
      6.3.2 用Jest 來偽造setTimeout
    • 1-128
      6.4 處理常見事件
    • 1-129
      6.4.1 處理事件發射器
    • 1-130
      6.4.2 處理按下事件
    • 1-131
      6.5 引入DOM 測試庫
    • 1-132
      第三部分測試程式碼
    • 1-133
      Ch07 可信的測試
    • 1-134
      7.1 如何知道你信任一個測試
    • 1-135
      7.2 測試為何會失敗
    • 1-136
      7.2.1 在產品程式碼中有真正的bug 被發現了
    • 1-137
      7.2.2 有bug 的測試產生假失敗
    • 1-138
      7.2.3 測試因為功能的改變而過時
    • 1-139
      7.2.4 測試與另一個測試衝突
    • 1-140
      7.2.5 測試不穩定
    • 1-141
      7.3 避免在單元測試中加入邏輯
    • 1-142
      7.3.1 在斷言裡面的邏輯:建立動態的預期值
    • 1-143
      7.3.2 其他形式的邏輯
    • 1-144
      7.3.3 更多邏輯
    • 1-145
      7.4 在通過的測試中,聞到虛假的信任感
    • 1-146
      7.4.1 未斷言任何事情的測試
    • 1-147
      7.4.2 不理解測試
    • 1-148
      7.4.3 混合單元測試和不穩定的整合測試
    • 1-149
      7.4.4 測試多個退出點
    • 1-150
      7.4.5 不斷變動的測試
    • 1-151
      7.5 處理不穩定的測試
    • 1-152
      7.5.1 發現不穩定的測試之後該怎麼做?
    • 1-153
      7.5.2 防止高層測試不穩定
    • 1-154
      Ch08 易維護性
    • 1-155
      8.1 因測試失敗而被迫進行的更改
    • 1-156
      8.1.1 測試不相關,或與另一個測試衝突
    • 1-157
      8.1.2 產品程式碼的API 改變了
    • 1-158
      8.1.3 在其他測試內的變更
    • 1-159
      8.2 讓維護工作更輕鬆的重構
    • 1-160
      8.2.1 避免測試private 或protected 方法
    • 1-161
      8.2.2 讓測試保持DRY
    • 1-162
      8.2.3 避免使用setup 方法
    • 1-163
      8.2.4 使用參數化的測試來消除重複
    • 1-164
      8.3 避免過度規範
    • 1-165
      8.3.1 使用mock 來過度規範內部行為
    • 1-166
      8.3.2 過度規範精確的輸出和順序
    • 1-167
      第四部分設計和流程
    • 1-168
      Ch09 易讀性
    • 1-169
      9.1 單元測試的命名
    • 1-170
      9.2 魔法值和變數命名
    • 1-171
      9.3 將斷言與操作分開
    • 1-172
      9.4 設置和卸除
    • 1-173
      Ch10 制定測試策略
    • 1-174
      10.1 常見的測試類型和階層
    • 1-175
      10.1.1 評估測試的準則
    • 1-176
      10.1.2 單元測試和組件測試
    • 1-177
      10.1.3 整合測試
    • 1-178
      10.1.4 API 測試
    • 1-179
      10.1.5 E2E/UI 獨立測試
    • 1-180
      10.1.6 E2E/UI 系統測試
    • 1-181
      10.2 測試階層的反模式
    • 1-182
      10.2.1 「僅有端到端」反模式
    • 1-183
      10.2.2 「只有低階測試」反模式
    • 1-184
      10.2.3 低階測試和高階測試脫節
    • 1-185
      10.3 測試配方策略
    • 1-186
      10.3.1 如何撰寫測試配方
    • 1-187
      10.3.2 什麼時候該編寫和使用測試配方?
    • 1-188
      10.3.3 測試配方的編寫規則
    • 1-189
      10.4 管理交付管道
    • 1-190
      10.4.1 交付與發現管道
    • 1-191
      10.4.2 測試層平行化
    • 1-192
      Ch11 讓單元測試於組織中扎根
    • 1-193
      11.1 成為改革代理人的步驟
    • 1-194
      11.1.1 為棘手問題做好準備
    • 1-195
      11.1.2 說服內部人員:擁護者和抵制者
    • 1-196
      11.1.3 識別可能的起點
    • 1-197
      11.2 成功之道
    • 1-198
      11.2.1 游擊式實踐(自下而上)
    • 1-199
      11.2.2 說服管理層(由上而下)
    • 1-200
      11.2.3 從試驗開始
    • 1-201
      11.2.4 尋找外部支持者
    • 1-202
      11.2.5 讓進展可被看見
    • 1-203
      11.2.6 具體的目標、指標和KPI
    • 1-204
      11.2.7 明白你會遇到障礙
    • 1-205
      11.3 失敗之道
    • 1-206
      11.3.1 缺乏驅動力
    • 1-207
      11.3.2 缺乏政治支持
    • 1-208
      11.3.3 即興實施和第一印象
    • 1-209
      11.3.4 團隊不支持
    • 1-210
      11.4 影響因素
    • 1-211
      11.5 棘手問題和答案
    • 1-212
      11.5.1 單元測試會讓當下的流程增加多少時間?
    • 1-213
      11.5.2 單元測試會威脅我的QA 飯碗嗎?
    • 1-214
      11.5.3 有證據指出單元測試有幫助嗎?
    • 1-215
      11.5.4 為什麼QA 部門還會發現bug ?
    • 1-216
      11.5.5 我們有很多無測試程式的程式碼,該怎麼開始?
    • 1-217
      11.5.6 如果我們開發的是結合軟硬體的產品呢?
    • 1-218
      11.5.7 如何確定我們的測試中沒有bug ?
    • 1-219
      11.5.8 偵錯器說我的程式碼可以正確運行,為什麼還要使用測試程式?
    • 1-220
      11.5.9 關於TDD 呢?
    • 1-221
      Ch12 與遺留碼共舞
    • 1-222
      12.1 從哪裡開始加入測試?
    • 1-223
      12.2 決定一個選擇策略
    • 1-224
      12.2.1 先易後難策略的優缺點
    • 1-225
      12.2.2 先難後易策略的優缺點
    • 1-226
      12.3 在重構之前編寫整合測試
    • 1-227
      12.3.1 閱讀Michael Feathers 關於遺留碼的書籍
    • 1-228
      12.3.2 使用CodeScene 來調查你的產品程式碼
    • 1-229
      附錄A 對函式和模組進行monkey-patch
    • 1-230
      索引
    • 1-231
      版權頁
    • 1-232
      封底頁

    常見問答

    您可以透過手機、平板或是電腦登入 HiSKIO 平台,在【我的學習】>【我的書籍】頁面,選擇想看的電子書。

    猜你喜歡

    用戶評價

    | 收集中

    銷售方案