先使用最少的代碼來(lái)讓失敗的測(cè)試先跑起來(lái)
編寫測(cè)試
編寫測(cè)試和寫函數(shù)很類似,其中有一些規(guī)則
它需要在一個(gè)名為
xxx_test.go的文件中編寫測(cè)試函數(shù)的命名必須從單詞
Test開(kāi)始測(cè)試函數(shù)只接受一個(gè)參數(shù)
t *testing.T
現(xiàn)在這些信息足以讓我們明白,類型為 *testing.T 的變量 t 是你在測(cè)試框架中的 "hook"(鉤子),所以你可以在想要失敗時(shí)執(zhí)行 t.Fail() 之類的操作。
Go 文檔
Go 的另一個(gè)高質(zhì)量特征是文檔化。通過(guò)運(yùn)行 godoc -http:8000,可以在本地啟動(dòng)文檔。如果你訪問(wèn) localhost:8000/pkg,你將看到系統(tǒng)上安裝的所有包。
大多數(shù)標(biāo)準(zhǔn)庫(kù)都有優(yōu)秀的文檔和示例。瀏覽 http://localhost:8000/pkg/testing/ 是非常值得的,去看一下你有什么可以用的。
編寫測(cè)試
用參數(shù)和返回類型聲明函數(shù)
if,else,switch聲明變量和常量
編寫一個(gè)失敗的測(cè)試,并查看失敗信息,可以看到我們已經(jīng)為需求寫了一個(gè) 相關(guān) 的測(cè)試,并且看到它產(chǎn)生了一個(gè) 易于理解的失敗描述
編寫最少量的代碼以使其通過(guò),因此我們知道我們有可工作軟件
然后 重構(gòu),支持我們測(cè)試的安全性,以確保我們擁有易于使用的精心制作的代碼
在我們的例子中,我們通過(guò)小巧易懂的步驟從 Hello() 到 Hello("name"),到 Hello("name", "french")。
與"現(xiàn)實(shí)世界"軟件相比,這當(dāng)然是微不足道的,但原則依然成立。TDD 是一門需要通過(guò)開(kāi)發(fā)去實(shí)踐的技能,但通過(guò)將問(wèn)題分解成更小的可測(cè)試的組件,編寫軟件的時(shí)間將更加輕松。
package main
import "fmt"
const spanish = "Spanish"
const french = "French"
const englishPrefix = "Hello, "
const spanishHelloPrefix = "Hola, "
const frenchHelloPrefix = "Bonjour, "
func Hello(name string, language string) string {
if name == "" {
name = "World"
}
return greetingPrefix(language) + name
}
func greetingPrefix(language string) (prefix string) {
switch language {
case french:
prefix = frenchHelloPrefix
case spanish:
prefix = spanishHelloPrefix
default:
prefix = englishPrefix
}
return
}
func main() {
fmt.Println(Hello("world", ""))
}
package main
import "testing"
func TestHello(t *testing.T) {
assertCorrectMessage := func(t *testing.T, got, want string) {
t.Helper()//t.Helper() 需要告訴測(cè)試套件這個(gè)方法是輔助函數(shù)(helper)。通過(guò)這樣做,當(dāng)測(cè)試失敗時(shí)所報(bào)告的行號(hào)將在函數(shù)調(diào)用中而不是在輔助函數(shù)內(nèi)部
if got != want {
t.Errorf("got '%s' want '%s'", got, want)
}
}
/*
在這里,我們將在我們的測(cè)試庫(kù)中引入另一個(gè)工具 —— 子測(cè)試。有時(shí),對(duì)一個(gè) "事情" 進(jìn)行分組測(cè)試是很有用的,然后進(jìn)行描述不同場(chǎng)景的子測(cè)試。
這種方法的好處是,你可以設(shè)置在其他測(cè)試中也能夠使用的共享代碼。
當(dāng)我們檢查信息是否符合預(yù)期時(shí),會(huì)有重復(fù)的代碼。
*/
t.Run("to a person", func(t *testing.T) {
got := Hello("Chris", "")
want := "Hello, Chris"
assertCorrectMessage(t, got, want)
})
t.Run("empty string", func(t *testing.T) {
got := Hello("", "")
want := "Hello, World"
assertCorrectMessage(t, got, want)
})
t.Run("in Spanish", func(t *testing.T) {
got := Hello("Elodie", spanish)
want := "Hola, Elodie"
assertCorrectMessage(t, got, want)
})
t.Run("in French", func(t *testing.T) {
got := Hello("Lauren", french)
want := "Bonjour, Lauren"
assertCorrectMessage(t, got, want)
})
}
作者:Chris James 譯者:Donng 校對(duì):polaris1119,pityonline?