Testarea infrastructurii ca cod cu Pulumi. Partea 2

Salutare tuturor. Astăzi împărtășim cu voi ultima parte a articolului. „Testarea infrastructurii ca cod cu Pulumi”, a cărei traducere a fost pregătită special pentru cursanții „Practici și instrumente DevOps”.

Testarea infrastructurii ca cod cu Pulumi. Partea 2

Testare de implementare

Acest stil de testare este o abordare puternică și ne permite să efectuăm testarea cutiei albe pentru a testa funcționarea internă a codului nostru de infrastructură. Cu toate acestea, limitează oarecum ceea ce putem testa. Testele sunt efectuate pe baza planului de implementare în memorie creat de Pulumi înainte de implementarea efectivă și, prin urmare, implementarea în sine nu poate fi testată. Pentru astfel de cazuri, Pulumi are un cadru de testare de integrare. Și aceste două abordări funcționează grozav împreună!

Cadrul de testare a integrării Pulumi este scris în Go, care este modul în care testăm majoritatea codului nostru intern. În timp ce abordarea de testare unitară discutată anterior a fost mai mult ca testarea cutiei albe, testarea integrării este o cutie neagră. (Există, de asemenea, opțiuni pentru testarea riguroasă internă.) Acest cadru a fost creat pentru a prelua un program Pulumi complet și pentru a efectua diverse operațiuni ciclului de viață pe acesta, cum ar fi implementarea unui nou stivă de la zero, actualizarea acestuia cu variații și ștergerea acestuia, eventual de mai multe ori . Le rulăm în mod regulat (de exemplu, noaptea) și ca teste de stres.

(Noi lucrăm la asta, astfel încât capabilități similare de testare a integrării să fie disponibile în SDK-ul nativ al limbilor. Puteți utiliza cadrul de testare a integrării Go, indiferent de limba în care este scris programul dvs. Pulumi).

Prin rularea programului folosind acest cadru puteți verifica următoarele:

  • Codul proiectului este corect din punct de vedere sintactic și rulează fără erori.
  • Setările de configurare a stivei și a secretelor funcționează și sunt interpretate corect.
  • Proiectul dvs. poate fi implementat cu succes în furnizorul de cloud ales de dvs.
  • Proiectul dumneavoastră poate fi actualizat cu succes de la starea inițială la N alte stări.
  • Proiectul dvs. poate fi distrus și eliminat cu succes de la furnizorul dvs. de cloud.

După cum vom vedea în curând, acest cadru poate fi folosit și pentru a efectua validarea timpului de execuție.

Test de integrare simplu

Pentru a vedea acest lucru în acțiune, ne vom uita la depozit pulumi/examples, deoarece echipa noastră și comunitatea Pulumi îl folosesc pentru a testa propriile noastre solicitări de extragere, comiteri și versiuni de noapte.

Mai jos este un test simplificat al nostru exemplu care oferă găleată S3 și alte câteva 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 trece prin ciclul de viață de bază al creării, modificării și distrugerii unei stive pentru un folder aws-js-s3-folder. Va dura aproximativ un minut pentru a raporta un test promovat:

$ go test .
PASS
ok      ... 43.993s

Există multe opțiuni pentru a personaliza comportamentul acestor teste. Vedeți lista completă de opțiuni. în structură ProgramTestOptions. De exemplu, puteți configura punctul final Jaeger pentru a urmări (Tracing), indicați că vă așteptați ca testul să eșueze dacă testul este negativ (ExpectFailure), aplicați o serie de „editări” programului pentru o tranziție secvențială a stărilor (EditDirs) și mult mai mult. Să vedem cum să le folosim pentru a testa implementarea aplicației.

Verificarea proprietăților resurselor

Integrarea discutată mai sus asigură că programul nostru „funcționează” – nu se blochează. Dar dacă vrem să verificăm proprietățile stivei rezultate? De exemplu, că anumite tipuri de resurse au fost (sau nu) au fost furnizate și că au anumite atribute.

Parametru ExtraRuntimeValidation pentru ProgramTestOptions ne permite să analizăm starea post-desfășurare înregistrată de Pulumi, astfel încât să putem face verificări suplimentare. Aceasta include un instantaneu complet al stării stivei rezultate, inclusiv configurația, valorile de ieșire exportate, toate resursele și valorile proprietăților acestora și toate dependențele dintre resurse.

Pentru a vedea un exemplu de bază în acest sens, să verificăm dacă programul nostru creează unul Găleată S3:

  integration.ProgramTest(t, &integration.ProgramTestOptions{
        // as before...
        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, "Expected to find a single AWS S3 Bucket")
        },
    })

Acum, când rulăm go test, nu numai că va trece printr-o baterie de teste de ciclu de viață, ci și, după implementarea cu succes a stivei, va efectua o verificare suplimentară a stării rezultate.

Teste de rulare

Până acum, toate testele au vizat exclusiv comportamentul de implementare și modelul de resurse Pulumi. Ce se întâmplă dacă doriți să verificați dacă infrastructura furnizată funcționează cu adevărat? De exemplu, că mașina virtuală rulează, găleata S3 conține ceea ce ne așteptăm și așa mai departe.

Este posibil să fi ghicit deja cum să faci asta: opțiunea ExtraRuntimeValidation pentru ProgramTestOptions - aceasta este o mare oportunitate pentru asta. În acest moment, executați un test Go personalizat cu acces la starea completă a resurselor programului dvs. Această stare include informații precum adresele IP ale mașinii virtuale, adresele URL și tot ceea ce este necesar pentru a interacționa efectiv cu aplicațiile și infrastructura cloud rezultate.

De exemplu, programul nostru de testare exportă proprietatea webEndpoint găleată numită websiteUrl, care este adresa URL completă de unde putem obține configurația index document. Deși am putea săpa în dosarul de stat pentru a găsi bucket și citiți acea proprietate direct, dar în multe cazuri stivele noastre exportă proprietăți utile, cum ar fi aceasta, pe care le considerăm convenabile de utilizat pentru verificare:

integration.ProgramTest(t, &integration.ProgramTestOptions{
            // as before ...
        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!")
        },
    })

Ca și verificările noastre anterioare de rulare, această verificare va fi executată imediat după ridicarea stivei, totul ca răspuns la un simplu apel go test. Și acesta este doar vârful aisbergului – fiecare funcție de testare Go pe care o puteți scrie în cod este disponibilă.

Integrarea continuă a infrastructurii

Este bine să poți rula teste pe un laptop atunci când se fac multe modificări de infrastructură pentru a le testa înainte de a le trimite pentru revizuirea codului. Dar noi și mulți dintre clienții noștri testăm infrastructura în diferite etape ale ciclului de viață al dezvoltării:

  • În fiecare cerere de tragere deschisă pentru testare înainte de fuzionare.
  • Ca răspuns la fiecare comitere, să verificați din nou dacă îmbinarea a fost efectuată corect.
  • Periodic, cum ar fi noaptea sau săptămânal pentru teste suplimentare.
  • Ca parte a testării de performanță sau de stres, care de obicei rulează pe o perioadă lungă de timp și rulează teste în paralel și/sau implementează același program de mai multe ori.

Pentru fiecare dintre acestea, Pulumi acceptă integrarea cu sistemul dumneavoastră preferat de integrare continuă. Cu integrarea continuă, acest lucru vă oferă aceeași acoperire de testare pentru infrastructura dvs. ca și pentru aplicația software.

Pulumi are suport pentru sisteme CI comune. Aici sunt câțiva dintre ei:

Pentru informații mai detaliate, vă rugăm să consultați documentația pentru Livrarea continuă.

Medii efemere

O oportunitate foarte puternică care se deschide este capacitatea de a implementa medii efemere exclusiv în scopuri de testare de acceptare. Concept proiecte și stive Pulumi este proiectat să implementeze și să demonteze cu ușurință medii complet izolate și independente, totul în câteva comenzi simple CLI sau folosind un cadru de testare a integrării.

Dacă folosești GitHub, atunci Pulumi oferă Aplicația GitHub, care vă va ajuta să conectați testarea de acceptare pentru a extrage cereri în canalul dvs. CI. Doar instalați aplicația în depozitul GitHub și Pulumi va adăuga informații despre previzualizările infrastructurii, actualizările și rezultatele testării la solicitările dvs. CI și pool:

Testarea infrastructurii ca cod cu Pulumi. Partea 2

Când utilizați Pulumi pentru testele de acceptare de bază, veți obține noi capabilități de automatizare care vor îmbunătăți productivitatea echipei și vă vor oferi încredere în calitatea modificărilor dvs.

Total

În acest articol, am văzut că, prin utilizarea limbajelor de programare de uz general, ne devin disponibile multe tehnici de dezvoltare software care ne-au fost utile în dezvoltarea aplicațiilor noastre. Acestea includ testarea unitară, testarea integrării și modul în care lucrează împreună pentru a efectua teste extinse de rulare. Testele sunt ușor de rulat la cerere sau în sistemul dumneavoastră CI.

Pulumi - software open source, gratuit de utilizat și funcționează cu limbajele și norii dvs. de programare preferate - incearca astazi!

Prima parte

Sursa: www.habr.com

Adauga un comentariu