Infrastruktuuri testimine koodina Pulumiga. 2. osa

Tere kõigile. Täna jagame teiega artikli viimast osa. "Infrastruktuuri testimine koodina Pulumiga", mille tõlge oli koostatud spetsiaalselt kursuslastele "DevOpsi tavad ja tööriistad".

Infrastruktuuri testimine koodina Pulumiga. 2. osa

Kasutuselevõtu testimine

See testimisstiil on võimas lähenemisviis ja võimaldab meil läbi viia valge kasti testimist, et testida meie infrastruktuuri koodi sisemist tööd. Siiski piirab see mõnevõrra seda, mida saame testida. Testid tehakse Pulumi poolt enne tegelikku kasutuselevõttu loodud mälusisese juurutusplaani alusel ja seetõttu ei saa juurutust ennast testida. Sellisteks puhkudeks on Pulumil integratsioonitesti raamistik. Ja need kaks lähenemist töötavad koos suurepäraselt!

Pulumi integratsiooni testimise raamistik on kirjutatud Go keeles, nii testime enamikku oma sisemisest koodist. Kui varem käsitletud ühikutestimise lähenemisviis sarnanes pigem valge kasti testimisega, siis integratsioonitestimine on must kast. (Samuti on valikud rangeks sisetestimiseks.) See raamistik loodi selleks, et võtta kogu Pulumi programm ja teha sellega erinevaid elutsükli toiminguid, nagu näiteks uue virna juurutamine nullist, selle värskendamine variatsioonidega ja kustutamine, võib-olla mitu korda . Käitame neid regulaarselt (näiteks öösel) ja stressitestidena.

(Me me töötame selle kallal, nii et sarnased integratsiooni testimisvõimalused on saadaval keelte emakeelte SDK-s. Go integratsiooni testimise raamistikku saate kasutada olenemata sellest, millises keeles on teie Pulumi programm kirjutatud).

Programmi selle raamistiku abil käivitades saate kontrollida järgmist.

  • Teie projekti kood on süntaktiliselt õige ja töötab ilma vigadeta.
  • Pinu ja saladuste konfiguratsioonisätted töötavad ja neid tõlgendatakse õigesti.
  • Teie projekti saab edukalt juurutada teie valitud pilveteenuse pakkujas.
  • Teie projekti saab edukalt uuendada algolekust N olekusse.
  • Teie projekti saab edukalt hävitada ja pilveteenuse pakkujast eemaldada.

Nagu varsti näeme, saab seda raamistikku kasutada ka käitusaja valideerimiseks.

Lihtne integratsioonitest

Selle tegevuse nägemiseks vaatame hoidlat pulumi/examples, kuna meie meeskond ja Pulumi kogukond kasutavad seda meie enda tõmbetaotluste, kohustuste ja igaõhtuste lisade testimiseks.

Allpool on meie lihtsustatud test näide, mis pakub S3 ämbrit ja mõnda muud objekti:

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

See test läbib kausta virna loomise, muutmise ja hävitamise põhilise elutsükli aws-js-s3-folder. Läbitud testist teatamiseks kulub umbes minut:

$ go test .
PASS
ok      ... 43.993s

Nende testide käitumise kohandamiseks on palju võimalusi. Vaadake valikute täielikku loendit. struktuuris ProgramTestOptions. Näiteks saate seadistada Jaegeri lõpp-punkti jälgima (Tracing), märkige, et eeldate, et test ebaõnnestub, kui test on negatiivne (ExpectFailure), rakendage programmile rida "muudatusi" olekute järjestikuseks üleminekuks (EditDirs) ja palju muud. Vaatame, kuidas neid oma rakenduse juurutamise testimiseks kasutada.

Ressursi omaduste kontrollimine

Eespool käsitletud integratsioon tagab, et meie programm "töötab" – see ei jookse kokku. Aga mis siis, kui tahame kontrollida saadud virna omadusi? Näiteks, et teatud tüüpi ressursse on (või ei ole) ette nähtud ja et neil on teatud atribuudid.

Parameeter ExtraRuntimeValidation eest ProgramTestOptions võimaldab meil vaadata Pulumi salvestatud kasutuselevõtujärgset olekut, et saaksime teha täiendavaid kontrolle. See sisaldab täielikku ülevaadet saadud virna olekust, sealhulgas konfiguratsioonist, eksporditud väljundväärtustest, kõigist ressurssidest ja nende atribuutide väärtustest ning kõigist ressursside vahelistest sõltuvustest.

Selle põhinäite nägemiseks kontrollime, kas meie programm loob selle S3 kopp:

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

Nüüd, kui käivitame go testi, ei läbi see mitte ainult elutsükli teste, vaid ka pärast virna edukat juurutamist kontrollib saadud olekut täiendavalt.

Kestustestid

Seni on kõik testid olnud puhtalt juurutuskäitumise ja Pulumi ressursimudeli kohta. Mida teha, kui soovite kontrollida, kas teie loodud infrastruktuur tegelikult töötab? Näiteks et virtuaalmasin töötab, S3 ämber sisaldab seda, mida me ootame jne.

Võib-olla olete juba arvanud, kuidas seda teha: valik ExtraRuntimeValidation eest ProgramTestOptions - see on selleks suurepärane võimalus. Sel hetkel käivitate kohandatud Go testi, millel on juurdepääs teie programmi ressursside täielikule olekule. See olek sisaldab sellist teavet nagu virtuaalse masina IP-aadressid, URL-id ja kõik, mis on vajalik tulemuseks olevate pilverakenduste ja infrastruktuuriga suhtlemiseks.

Näiteks meie testprogramm ekspordib kinnisvara webEndpoint kopp kutsus websiteUrl, mis on täielik URL, kust saame konfigureeritud index document. Kuigi leidmiseks võiksime riigitoimikusse süveneda bucket ja lugege seda atribuuti otse, kuid paljudel juhtudel ekspordivad meie virnad kasulikke omadusi, mida on mugav kontrollida:

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

Sarnaselt meie varasematele käitusaegsetele kontrollidele teostatakse see kontroll kohe pärast virna tõstmist ja seda kõike vastusena lihtsale kõnele go test. Ja see on vaid jäämäe tipp – saadaval on kõik Go testifunktsioonid, mille saate koodi sisse kirjutada.

Pidev infrastruktuuri integreerimine

Hea on teha sülearvutiga teste, kui tehakse palju infrastruktuurimuudatusi, et neid enne koodi ülevaatamiseks esitamist testida. Kuid meie ja paljud meie kliendid testime infrastruktuuri arenduse elutsükli erinevates etappides:

  • Igas avatud tõmbetaotluses testimiseks enne ühendamist.
  • Vastuseks igale kohustusele kontrollige veel kord, kas ühendamine on tehtud õigesti.
  • Perioodiliselt, näiteks öösel või kord nädalas täiendavaks testimiseks.
  • Osana jõudlus- või stressitestist, mis kestab tavaliselt pikka aega ja testib paralleelselt ja/või juurutab sama programmi mitu korda.

Kõigi nende puhul toetab Pulumi integreerimist teie lemmik pideva integratsioonisüsteemiga. Pideva integreerimisega annab see teie infrastruktuurile sama testimiskatte kui rakendustarkvara jaoks.

Pulumil on tavaliste CI-süsteemide tugi. Siin on mõned neist:

Üksikasjalikuma teabe saamiseks vaadake dokumentatsiooni Pidev kohaletoimetamine.

Põgusad keskkonnad

Väga võimas võimalus, mis avaneb, on võimalus kasutada lühiajalisi keskkondi ainult vastuvõtutestimise eesmärgil. Kontseptsioon projektid ja virnad Pulumi on loodud täiesti isoleeritud ja sõltumatute keskkondade hõlpsaks juurutamiseks ja lammutamiseks, seda kõike mõne lihtsa CLI-käsuga või integratsiooni testimise raamistikku kasutades.

Kui kasutate GitHubi, siis Pulumi pakub GitHubi rakendus, mis aitab teil ühendada vastuvõtutesti, et tõmmata päringuid teie CI torujuhtmesse. Lihtsalt installige rakendus GitHubi hoidlasse ja Pulumi lisab teie CI ja kogumi päringutele teavet infrastruktuuri eelvaadete, värskenduste ja testimistulemuste kohta:

Infrastruktuuri testimine koodina Pulumiga. 2. osa

Kui kasutate Pulumit oma põhiliste vastuvõtutestide jaoks, saate uusi automatiseerimisvõimalusi, mis parandavad meeskonna tootlikkust ja annavad teile kindlustunde oma muudatuste kvaliteedis.

Summaarne

Selles artiklis oleme näinud, et üldotstarbeliste programmeerimiskeelte kasutamisel muutuvad meile kättesaadavaks paljud tarkvaraarendustehnikad, mis on olnud kasulikud meie rakenduste arendamisel. Need hõlmavad üksuse testimist, integratsiooni testimist ja nende koostööd ulatusliku käitusaja testimise läbiviimiseks. Teste on lihtne käivitada nõudmisel või teie CI-süsteemis.

Pulumi - avatud lähtekoodiga tarkvara, tasuta kasutatav ja töötab teie lemmikprogrammeerimiskeelte ja -pilvedega - proovi seda juba täna!

Esimene osa

Allikas: www.habr.com

Lisa kommentaar