Testarea Codului Intensiv de Date cu Go, Partea 4

Prezentare generală

Aceasta este o parte din patru din cinci într-o serie de tutoriale cu privire la testarea codului intensiv de date cu Go. În partea a treia, am acoperit testarea împotriva unui strat local complex de date care include o DB relațională și o cache Redis.

În acest tutorial, voi trece peste testarea împotriva stocărilor de date la distanță utilizând baze de date comune de testare, folosind instantanee de date de producție și generând propriile date de testare.

Testarea împotriva stocărilor de date la distanță

Până acum, toate testele noastre au fost efectuate la nivel local. Uneori, nu este suficient. Este posibil să aveți nevoie să testați datele care sunt greu de generat sau obținute pe plan local. Datele de testare pot fi foarte mari sau se pot schimba frecvent (de exemplu, instantaneu de date de producție).

În aceste cazuri, poate fi prea lent și costisitor pentru fiecare dezvoltator să copieze cele mai recente date de testare pe mașina lor. Uneori, datele de testare sunt sensibile, iar dezvoltatorii speciali de la distanță nu ar trebui să o aibă pe laptopul lor.

Există mai multe opțiuni aici pentru a lua în considerare. Puteți utiliza una sau mai multe dintre aceste opțiuni în situații diferite.

Baze de date bazate pe teste comune

Aceasta este o opțiune foarte comună. Există o bază de date comună de testare pe care toți dezvoltatorii o pot conecta și pot testa. Acest DB de testare comun este gestionat ca o resursă partajată și adesea este populat periodic cu unele date de bază și apoi dezvoltatorii pot rula teste împotriva ei care interoghează datele existente. De asemenea, pot crea, actualiza și șterge propriile date de testare.

În acest caz, aveți nevoie de multă disciplină și de un proces bun. Dacă doi dezvoltatori execută același test în același timp, care creează și șterge aceleași obiecte, ambele teste vor eșua. Rețineți că, chiar dacă sunteți singurul dezvoltator și unul dintre testele dvs. nu curăță după sine în mod corespunzător, testul următor ar putea să nu reușească deoarece DB acum are unele date suplimentare de la testul anterior care poate rupe testul curent. 

Executarea testelor de la distanță

Acesta este modul în care funcționează conductele CI / CD sau chiar sistemele automate de construcție. Un dezvoltator comite o schimbare și începe o execuție automată și o testare automată. Dar, de asemenea, vă puteți conecta la o mașină la distanță care are codul dvs. și puteți executa testele dvs. acolo.

Beneficiul este că puteți replica configurația locală exactă, dar aveți acces la date care sunt deja disponibile în mediul la distanță. Dezavantajul este că nu puteți utiliza instrumentele dvs. preferate pentru depanare.

Procesul de testare la distanță ad-hoc

Lansarea unei instanțe de testare ad-hoc la distanță vă asigură că sunteți încă izolat de alți dezvoltatori. Este destul de similar conceptual pentru a rula o instanță locală. Totuși, trebuie să lansați magazinul de date (sau magazinele). Încă mai trebuie să le populați (de la distanță). Cu toate acestea, codul dvs. de testare rulează pe plan local și puteți depana și depana folosind IDE preferat (Gogland în cazul meu). Poate fi dificil să se gestioneze din punct de vedere operațional dacă dezvoltatorii păstrează instanțele de test care rulează după terminarea testelor.

Folosind instantanee de date de producție

Când se utilizează un spațiu de stocare a datelor de testare partajate, este adesea populat cu instantanee de date de producție. În funcție de cât de sensibile și critice sunt datele, unele dintre următoarele argumente pro și contra pot fi relevante.

Pro și contra utilizării datelor de producție pentru testare

Pro:

  • Testați datele reale. Dacă funcționează, ești bun.
  • Puteți încărca și datele de testare a performanțelor care reprezintă o încărcare reală.
  • Nu este nevoie să scrieți generatori de date care să încerce să simuleze date reale de producție.

Contra:

  • Este posibil să nu fie ușor să testați condițiile de eroare.
  • Datele de producție ar putea fi sensibile și necesită tratament special.
  • Trebuie să scrieți un cod sau să sincronizați manual imaginea dvs. periodic.
  • Trebuie să rezolvați modificările de format sau de schemă.
  • Poate fi dificil să se izoleze problemele care apar cu date de producție dezordonate.

Anonimizarea datelor de producție

O.K. Ați făcut saltul și ați decis să utilizați un instantaneu de date despre producție. Dacă datele dvs. implică oameni în orice formă sau formă, este posibil să fie necesar să anonimizați datele. Acest lucru este surprinzător de dificil.

Nu puteți să înlocuiți toate numele și să faceți acest lucru. Există multe modalități de a recupera informațiile de identificare personală (PII) și PHI (informații de sănătate protejate) din instantanee anonime de date anonime. Consultați Wikipedia ca punct de plecare dacă sunteți curios.

Lucrez pentru Helix unde dezvoltăm o platformă genomică personală care se ocupă de cele mai private date - ADN-ul secvențiat al oamenilor. Avem unele garanții grave împotriva încălcărilor accidentale (și dăunătoare) ale datelor.

Actualizarea testelor și a instantaneelor ​​de date

Când utilizați instantanee de date de producție, va trebui să actualizați periodic instantaneu instantaneele și, în consecință, testele. Momentul este de până la tine, dar cu siguranță o faci ori de câte ori există o schimbare de schemă sau format. 

În mod ideal, testele dvs. nu trebuie să testeze proprietățile unui instantaneu anume. De exemplu, dacă actualizați snapshot-urile zilnic și aveți un test care verifică numărul de înregistrări din instantaneu, atunci va trebui să actualizați acest test în fiecare zi. Este mult mai bine să vă scrieți testele într-un mod mai generic, deci trebuie să le actualizați numai când se schimbă codul testat. 

Generarea datelor de testare

O altă abordare este generarea propriilor date de testare. Avantajele și dezavantajele sunt exact opuși ai folosirii instantaneelor ​​de date de producție. Rețineți că puteți să combinați cele două abordări și să efectuați câteva teste pe instantaneele de date de producție și pe alte teste utilizând datele generate.

Generarea de date de încercare aleatorii

Cum v-ați genera datele de testare? Puteți sărați și utilizați date aleatoare total. De exemplu, pentru Songify putem genera șiruri aleatoare complet pentru email-ul utilizatorului, URL-ul, descrierea și etichetele. Rezultatul va fi unul haotic, dar valabil, deoarece Songify nu face nici o validare a datelor.

Aici este o funcție simplă pentru generarea de șiruri aleatorii:

func makeRandomString (lungime int) șir const bytes = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" randBytes: = face ([] byte, lungime) pentru i: = 0; eu < length; i++  b := bytes[rand.Intn(len(bytes))] randBytes[i] = b  return string(randBytes) 

Să scriem o funcție care adaugă cinci utilizatori aleatorii și apoi adaugă 100 de melodii aleatoare distribuite aleatoriu între cei cinci utilizatori. Trebuie să generăm utilizatori, deoarece melodiile nu trăiesc în vid. Fiecare melodie este asociată întotdeauna cu cel puțin un utilizator.

func (m * InMemoryDataLayer) PopulateWithRandomData () users: = [] Utilizator  // Creați 5 utilizatori pentru i: = 0; eu < 5; i++  name := makeRandomString(15) u := User Email: name + "@" + makeRandomString(12) + ".com", Name: makeRandomString(17),  m.CreateUser(u) users = append(users, u)  // Create 100 songs and associate randomly with // one of the 5 users for i := 0; i < 100; i++  user := users[rand.Intn(len(users))] song := Song Url: fmt.Sprintf("http://www.%s.com", makeRandomString(13)), Name: makeRandomString(16),  m.AddSong(user, song, []Label)   

Acum, putem scrie câteva teste care folosesc o mulțime de date. De exemplu, aici este un test care verifică faptul că putem primi toate cele 100 de melodii într-un singur apel. Rețineți că testul solicită PopulateWithRandomData () înainte de a efectua apelul. 

funcția TestGetSongs (t * test.T) dl, err: = NewInMemoryDataLayer () dacă err! = nil t.Error ("Eroare la crearea memoriei în memorie") dl.PopulateWithRandomData dl.GetSongs () dacă err! = nil t.Error ("Nu a reușit să creeze un strat de date în memorie") dacă len (melodii)! = 100 t.Error numărul de melodii " 

Generarea de date bazate pe reguli

De obicei, datele complet aleatorii nu sunt acceptabile. Fiecare magazin de date are constrângeri pe care trebuie să-i respectați și relațiile complexe care trebuie respectate pentru a crea date valide pe care sistemul poate să le funcționeze. Poate doriți să generați și date nevalide pentru a testa modul în care sistemul se ocupă, dar acestea vor fi erorile specifice pe care le veți injecta.

Abordarea va fi similară generării de date aleatorii, cu excepția faptului că veți avea mai multă logică pentru a impune respectarea regulilor. 

De exemplu, să presupunem că vrem să impunem regula că un utilizator poate avea cel mult 30 de melodii. În loc să creeze aleatoriu 100 de melodii și să le alocăm utilizatorilor, putem decide că fiecare utilizator va avea exact 20 de melodii sau poate crea un singur utilizator fără melodii și alți patru utilizatori cu câte 25 de melodii. 

Generarea de date de test bazate pe narațiuni

În unele cazuri, generarea de date de testare este foarte complicată. Recent am lucrat la un proiect care a trebuit să injecteze datele de testare către patru micro-servicii diferite, fiecare gestionând propria sa bază de date cu datele din fiecare bază de date referitoare la datele din alte baze de date. A fost destul de dificilă și de muncă intensivă pentru a păstra totul în sincronizare.

De obicei, în astfel de situații, este mai ușor să utilizați API-urile de sistem și instrumentele existente care creează date în loc să intrați direct în mai multe magazine de date și rugându-vă să nu rupeți țesătura universului. Nu am putut să luăm această abordare deoarece am avut de fapt nevoie să creăm în mod intenționat date nevalide în mod intenționat pentru a testa diverse condiții de eroare și pentru a ignora anumite efecte secundare legate de sistemele externe care se întâmplă în timpul fluxului normal de lucru. 

Concluzie

În acest tutorial, am acoperit testarea împotriva stocărilor de date la distanță, utilizând baze de date comune de testare, utilizând instantanee de date de producție și generând propriile date de testare.

În partea a cincea, ne vom concentra pe testarea fuzz, testarea cache-ului, testarea integrității datelor, testarea idempotency și lipsa datelor. Rămâneți aproape.

Cod