O introducere în testarea în Go
testarea este extrem de important în toate software-ul. Fiind capabil de a asigura thecorrectness de codul dvs. și să se asigure că orice modificări pe care le face nu sfârșesc prin a sparge nimic altceva în diferite părți ale codebase este extrem de important.
luându-vă timp pentru a testa în mod adecvat programele go, vă permiteți să vă dezvoltați mai repede, cu un sentiment mai mare de încredere că ceea ce dezvoltați va continua să funcționeze atunci când îl eliberați în producție.
obiective
până la sfârșitul acestui tutorial, veți avea o bună înțelegere a testării funcțiilor de bazăși a metodelor din Go folosind pachetul standard "testing"
.
veți avea experiență în scrierea testelor bazate pe masă și veți vedea, de asemeneacum să generați mai multe rezultate detaliate din testele dvs. folosind diferitele steaguri disponibile.
Tutorial Video
acest tutorial poate fi găsit în format video, dacă preferați:
Introducere
în acest tutorial vom analiza modul în care puteți dezvolta și rula teste pentrucodul dvs. go folosind comanda go test
.
Go Test Files
dacă ați văzut vreun proiect go înainte, este posibil să fi observat că majoritatea, dacă nu toate fișierele din proiect, prezintă un FILE_test.go
omolog în același director.
acesta nu este un accident. Acestea sunt fișierele care conțin toate testele unitare pentru proiect și testează tot codul în cadrul omologilor lor.
myproject/- calc.go- calc_test.go- main.go- main_test.go
un fișier de testare simplu
Imaginați-vă că am avut un program go foarte simplu, care a fost alcătuit dintr-un fișier și a prezentat o funcție calculate()
. Această funcție calculate()
ia pur și simplu în 1number și adaugă 2 la ea. Frumos și simplu pentru a ne ridica și să fie difuzate:
dacă am dori să testăm acest lucru, am putea crea un fișier main_test.go
în cadrul aceluiași director și să scriem următorul test:
package mainimport ( "testing")func TestCalculate(t *testing.T) { if Calculate(2) != 4 { t.Error("Expected 2 + 2 to equal 4") }}
rularea testelor noastre
acum că am creat primul nostru test go, este timpul să rulăm acest lucru și să vedem dacă codul nostru se comportă așa cum ne așteptăm. Putem executa testele noastre rulând:
$ go test
acest lucru ar trebui apoi să producă ceva similar cu următorul:
PASSok _/Users/elliot/Documents/Projects/tutorials/golang/go-testing-tutorial 0.007s
tabelul condus de testare
acum, că suntem fericiți că funcționează un calcul, ar trebui să ne uităm la improveconfidence prin adăugarea de câteva cazuri de testare suplimentare în codul nostru. Dacă vrem să construim treptat o serie de cazuri de testare care sunt întotdeauna testate, putem obține un array
de teste de genul:
aici declarăm o struct care conține atât o intrare, cât și valoarea așteptată. Apoi repetăm lista de teste cu apelul nostru for _, test := range tests
și verificăm dacă funcția noastră va returna întotdeauna rezultatele așteptate,indiferent de intrare.
când rulăm suita noastră de testare acum, ar trebui să vedem aceeași ieșire ca înainte:
PASSok _/Users/elliot/Documents/Projects/tutorials/golang/go-testing-tutorial 0.007s
ieșire test Verbose
uneori, ați putea dori pentru a vedea exact ce teste se execută și cât timp theyyto. Din fericire, acest lucru este disponibil dacă utilizați -v
pavilion atunci când rulează yourtests ca așa:
puteți vedea că atât testul nostru normal și testul nostru de masă a fugit și a trecut și tookless decât 0.00s
pentru a executa.
verificarea acoperirii testului
acoperirea testului este o valoare pe care am văzut-o abuzată uneori de companii. Aceste companii stabilesc obiective pentru toate sistemele lor, cum ar fi”baza de cod trebuie să fie acoperită de teste de cel puțin 75%”.
dar aceste tipuri de obiective pot duce la un comportament slab și echipe de dezvoltare „Jocuri”sistemul, în scopul de a încerca și a lovit aceste obiective. Am văzut oameni în unele echipepetrec zile scriind teste unitare care testează getters și setteri de bază în limbicum ar fi Java.
testarea este extrem de importantă, dar trebuie să fii pragmatic cu privire la modul în care îți testezi sistemele, astfel încât testele pe care le scrii să îți ofere cea mai mare valoare.
zilele petrecute scriind teste pentru a acoperi părți neimportante ale codebase-ului dvs. ar putea fi mai bine cheltuite scriind cazuri de testare în jurul logicii critice de afaceri capturate în sistemele dvs. și asigurându-vă că sunt acoperite mai multe cazuri de margine.
folosind steagul-cover
cu partea importantă din drum, să ne uităm la modul în care puteți verificacoperirea testului sistemului dvs. utilizând comanda go test
:
în același director ca și fișierele main.go
și main_test.go
, rulațiurmătoarele:
PASScoverage: 66.7% of statementsok github.com/TutorialEdge/an-intro-to-testing-in-go 0.006s
veți vedea că aveți 66.7%
din Codul Total Go acoperit de testcases.
vizualizarea acoperirii
în timp ce această valoare 66.7%
ne poate spune cât de mult din Codul nostru am testat,nu ne arată exact ce căi de cod avem sau nu am testat.
aici intră go test
și go tool cover
pentru a ne ajuta să rezolvăm această problemă.
putem folosi instrumentul go test
pentru a genera un coverprofile
care poate fi apoi convertit la o vizualizare HTML folosind comanda go tool cover
:
PASScoverage: 66.7% of statementsok github.com/TutorialEdge/an-intro-to-testing-in-go 0.008s
puteți lua apoi acest generat coverage.out
fișier și să-l utilizați pentru a genera o pagină HTML care arată exact ce linii au fost acoperite ca asa:
$ go tool cover -html=coverage.out
acest lucru se va deschide o pagină în browser-ul dvs. de alegere, care va arata un picceva de genul asta:
după cum puteți vedea, cea mai mare parte a codului din cadrul funcției noastre Calculate
este testarea și caracteristicile acoperirii Green
. În timp ce declarația de imprimare din funcția main
este Red
deoarece aceasta nu a fost acoperită de teste.
concluzie
sperăm că ați găsit acest tutorial util! Dacă aveți nevoie de asistență suplimentară thenplease nu ezitați să-mi spuneți în secțiunea de comentarii de mai jos.