專案範例

接下來我們以一個商品紅配綠的活動範例,來瞭解 TDD 是如何實現的。為了便於理解,範例的設計將會簡化,也許會與業界實際案例有所差異。

需求規格

先來看看需求規格:

  1. 每項商品只能買一個。

  2. 當購物車加入一個紅標商品時,必須再加入一個綠標商品才可結帳。

  3. 一個紅標商品,必須只對應一個綠標商品,不可有兩個以上的紅標商品對應一個綠標商品,或是一個紅標商品對應兩個以上綠標商品的狀況。

  4. 最少要有一個紅標商品和一個綠標商品才可結帳。

  5. 當加入紅標商品和綠標商品時,購物車顯示總價應為所有商品價格總合的 75 折。

註:這裡我們就不再製作 UI ,只專注在購物車邏輯上。

架構分析

TDD 並不是一開始就要撰寫測試,而是先設計出基本的程式架構,再搭配範例情境與使用案例來撰寫測試,進而完成程式。

所以我們先進行初步的分析:

  1. 角色有兩個:購物車、商品。

  2. 商品包含品名、價格、活動標籤。

  3. 購物車有加入商品、結帳等功能。

  4. 加入商品時,不需要考慮每項商品的數量。

  5. 結帳時驗證加入的商品是否符合活動條件,並計算折扣的總價。

範例情境

接著我們要設定範例情境:

  • 假定有四項商品,分別是:

    • 紅標商品 1 - $200
    • 紅標商品 2 - $160
    • 綠標商品 1 - $80
    • 綠標商品 2 - $100
  • 一個購物車,其功能有:

    • 加入商品
    • 計算總價
    • 結帳

使用案例

以下列出使用案例,讓開發者可以明確得知它們

  1. 購物車加入一個紅標商品 1 後結帳,出現「商品配對錯誤」的錯誤訊息。

  2. 購物車加入一個紅標商品 1 及綠標商品 1 ,總金額應為 ($200 + $80) * 0.75 = $210 。

  3. 購物車加入一個紅標商品 2 及綠標商品 2 ,總金額應為 ($160 + $100) * 0.75 = $195 。

  4. 購物車加入一個紅標商品 1 及綠標商品 2 ,總金額應為 ($200 + $100) * 0.75 = $225 。

  5. 購物車加入一個紅標商品 1 、紅標商品 2 及綠標商品 1 ,出現「商品配對錯誤」的錯誤訊息。

  6. 購物車加入一個紅標商品 1 、綠標商品 1 及綠標商品 2 ,出現「商品配對錯誤」的錯誤訊息。

設計

以下我們直接設計將要開發的類別:

  • Cart - 購物車

    • addProduct - 加入購物車 (接受一個商品物件)
    • checkout - 結帳 (計算總價,成功回傳 true 、失敗回傳錯誤訊息)
    • getTotal - 取得最後的總價
  • Product - 商品

    • __construct - 建構子 (設定商品資訊)
    • getName - 取得名稱
    • getPrice - 取得單價
    • getTag - 取得活動標籤 (R 為紅標, G 為綠標)

練習

  • 試著用圖形來表示整個專案的抽象架構圖,並說明給身邊的同學瞭解。

  • 想想看這樣的設計規格可能會有什麼問題?使用案例是否考慮到了所有的狀況?