Testarea infrastructurii ca și cod cu Pulumi. Partea 2

Salut tuturor. Astăzi împărtășim cu voi ultima parte a articolului «Testarea infrastructurii ca cod cu ajutorul Pulumi», traducerea căruia a fost pregătită special pentru studenții cursului „Practicile și instrumentele DevOps”.

Testarea infrastructurii ca și cod cu Pulumi. Partea 2

Testarea desfășurării

Stilul de testare discutat este o abordare puternică, care ne permite să facem testare de tip white-box pentru a verifica funcționarea internă a codului nostru infrastructural. Totuși, aceasta limitează ceva din ceea ce putem verifica. Testele sunt efectuate pe baza unui plan de desfășurare în memorie, creat de Pulumi înainte de desfășurarea efectivă, și prin urmare, desfășurarea în sine nu poate fi testată. În aceste cazuri, Pulumi dispune de un cadru de teste de integrare. Și aceste două abordări funcționează excelent împreună!

Cadrele de testare a integrării Pulumi sunt scrise în Go și cu ajutorul acestora testăm cea mai mare parte a codului nostru intern. Dacă abordarea testării modulare discutată anterior era mai asemănătoare cu testarea de tip white-box, testarea de integrare este un black-box. (Există, de asemenea, opțiuni pentru teste interne mai riguroase.) Acest cadru a fost creat pentru a lua o întreagă programă Pulumi și a efectua pentru ea diverse operații de ciclu de viață, cum ar fi desfășurarea unui nou stack de la zero, actualizarea acestuia cu variații și ștergerea, posibil de mai multe ori. Le rulăm regulat (de exemplu, noaptea) și ca teste de stres.

(Noi lucrăm la, astfel încât să existe capacități similare de testare a integrării în SDK-ul nativ al limbajelor. Puteți folosi cadrul de testare a integrării Go independent de limbajul în care este scrisă programa dumneavoastră Pulumi).

Rulând programa cu ajutorul acestui cadru, puteți verifica următoarele:

  • Codul proiectului dvs. este sintactic corect și funcționează fără erori.
  • Setările de configurație a stack-ului și a secretelor funcționează și sunt interpretate corect.
  • Proiectul dvs. poate fi desfășurat cu succes în furnizorul de cloud ales.
  • Proiectul dvs. poate fi actualizat cu succes de la starea inițială la alte N stări.
  • Proiectul dvs. poate fi distrus cu succes și eliminat din furnizorul de cloud.

Așa cum vom vedea în curând, acest cadru poate fi folosit și pentru validarea la timpul de execuție.

Test de integrare simplu

Pentru a vedea acest lucru în acțiune, ne vom uita la depozitul pulumi/examples, deoarece echipa și comunitatea Pulumi îl utilizează pentru a testa propriile solicitări de extragere, comiteri și compilări nocturne.

Mai jos este un test simplificat al exemplului nostru, care efectuează provisioning pentru un bucket S3 și alte obiecte:

example_test.go:

package test
 
import (
    "os"
    "path"
    "testing"
 
    "github.com/pulumi/pulumi/pkg/testing/integration"
)
 
func TestExamples(t *testing.T) {
    awsRegion := os.Getenv("AWS_REGION")
    if awsRegion == "" {
        awsRegion = "us-west-1"
    }
    cwd, _ := os.Getwd()
    integration.ProgramTest(t, &integration.ProgramTestOptions{
        Quick:       true,
        SkipRefresh: true,
        Dir:         path.Join(cwd, "..", "..", "aws-js-s3-folder"),
        Config: map[string]string{
            "aws:region": awsRegion,
        },
    })
}

Acest test parcurge ciclul de viață de bază al creării, modificării și distrugerii unui stivă pentru folderul aws-js-s3-folder. Va dura aproximativ un minut pentru a raporta testul trecut:

$ go test .
PASS
ok      ... 43.993s

Există multe opțiuni pentru a personaliza comportamentul acestor teste. Lista completă a opțiunilor este disponibilă în structura ProgramTestOptions. De exemplu, puteți configura endpoint-ul Jaeger pentru trasare (Tracing), care să indice că așteptați eșecul testului în cazul testării negative (ExpectFailure), aplica o serie de „corecții” asupra programului pentru tranziții de stare secvențiale (EditDirs) și multe altele. Haideți să vedem cum să le folosim pentru a verifica implementarea aplicației.

Verificarea proprietăților resurselor

Integrarea menționată anterior garantează că programul nostru „funcționează” — nu se prăbușește. Dar ce se întâmplă dacă dorim să verificăm proprietățile stivei obținute? De exemplu, dacă anumite tipuri de resurse au fost (sau nu au fost) pregătite și că acestea au anumite atribute.

Parametru ExtraRuntimeValidation pentru ProgramTestOptions ne permite să ne uităm la starea capturată de Pulumi după implementare (post-deployment state) pentru a putea efectua verificări suplimentare. Aceasta include o captură completă a stării stivei rezultate, inclusiv configurarea, valorile de ieșire exportate, toate resursele și valorile proprietăților acestora, precum și toate dependențele dintre resurse.

Pentru a vedea un exemplu de bază al acestuia, să verificăm că programul nostru creează un S3 Bucket:

  integration.ProgramTest(t, &integration.ProgramTestOptions{
        // ca la înainte...
        ExtraRuntimeValidation: func(t *testing.T, stack integration.RuntimeValidationStackInfo) {
            var foundBuckets int
            for _, res := range stack.Deployment.Resources {
                if res.Type == "aws:s3/bucket:Bucket" {
                    foundBuckets++
                }
            }
            assert.Equal(t, 1, foundBuckets, "Se aștepta să găsim un singur bucket AWS S3")
        },
    })

Acum, când vom rula go test, nu numai că va trece printr-o serie de teste ale ciclului de viață, dar, de asemenea, după desfășurarea cu succes a stivei, va efectua o verificare suplimentară a stării rezultate.

Teste de rulare

Până acum, toate testele s-au concentrat exclusiv pe comportamentul desfășurării și modelul de resurse Pulumi. Ce ar trebui să facem dacă dorim să verificăm că infrastructura noastră pregătită funcționează de fapt? De exemplu, că mașina virtuală este activă, bucket-ul S3 conține ceea ce ne așteptăm și așa mai departe.

Probabil că ați ghicit deja cum să faceți acest lucru: opțiunea ExtraRuntimeValidation pentru ProgramTestOptions — este o oportunitate excelentă pentru asta. În această etapă, rulați un test Go arbitrar având acces la întreaga stare a resurselor programului dvs. Această stare include informații precum adresele IP ale mașinilor virtuale, URL-urile și tot ce este necesar pentru interacțiunea reală cu aplicațiile și infrastructura cloud obținute.

De exemplu, programul nostru de testare exportă proprietatea webEndpoint a bucket-ului numit websiteUrl, care reprezintă URL-ul complet prin care putem accesa documentul indexat . Deși am putea răsfoi fișierul de stare pentru a găsiși a citi această proprietate direct, în multe cazuri stivele noastre exportă proprietăți utile, cum ar fi aceasta, pe care le putem utiliza pentru verificare: bucket integration.ProgramTest(t, &integration.ProgramTestOptions{ // ca la înainte ... ExtraRuntimeValidation: func(t *testing.T, stack integration.RuntimeValidationStackInfo) { url := "http://" + stack.Outputs["websiteUrl"].(string) resp, err := http.Get(url) if !assert.NoError(t, err) { return } if !assert.Equal(t, 200, resp.StatusCode) { return } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if !assert.NoError(t, err) { return } assert.Contains(t, string(body), "Hello, Pulumi!") }, })

Așa cum au fost și verificările noastre anterioare de rulare, această verificare va fi efectuată imediat după ridicarea stivei și totul în răspuns la un apel simplu

go test merge teste. Și aceasta este doar vârful aisbergului - sunt disponibile toate funcțiile de testare Go pe care le puteți scrie în cod.

Integrarea continuă a infrastructurii

Este bine să poți rula teste pe laptop atunci când sunt multe modificări în infrastructură, pentru a le verifica înainte de a fi trimise pentru revizuirea codului. Dar noi și mulți dintre clienții noștri testăm infrastructura în diverse etape ale ciclului de dezvoltare:

  • În fiecare solicitare de extragere deschisă pentru a testa înainte de fuziune.
  • În răspuns la fiecare commit, pentru a verifica din nou că fuziunea a fost realizată corect.
  • Periodic, de exemplu, noaptea sau săptămânal pentru teste suplimentare.
  • În cadrul testării de performanță sau stres, care sunt de obicei realizate pe o perioadă îndelungată și rulează teste în paralel și/sau desfășoară aceeași aplicație de mai multe ori.

Pentru fiecare dintre acestea, Pulumi suportă integrarea cu sistemul dvs. preferat de integrare continuă. Cu integrarea continuă, aveți acoperire de testare pentru infrastructura dvs. la fel ca pentru software-ul aplicației.

Pulumi are suport pentru sistemele CI populare. Iată câteva dintre ele:

Pentru informații mai detaliate, consultați documentația despre Continuous Delivery.

Mediile efemeride

O caracteristică foarte puternică care devine disponibilă este posibilitatea de a desfășura medii efemeride exclusiv pentru teste de acceptare. Conceptul al proiectelor și stivelor Pulumi este conceput astfel încât să desfășoare și să dezafecteze medii complet izolate și independente, totul cu câteva comenzi CLI simple sau cu ajutorul unui cadru de testare de integrare.

Dacă utilizați GitHub, Pulumi oferă aplicația GitHub, care vă va ajuta să conectați testarea de acceptare cu solicitările de extragere din interiorul pipeline-ului dvs. CI. Pur și simplu instalați aplicația în repository-ul GitHub, iar Pulumi în CI-ul dvs. și informații despre previzualizarea infrastructurii, actualizări și rezultate ale testelor vor fi adăugate în solicitările de extragere:

Testarea infrastructurii ca și cod cu Pulumi. Partea 2

Utilizând Pulumi pentru testele de acceptanță, veți avea noi oportunități de automatizare care vor îmbunătăți performanța echipei și vor oferi încredere în calitatea modificărilor.

Rezultatul

În acest articol, am văzut că, utilizând limbaje de programare de uz general, avem la dispoziție multe metode de dezvoltare a software-ului care au fost utile în dezvoltarea aplicațiilor noastre. Acestea includ testarea modulară, testarea de integrare, precum și interacțiunea lor pentru a efectua teste extinse în timpul rulării. Testele pot fi ușor inițiate la cerere sau în sistemul dvs. CI.

Pulumi — software cu sursă deschisă, este gratuit de utilizat și funcționează cu limbajele și serviciile cloud preferate — încercați-l astăzi!

→ Partea întâi

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster