Hej alla. Idag delar vi med oss av den avslutande delen av artikeln , en översÀttning som Àr speciellt förberedd för studenter i kursen .

Testning av distribution
Den stil av testning som diskuterades Àr en kraftfull metod, den gör det möjligt för oss att genomföra tests av vit lÄda för att kontrollera hur vÄr infrastruktur kod fungerar inuti. Men det begrÀnsar nÄgot vad vi kan testa. Tester utförs baserat pÄ en in-memory distributionsplan som Pulumi skapar innan sjÀlva distributionen, och dÀrför kan sjÀlva distributionen inte testas. För sÄdana fall finns det ett integrations test ramverk i Pulumi. Och dessa tvÄ metoder fungerar utmÀrkt tillsammans!
Pulumi:s ramverk för integrationstestning Àr skrivet i Go, och det Àr med hjÀlp av detta vi testar större delen av vÄr interna kod. Om den tidigare diskuterade metoden för modulÀr testning mer liknade tests av vit lÄda, sÄ Àr integrationstestning en svart lÄda. (Det finns ocksÄ alternativ för noggrant intern testning.) Detta ramverk skapades för att ta ett komplett Pulumi-program och utföra olika livscykeloperationer för den, sÄsom att distribuera en ny stapel frÄn grunden, uppdatera den med variationer och ta bort den, kanske flera gÄnger. Vi kör dem regelbundet (till exempel pÄ natten) och som stresstester.
(Vi , sÄ att liknande möjligheter för integrationstestning ska finnas i det inhemska SDK:t för sprÄken. Du kan anvÀnda ramverket för integrationstestning i Go oavsett vilket sprÄk din Pulumi-program Àr skriven pÄ).
Genom att köra programmet med detta ramverk kan du kontrollera följande:
- Koden i ditt projekt Àr syntaktiskt korrekt och fungerar utan fel.
- InstÀllningar för stapel och hemligheter fungerar och tolkas korrekt.
- Ditt projekt kan framgÄngsrikt distribueras till den valda molnleverantören.
- Ditt projekt kan framgÄngsrikt uppdateras frÄn det ursprungliga tillstÄndet till N andra tillstÄnd.
- Ditt projekt kan framgÄngsrikt förstöras och tas bort frÄn din molnleverantör.
Som vi snart kommer att se, kan detta ramverk ocksÄ anvÀndas för runtime-validering.
Enkel integreringstest
För att se detta i praktiken ska vi titta pÄ repositoriet pulumi/examples, eftersom vÄrt team och Pulumi-gemenskapen anvÀnder det för att testa sina egna pull requests, commits och nattbyggnader.
Nedan följer ett förenklat test av vÄr :
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,
},
})
} Det hÀr testet gÄr igenom den grundlÀggande livscykeln för att skapa, Àndra och förstöra en stack för en mapp aws-js-s3-folder. Det tar cirka en minut att rapportera att testet passerade:
$ go test .
PASS
ok ... 43.993s Det finns mÄnga parametrar för att konfigurera beteendet hos dessa tester. En fullstÀndig lista över alternativ se ProgramTestOptions. Till exempel kan du konfigurera Jaeger-endpoint för spÄrning (Tracing), ange att du förvÀntar dig att testet ska misslyckas vid negativ testning (ExpectFailure), tillÀmpa en serie 'Àndringar' pÄ programmet för sekventiell övergÄng mellan tillstÄnd (EditDirs) och mycket mer. LÄt oss titta pÄ hur man anvÀnder dem för att kontrollera distributionen av en applikation.
Kontroll av resursers egenskaper
Integrationen som nĂ€mndes ovan sĂ€kerstĂ€ller att vĂ„rt program "fungerar" â det kraschar inte. Men vad hĂ€nder om vi vill kontrollera egenskaperna hos den resulterande stacken? Till exempel, att vissa typer av resurser skapades (eller inte skapades) och att de har vissa attribut.
Parameter ExtraRuntimeValidation för ProgramTestOptions lÄter oss titta pÄ det tillstÄnd som Pulumi har registrerat efter distribution (post-deployment state), sÄ att vi kan göra ytterligare kontroller. Det inkluderar en fullstÀndig översikt över det resulterande stacktillstÄndet, inklusive konfiguration, exporterade utdata, alla resurser och deras egenskapsvÀrden, samt alla beroenden mellan resurser.
För att se ett grundlÀggande exempel pÄ detta, lÄt oss verifiera att vÄrt program skapar en S3-bucket:
integration.ProgramTest(t, &integration.ProgramTestOptions{
// som innan...
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, "FörvÀntade att hitta en enda AWS S3 Bucket")
},
})Nu nÀr vi kör go test kommer det inte bara att gÄ igenom en batteri av livscykeltester, utan Àven, efter en framgÄngsrik distribution av stacken, utföra ytterligare kontroller av det resulterande tillstÄndet.
Runtime-tester
Hittills har alla tester handlat om beteendet vid distribution och Pulumi-resursmodellen. Vad ska man göra om du vill kontrollera att din förberedda infrastruktur verkligen fungerar? Till exempel, att virtuella maskiner körs, att S3-bucket innehÄller det vi förvÀntar oss och sÄ vidare.
Du har kanske redan gissat hur man gör detta: alternativet ExtraRuntimeValidation för ProgramTestOptions â Ă€r en utmĂ€rkt möjlighet för detta. I det hĂ€r skedet kör du ett godtyckligt Go-test med tillgĂ„ng till det fulla tillstĂ„ndet för dina resurser. Detta tillstĂ„nd inkluderar sĂ„dan information som IP-adresser för virtuella maskiner, URL:er och allt annat som behövs för verklig interaktion med de mottagna molnapplikationerna och infrastrukturen.
Till exempel exporterar vĂ„rt testprogram egenskapen webEndpoint av bucketen med namnet websiteUrl, som representerar den fulla URL:en dĂ€r vi kan fĂ„ Ă„tkomst till den konfigurerade indexdokumentet. Ăven om vi kunde leta igenom tillstĂ„ndsfilen för att hitta bucket och lĂ€sa den hĂ€r egenskapen direkt, i mĂ„nga fall exporterar vĂ„ra stackar anvĂ€ndbara egenskaper som detta, som Ă€r bekvĂ€ma att anvĂ€nda för verifiering:
integration.ProgramTest(t, &integration.ProgramTestOptions{
// som innan ...
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!")
},
}) Precis som vĂ„ra tidigare runtime-kontroller kommer denna kontroll att utföras omedelbart efter att stacken har lyfts, och allt detta som svar pĂ„ ett enkelt anrop go test. Och det Ă€r bara toppen av isberget â alla testmöjligheter för Go Ă€r tillgĂ€ngliga som du kan skriva i koden.
Kontinuerlig integration av infrastruktur
Det Àr bra att kunna köra tester pÄ en bÀrbar dator nÀr mÄnga förÀndringar görs i infrastrukturen, för att verifiera dem innan de skickas för kodgranskning. Men vi och mÄnga av vÄra kunder testar infrastrukturen i olika skeden av utvecklingslivscykeln:
- I varje öppen pull request för testning innan sammanslagning.
- Som svar pÄ varje commit för att dubbelkolla att sammanslagningen har gjorts korrekt.
- Periodiskt, till exempel pÄ natten eller veckovis för ytterligare testning.
- Som en del av prestandatestning eller stresstestning, som vanligtvis utförs under en lÀngre period och kör tester parallellt och/eller distribuerar samma program flera gÄnger.
För var och en av dem stöder Pulumi integration med ditt favorit kontinuerliga integrationssystem. Vid kontinuerlig integration ger detta dig samma testtÀcka för din infrastruktur som för din applikationsprogramvara.
Pulumi har stöd för vanliga CI-system. HÀr Àr nÄgra av dem:
För mer information, se dokumentationen för .
Efermeriska miljöer
En mycket kraftfull funktion som öppnas Àr möjligheten att distribuera efermeriska miljöer uteslutande för acceptanstestningsÀndamÄl. Konceptet Pulumi Àr utformat för att enkelt distribuera och riva ner helt isolerade och oberoende miljöer, allt med nÄgra fÄ enkla CLI-kommandon eller med hjÀlp av ett ramverk för integrationstestning.
Om du anvÀnder GitHub erbjuder Pulumi , som hjÀlper dig att ansluta acceptanstestning till pull requests inom din CI-pipeline. Installera bara appen i ditt GitHub-förrÄd, och Pulumi i din CI sÄ kommer information om infrastrukturförhandsgranskningar, uppdateringar och testresultat att lÀggas till i pull requests:

Genom att anvÀnda Pulumi för dina huvudacceptanstester fÄr du nya automatiseringsmöjligheter som förbÀttrar teamets produktivitet och ger trygghet i kvaliteten pÄ förÀndringarna.
Resultat
I den hÀr artikeln har vi sett att nÀr vi anvÀnder allmÀnna programmeringssprÄk sÄ blir mÄnga mjukvaruutvecklingsmetoder tillgÀngliga, vilket har varit anvÀndbart vid utvecklingen av vÄra applikationer. Dessa inkluderar modulÀr testning, integrationstestning och deras interaktion för att genomföra omfattande runtime-testning. Tester kan enkelt startas pÄ begÀran eller i ditt CI-system.
Pulumi â mjukvara med öppen kĂ€llkod, den Ă€r gratis att anvĂ€nda och fungerar med dina favoritprogrammeringssprĂ„k och moln â !
â
KĂ€lla: habr.com
