Bok svima. Danas s vama dijelimo završni dio članka.
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
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_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. 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
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
Ako koristite GitHub, onda Pulumi nudi
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 -
→
Izvor: www.habr.com