測試又是一個大坑 我們這邊只講大概的概念 網路上有很多大大對 Unit Testing 有更詳細的介紹
那為甚麼我們需要測試ㄋ,在大多時候( 寫OJ、寫學校派的程式回家作業)你會在寫完的時候測試自己的程式是不是出輸出正確且符合要求,當然沒有否定這種測試方法,工人智慧到現今都還是有效的方法。但假如你今天替你的 Code 增加了一些功能,不管有沒有跟以前的 function 有所牽扯,你能保證你新的 Code 不會對整體造成影響嗎?
單元測試就是幫我們完成這些事情,在檢查新的程式的時候,同時也確保整體不會受到影響,能夠正常的運作
要創檔案的時候記得要幫新檔案增加 _test.go
的結尾 這樣在使用 go test
的時候 他才會知道說這個檔案包含 test function
資料夾長相
Project/
├── modules_example/
│ ├──go.mod
│ ├──greeting_test.go --- 放 unit test 的地方
│ └──greeting.go
└── call_module/
├──go.mod
└──main.go
greeting_test.go
增加下面這一些東西
package greeting
import (
"regexp"
"testing"
)
// TestGreetName 會呼叫 greet.go 確認輸入字串後是不是會和預期輸入相同
func TestGreetName(t *testing.T) {
name := "Iron man"
want := regexp.MustCompile(`\b` + name + `\b`) //MustCompile會幫你後面的字串 compile 成正則表達式
msg, err := Greet("Iron man")
if !want.MatchString(msg) || err != nil {
t.Fatalf(`Greet("Iron man") = %q, %v, want match for %#q, nil`, msg, err, want)
}
}
// TestGreetEmpty 會呼叫 greet.go 確認輸入空白後是不是真的會返回錯誤
func TestGreetEmpty(t *testing.T) {
msg, err := Greet("")
if msg != "" || err == nil {
t.Fatalf(`Greet("") = %q, %v, want "", error`, msg, err)
}
}
TestName
,而Name
可以替換成我們想要測試function的名稱(在範例中 我把 Name 替換成了 GreetName)testing package
的指標參數 t ,它是用來回報和紀錄你的Unit testing 結果的接著我們試試測試吧
在CMD輸入 go test
go test
-v
的參數我今天把傳入的參數改為Bronze man ,但我預期中會出現Iron man
的字串,明顯不符合,那這樣 Unit testing 會產生錯誤 告訴你說 這不是你所設定的預期解
這樣 有沒有對 Testing 有了一丁點的認識R