Testiranje infrastrukture kao koda s Pulumijem. 2. dio

Bok svima. Danas s vama dijelimo završni dio članka. "Testiranje infrastrukture kao kod s Pulumijem", čiji je prijevod pripremljen posebno za studente kolegija "DevOps prakse i alati".

Testiranje infrastrukture kao koda s Pulumijem. 2. dio

Testiranje implementacije

Ovaj stil testiranja moćan je pristup i omogućuje nam izvođenje testiranja bijele kutije kako bismo testirali interni rad našeg infrastrukturnog koda. Međutim, to donekle ograničava ono što možemo testirati. Testovi se izvode na temelju plana implementacije u memoriji koju je izradio Pulumi prije stvarne implementacije i stoga se sama implementacija ne može testirati. Za takve slučajeve Pulumi ima integracijski testni okvir. I ova dva pristupa odlično funkcioniraju zajedno!

Okvir za testiranje integracije Pulumi napisan je u Gou, na koji testiramo većinu našeg internog koda. Dok je prethodno razmatrani pristup jediničnog testiranja više nalikovao testiranju bijele kutije, testiranje integracije je crna kutija. (Također postoje opcije za rigorozno interno testiranje.) Ovaj je okvir kreiran za uzimanje kompletnog Pulumi programa i izvođenje raznih operacija životnog ciklusa na njemu, kao što je postavljanje novog stoga od nule, njegovo ažuriranje varijacijama i brisanje, po mogućnosti više puta . Izvodimo ih redovito (na primjer, noću) i kao testove otpornosti na stres.

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

Pokretanjem programa pomoću ovog okvira možete provjeriti sljedeće:

  • Vaš projektni kod je sintaktički ispravan i radi bez grešaka.
  • Postavke konfiguracije stoga i tajni rade i ispravno se tumače.
  • Vaš projekt može se uspješno implementirati u pružatelja usluga oblaka po vašem izboru.
  • Vaš projekt se može uspješno nadograditi iz početnog stanja u N drugih stanja.
  • Vaš projekt može se uspješno uništiti i ukloniti s vašeg pružatelja usluga oblaka.

Kao što ćemo uskoro vidjeti, ovaj se okvir također može koristiti za izvođenje provjere valjanosti.

Jednostavan test integracije

Da bismo vidjeli ovo na djelu, pogledat ćemo spremište pulumi/examples, budući da ga naš tim i zajednica Pulumi koriste za testiranje vlastitih zahtjeva za povlačenjem, obveza i noćnih izrada.

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

primjer_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 stvaranja, modificiranja i uništavanja stoga za mapu aws-js-s3-folder. Za prijavu položenog testa bit će potrebno oko minutu:

$ go test .
PASS
ok      ... 43.993s

Postoji mnogo opcija za prilagodbu ponašanja ovih testova. Pogledajte cijeli popis opcija. u strukturi ProgramTestOptions. Na primjer, možete konfigurirati krajnju točku Jaeger za praćenje (Tracing), pokazuju da očekujete da će test biti neuspješan ako je test negativan (ExpectFailure), primijenite niz "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

Gore spomenuta integracija osigurava da naš program "radi" - ne ruši se. Ali što ako želimo provjeriti svojstva rezultirajućeg stoga? Na primjer, da su određene vrste resursa (ili nisu) osigurane i da imaju određene atribute.

Parametar ExtraRuntimeValidation za ProgramTestOptions omogućuje nam da pogledamo stanje nakon postavljanja koje je zabilježio Pulumi kako bismo mogli napraviti dodatne provjere. To uključuje potpunu snimku stanja rezultirajućeg stoga, uključujući konfiguraciju, izvezene izlazne vrijednosti, sve resurse i njihove vrijednosti svojstava te sve ovisnosti između resursa.

Da bismo vidjeli osnovni primjer ovoga, provjerimo stvara li ga naš program S3 Kanta:

  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, on ne samo da će proći kroz niz testova životnog ciklusa, već će također, nakon uspješnog postavljanja stoga, izvršiti dodatnu provjeru rezultirajućeg stanja.

Runtime testovi

Do sada su se svi testovi odnosili isključivo na ponašanje implementacije i Pulumi model resursa. Što ako želite provjeriti radi li vaša osigurana infrastruktura? Na primjer, da virtualni stroj radi, S3 spremnik sadrži ono što očekujemo, i tako dalje.

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

Na primjer, naš program za testiranje izvozi svojstvo webEndpoint kanta zove websiteUrl, što je puni URL na kojem možemo dobiti konfiguraciju index document. Iako bismo mogli kopati po državnom dosjeu da pronađemo bucket i izravno pročitajte to svojstvo, ali u mnogim slučajevima naši skupovi izvoze korisna svojstva poput ovog za koja smatramo da su zgodna 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 će se provjera izvršiti odmah nakon podizanja stoga, a sve kao odgovor na jednostavan poziv go test. I to je samo vrh ledenog brijega—dostupna je svaka značajka Go testa koju možete napisati u kodu.

Kontinuirana integracija infrastrukture

Dobro je imati mogućnost pokretanja testova na prijenosnom računalu kada se radi mnogo promjena infrastrukture kako bi se testirali prije slanja na pregled koda. Ali mi i mnogi naši klijenti testiramo infrastrukturu u različitim fazama životnog ciklusa razvoja:

  • U svakom otvorenom zahtjevu za povlačenjem za testiranje prije spajanja.
  • Kao odgovor na svako uvrštavanje, dva puta provjeriti je li spajanje ispravno izvršeno.
  • Povremeno, primjerice noću ili tjedno za dodatno testiranje.
  • Kao dio testiranja performansi ili testiranja otpornosti na stres, koje se obično izvodi kroz dugo vremensko razdoblje i izvodi testove paralelno i/ili implementira isti program više puta.

Za svaki od njih Pulumi podržava integraciju s vašim omiljenim sustavom kontinuirane integracije. Uz kontinuiranu integraciju, ovo vam daje istu pokrivenost testom za vašu infrastrukturu kao i za vaš aplikacijski softver.

Pulumi ima podršku za uobičajene CI sustave. Ovo su neki od njih:

Za detaljnije informacije pogledajte dokumentaciju za Kontinuirano isporuke.

Efemerna okruženja

Vrlo moćna prilika koja se otvara je mogućnost postavljanja kratkotrajnih okruženja isključivo u svrhu testiranja prihvaćanja. Koncept projekti i hrpe Pulumi je dizajniran za jednostavno postavljanje i rušenje potpuno izoliranih i neovisnih okruženja, sve u nekoliko jednostavnih CLI naredbi ili pomoću okvira za testiranje integracije.

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

Testiranje infrastrukture kao koda s Pulumijem. 2. dio

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

Ukupan

U ovom smo članku vidjeli da 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 jedinice, testiranje integracije i način na koji rade zajedno kako bi izvršili opsežno testiranje tijekom izvođenja. Testovi se lako izvode na zahtjev ili u vašem CI sustavu.

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

Prvi dio

Izvor: www.habr.com

Dodajte komentar