go golang TDD Test-Driven Development

上一篇我們用的一個範例來完成整個 TDD 的 Flow

這一篇我們要調整一下 Test Case 在 golang 上撰寫方式

上一篇我們在每次添加一個 Test Case 都建立一個新的 function

你可以看一下底下的 Code 內容都是相像的


  func TestBuyOneBook(t *testing.T) {

    price := calculatePrice([]int{1}) // 呼叫 func

    if price != 8 { // 判斷回傳
      t.Fatal("price should be 8, but got", price)
    }

  }

  func TestBuyTwoDifferentBook(t *testing.T) {

    price := calculatePrice([]int{1, 2}) // 呼叫 func

    if price != 15.2 { // 判斷回傳
      t.Fatal("price should be 15.2, but got", price)
    }

  }


同一個 func 的 大量 test 是可以有另外一種比較方便的寫法

可以把 測試名稱 參數 回傳值 變成一個 struct

然後放在 array 跑 for 迴圈 進行每一個測試

好處會是要增加一個 test case 只要添加進 array 就好

底下是根據我們上一篇的 func calculatePrice 的另一種測試 case 寫法


  func Test_calculatePrice(t *testing.T) {
    type args struct { // 參數 struct
      books []int
    }
    tests := []struct {
      name string // 測試名稱,會在有錯誤的時候顯示
      args args // 參數
      want float32 // 期待得到的回傳值
    }{
      {
        name: "One Book",
        args: args{books: []int{1}},
        want: 8,
      },
      {
        name: "two different book",
        args: args{books: []int{1, 2}},
        want: 2 * 8 * 0.95,
      },
    }
    for _, tt := range tests {
      t.Run(tt.name, func(t *testing.T) {
        if got := calculatePrice(tt.args.books); got != tt.want {
          t.Errorf("calculatePrice() should got %v, but got %v", tt.want, got)
        }
      })
    }
  }


打完收工