2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Go-kielellä yksikkötestaus toteutetaan vakiokirjaston testauspaketin kautta, joka tarjoaa joukon toimintoja, jotka tekevät yksikkötestien kirjoittamisesta, suorittamisesta ja hallinnasta yksinkertaista ja tehokasta.
Testaa tiedostojen nimeämissääntöjä
Go:n testitiedoston nimeämissääntö on lisätä_test.go
.Esimerkiksi, jos sinulla on acalculator.go
tiedosto, vastaavan testitiedoston tulee ollacalculator_test.go
。
Testifunktioiden nimeämissäännöt
Testitoiminnon tulee alkaaTest
alkaa, ja sitä voi seurata esimerkiksi mikä tahansa ei-tyhjä merkkijonoTestAdd
、TestSubtract
odota.
käyttää testing.T
Tee väitteitä ja raportoi virheistä
Käytä testitoiminnossatesting.T
Kirjoita parametrit testin tilan ja tulosteen hallitsemiseksi.voit käyttäät.Error*
、t.Fail*
ja muut menetelmät testin epäonnistumisen osoittamiseksi ja asiaankuuluvien virhetietojen tulostamiseksi.
Laskintoiminto on määritelty laskinpaketissa, ja sen erityinen toteutus on seuraava:
package calculator
func Add(a, b int) int {
return a + b
}
Luomme nykyiseen hakemistoon testitiedoston calculator_test.go ja määritämme testifunktion seuraavasti:
package calculator
import "testing"
func TestAdd(t *testing.T) {
result := Add(1, 2)
expected := 3
if result != expected {
t.Errorf("Add(1,2) return %d, expected %d", result, expected)
}
}
Suorita tämä yksikkötesti käyttämällä go test -komentoa.Kirjoita komentoriville hakemisto, joka sisältää calculator.go ja calculator_test.go, ja suorita sittengo test
, nämä tulokset ovat seuraavat
go test
PASS
ok modu 0.226s
Lisää seuraava testifunktio tiedostoon calculator_test.go:
func TestAdd2(t *testing.T) {
result := Add(3, 2)
expected := 3
if result != expected {
t.Errorf("Add(1,2) return %d, expected %d", result, expected)
}
}
Voimme nähdä paremmin kunkin testitapauksen suorituksen tulostuloksissago test -v
parametreja, jotta se tuottaa täydelliset testitulokset.
go test -v
=== RUN TestAdd
--- PASS: TestAdd (0.00s)
=== RUN TestAdd2
calculator_test.go:17: Add(1,2) return 5, expected 3
--- FAIL: TestAdd2 (0.00s)
FAIL
exit status 1
FAIL modu 0.216s
go test -run
Komento voi suorittaa testejä määritetyn tilan mukaan. Tämä komento tukee säännöllisiä lausekkeita suoritettavien testifunktioiden valitsemiseksi.
Esimerkiksi TestAdd2-käyttötapauksen korjaamisen jälkeen hyväksygo tes -run=Add2
Suorita vain TestAdd2-testitapaus, tulos on
go test -run=Add2 -v
=== RUN TestAdd2
--- PASS: TestAdd2 (0.00s)
PASS
ok modu 0.198s
4. Ohita joitain testitapauksia
Lisää uusi testitoiminto
func TestAdd3(t *testing.T) {
if testing.Short() {
t.Skip("short模式下会跳过该测试用例")
}
result := Add(3, 2)
expected := 5
if result != expected {
t.Errorf("Add(1,2) return %d, expected %d", result, expected)
}
}
suoritettaessago test -shor
Kun t, se ohitetaantesting.Short()
Merkitty testitapaus, tulos on
go test -short -v
=== RUN TestAdd
--- PASS: TestAdd (0.00s)
=== RUN TestAdd2
--- PASS: TestAdd2 (0.00s)
=== RUN TestAdd3
calculator_test.go:23: short模式下会跳过该测试用例
--- SKIP: TestAdd3 (0.00s)
PASS
ok modu 0.635s
Testiryhmien ja osatestien avulla voit lisätä testitapauksia ja tarkastella tuloksia ystävällisemmin
func TestAdd(t *testing.T) {
tests := []struct {
name string
x, y int
expected int
}{
{"Add1", 1, 2, 3},
{"Add2", 3, 3, 6},
{"Add3", 4, 5, 8},
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
result := Add(tc.x, tc.y)
if result != tc.expected {
t.Errorf("Add(%d, %d) returned %d, expected %d", tc.x, tc.y, result, tc.expected)
}
})
}
}
juostago test -v
,osoittautua
go test -v
=== RUN TestAdd
=== RUN TestAdd/Add2
=== RUN TestAdd/Add3
calculator_test.go:51: Add(4, 5) returned 9, expected 8
--- FAIL: TestAdd (0.00s)
--- PASS: TestAdd/Add1 (0.00s)
--- PASS: TestAdd/Add2 (0.00s)
--- FAIL: TestAdd/Add3 (0.00s)
FAIL
exit status 1
FAIL modu 0.190s
Go-kieli tukee luonnostaan samanaikaisuutta, joten lisäämällät.Parallel()
Kuljettajien testien rinnakkaisuuden saavuttamiseksi.
func TestAdd(t *testing.T) {
t.Parallel() // 将 TLog 标记为能够与其他测试并行运行
// 这里使用匿名结构体定义了若干个测试用例
// 并且为每个测试用例设置了一个名称
tests := []struct {
name string
x, y int
expected int
}{
{"Add1", 1, 2, 3},
{"Add2", 3, 3, 6},
{"Add3", 4, 5, 8},
}
for _, tc := range tests {
tc := tc // 注意这里重新声明tt变量(避免多个goroutine中使用了相同的变量)
t.Run(tc.name, func(t *testing.T) {
t.Parallel() // 将每个测试用例标记为能够彼此并行运行
result := Add(tc.x, tc.y)
if result != tc.expected {
t.Errorf("Add(%d, %d) returned %d, expected %d", tc.x, tc.y, result, tc.expected)
}
})
}
}
käyttäägo test -cover
nähdäksesi testin kattavuuden
go test -cover
PASS
modu coverage: 100.0% of statements
ok modu 1.149s
Kun suoritamme yksikkötestauksen Go-kielellä, koska virallista vahvistustoimintoa ei ole sisäänrakennettu, joudumme yleensä käyttämään suurta määrääif...else...
lausunto testitulosten tarkistamiseksi.Kuitenkin käyttämällä kolmannen osapuolen kirjastoja, kutentestify/assert
, voimme helposti kutsua useita yleisesti käytettyjä väitefunktioita, jotka eivät vain yksinkertaista testikoodia, vaan myös luovat selkeät ja helposti ymmärrettävät virheen kuvaustiedot, jotka auttavat meitä löytämään ongelman nopeasti.
Yllä olevassa esimerkissä käytämmeif...else...
Lausunto testitulosten tarkistamiseksi
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
result := Add(tc.x, tc.y)
if result != tc.expected {
t.Errorf("Add(%d, %d) returned %d, expected %d", tc.x, tc.y, result, tc.expected)
}
})
}
Saatavilla nyttestify/assert
Yllä oleva tuomioprosessi on yksinkertaistettu seuraavasti:
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
result := Add(tc.x, tc.y)
assert.Equal(t, result, tc.expected)
})
}
testify/require
omistaatestify/assert
Kaikki väitefunktiot, ainoa ero niiden välillä ontestify/require
Jos testitapaus epäonnistuu, testi keskeytetään välittömästi.