Testiranje infrastrukture kao koda sa Pulumijem. Dio 2

Zdravo svima. Danas s vama dijelimo završni dio članka. "Testiranje infrastrukture kao koda sa Pulumijem", čiji je prevod pripremljen posebno za studente kursa "DevOps prakse i alati".

Testiranje infrastrukture kao koda sa Pulumijem. Dio 2

Testiranje implementacije

Ovaj stil testiranja je moćan pristup i omogućava nam da izvršimo testiranje u bijeloj kutiji kako bismo testirali interni rad našeg infrastrukturnog koda. Međutim, to donekle ograničava ono što možemo testirati. Testovi se izvode na osnovu plana implementacije u memoriji koji je kreirao Pulumi prije stvarne implementacije i stoga se sama implementacija ne može testirati. Za takve slučajeve Pulumi ima okvir za testiranje integracije. I ova dva pristupa odlično funkcioniraju zajedno!

Okvir za testiranje integracije Pulumi je napisan u Go, na taj način testiramo većinu našeg internog koda. Dok je prethodno razmatrani pristup testiranju jedinica više nalik testiranju bijele kutije, testiranje integracije je crna kutija. (Postoje i opcije za rigorozno interno testiranje.) Ovaj okvir je kreiran da preuzme kompletan Pulumi program i izvrši razne operacije životnog ciklusa na njemu, kao što je postavljanje novog steka od nule, ažuriranje ga varijacijama i brisanje, moguće više puta . Radimo ih redovno (na primjer, noću) i kao testove na stres.

(Mi radimo na tome, tako da su slične mogućnosti testiranja integracije dostupne u izvornom SDK-u jezika. Možete koristiti okvir za testiranje integracije Go bez obzira na jezik na kojem je napisan vaš Pulumi program).

Pokretanjem programa koristeći ovaj okvir možete provjeriti sljedeće:

  • Vaš projektni kod je sintaktički ispravan i radi bez grešaka.
  • Postavke konfiguracije steka i tajni rade i ispravno se tumače.
  • Vaš projekat može biti uspješno implementiran u cloud provajderu po vašem izboru.
  • Vaš projekat se može uspješno nadograditi iz početnog stanja u N drugih stanja.
  • Vaš projekat se može uspješno uništiti i ukloniti iz vašeg cloud provajdera.

Kao što ćemo uskoro vidjeti, ovaj okvir se također može koristiti za provjeru valjanosti vremena izvršavanja.

Jednostavan integracijski test

Da vidimo ovo na djelu, pogledat ćemo spremište pulumi/examples, jer ga naš tim i zajednica Pulumi koriste za testiranje naših vlastitih zahtjeva za povlačenjem, urezivanja i noćnih build-ova.

Ispod je naš pojednostavljeni test primjer koji pruža S3 bucket i neke druge objekte:

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,
        },
    })
}

Ovaj test prolazi kroz osnovni životni ciklus kreiranja, modifikacije i uništavanja steka za fasciklu aws-js-s3-folder. Za prijavu položenog testa bit će potrebno oko minut:

$ go test .
PASS
ok      ... 43.993s

Postoji mnogo opcija za prilagođavanje ponašanja ovih testova. Pogledajte kompletnu listu opcija. u strukturi ProgramTestOptions. Na primjer, možete konfigurirati Jaeger krajnju tačku za praćenje (Tracing), naznačite da očekujete da test neće uspjeti ako je testiranje negativno (ExpectFailure), primijeniti seriju "uređivanja" na program za sekvencijalni prijelaz stanja (EditDirs) i mnogo više. Pogledajmo kako ih koristiti za testiranje implementacije vaše aplikacije.

Provjera svojstava resursa

Integracija o kojoj smo gore govorili osigurava da naš program "radi" - da se ne ruši. Ali što ako želimo provjeriti svojstva rezultirajućeg steka? Na primjer, da su određene vrste resursa bile (ili nisu) bile dodijeljene i da imaju određene atribute.

Parametar ExtraRuntimeValidation do ProgramTestOptions omogućava nam da pogledamo stanje nakon implementacije koje je zabilježio Pulumi kako bismo mogli izvršiti dodatne provjere. Ovo uključuje potpunu sliku stanja rezultirajućeg steka, uključujući konfiguraciju, izvezene izlazne vrijednosti, sve resurse i vrijednosti njihovih svojstava, i sve ovisnosti između resursa.

Da bismo vidjeli osnovni primjer ovoga, provjerimo da li ga naš program kreira S3 Bucket:

  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")
        },
    })

Sada, kada pokrenemo go test, ne samo da će proći kroz niz testova životnog ciklusa, već će i, nakon uspješnog postavljanja steka, izvršiti dodatnu provjeru rezultirajućeg stanja.

Runtime testovi

Do sada su svi testovi bili isključivo vezani za ponašanje pri postavljanju i Pulumi model resursa. Šta ako želite da potvrdite da vaša obezbeđena infrastruktura zaista radi? Na primjer, da virtuelna mašina radi, S3 bucket sadrži ono što očekujemo i tako dalje.

Možda ste već pogodili kako to učiniti: opcija ExtraRuntimeValidation do ProgramTestOptions - ovo je odlična prilika za ovo. U ovom trenutku pokrećete prilagođeni Go test sa pristupom punom stanju resursa vašeg programa. Ovo stanje uključuje informacije kao što su IP adrese virtuelnih mašina, URL-ovi i sve što je potrebno za stvarnu interakciju sa rezultirajućim aplikacijama u oblaku i infrastrukturom.

Na primjer, naš testni program izvozi svojstvo webEndpoint bucket call websiteUrl, što je puni URL na kojem možemo dobiti konfigurisane index document. Iako bismo mogli kopati u državni fajl da pronađemo bucket i pročitajte to svojstvo direktno, ali u mnogim slučajevima naši stekovi izvoze korisna svojstva poput ove koja smatramo zgodnim za korištenje za provjeru:

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!")
        },
    })

Kao i naše prethodne provjere vremena izvođenja, ova provjera će se izvršiti odmah nakon podizanja steka, a sve kao odgovor na jednostavan poziv go test. I to je samo vrh ledenog brega – dostupna je svaka funkcija Go testa koju možete napisati u kodu.

Kontinuirana integracija infrastrukture

Dobro je imati mogućnost pokretanja testova na laptopu kada se radi mnogo infrastrukturnih promjena kako bi se testirali prije nego što ih podnesete na pregled koda. Ali mi i mnogi naši klijenti testiramo infrastrukturu u različitim fazama životnog ciklusa razvoja:

  • U svakom otvorenom pull zahtjevu za testiranje prije spajanja.
  • Kao odgovor na svako urezivanje, da još jednom provjerite da li je spajanje ispravno obavljeno.
  • Periodično, na primer noću ili jednom nedeljno radi dodatnog testiranja.
  • Kao dio testiranja performansi ili stresnog testiranja, koje se obično odvija u dužem vremenskom periodu i izvodi testove paralelno i/ili više puta implementira isti program.

Za svaki od ovih, Pulumi podržava integraciju sa vašim omiljenim sistemom kontinuirane integracije. Uz kontinuiranu integraciju, ovo vam daje istu pokrivenost testom za vašu infrastrukturu kao i za vaš aplikativni softver.

Pulumi ima podršku za uobičajene CI sisteme. Evo nekih od njih:

Za detaljnije informacije pogledajte dokumentaciju za Kontinuirana dostava.

Ephemeral Environments

Vrlo moćna prilika koja se otvara je mogućnost implementacije efemernih okruženja isključivo u svrhe testiranja prihvatljivosti. Koncept projekti i stekovi Pulumi je dizajniran za lako postavljanje i rušenje potpuno izoliranih i neovisnih okruženja, sve u nekoliko jednostavnih CLI naredbi ili korištenjem okvira za testiranje integracije.

Ako koristite GitHub, onda Pulumi nudi GitHub App, koji će vam pomoći da povežete testiranje prihvatljivosti sa zahtjevima za povlačenje unutar vašeg CI cjevovoda. Samo instalirajte aplikaciju u GitHub spremište i Pulumi će dodati informacije o infrastrukturnim pregledima, ažuriranjima i rezultatima testiranja vašim zahtjevima za CI i bazen:

Testiranje infrastrukture kao koda sa Pulumijem. Dio 2

Kada koristite Pulumi za svoje osnovne testove prihvatanja, dobit ćete nove mogućnosti automatizacije koje će poboljšati produktivnost tima i dati vam povjerenje u kvalitet vaših promjena.

Rezultat

U ovom članku smo vidjeli da nam korištenjem programskih jezika opće namjene postaju dostupne mnoge tehnike razvoja softvera koje su bile korisne u razvoju naših aplikacija. Oni uključuju testiranje jedinica, integracijsko testiranje i način na koji rade zajedno na izvođenju opsežnog testiranja vremena izvršavanja. Testove je lako pokrenuti na zahtjev ili u vašem CI sistemu.

Pulumi - softver otvorenog koda, besplatan za korištenje i radi s vašim omiljenim programskim jezicima i oblacima - probaj danas!

Prvi dio

izvor: www.habr.com

Dodajte komentar