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.

exemplu de structură a proiectului
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:

principal.mergeți

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:

main_test.du-te
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:

$ go test
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:

$ du-te de testare
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:

$ go test-v

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:

$ go test-cover
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:

$ go test-coverprofile=acoperire.out
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.