Teste e infrastruktura si kod me ndihmën e Pulumi. Pjesa 2

Përshëndetje të gjithëve. Sot po ndajmë me ju pjesën përfundimtare të artikullit «Testimi i infrastrukturës si kod me ndihmën e Pulumi», përkthimi i të cilit është përgatitur veçanërisht për studentët e kursit «Praktikat dhe mjetet DevOps».

Teste e infrastruktura si kod me ndihmën e Pulumi. Pjesa 2

Testimi i implementimit

Stili i testimit të shqyrtuar është një qasje e fuqishme, e cila na lejon të kryejmë testimin e kutisë së bardhë për të verifikuar funksionimin e brendshëm të kodit tonë të infrastrukturës. Megjithatë, ai disi kufizon atë që mund të verifikojmë. Testet kryhen mbi një plan implementimi in-memory, i krijuar nga Pulumi para implementimit të drejtpërdrejtë dhe prandaj implementimi vetë nuk mund të testohet. Për këto raste, Pulumi ka një kuadër testimi integrues. Dhe këto dy qasje funksionojnë shkëlqyeshëm së bashku!

Kuadri i testimit integrues të Pulumi është shkruar në Go, dhe pikërisht me ndihmën e tij ne testojmë shumicën e kodit tonë të brendshëm. Nëse qasja e shqyrtuar më parë e testimit modular ishte më shumë si testimi i kutisë së bardhë, atëherë testimi integrues është kutia e zezë. (Ka gjithashtu variante të testimit të brendshëm të hollësishëm.) Ky kuadër është krijuar për të marrë një program të plotë Pulumi dhe për të kryer për të operacione të ndryshme të jetës së ciklit, siç janë implementimi i një stekje të re nga fillimi, azhurnimi i saj me variacione dhe fshirja, ndoshta disa herë. Ne i ekzekutojmë ato rregullisht (p.sh., natën) dhe si teste stresi.

(Ne po punojmë për të, që mundësi të ngjashme për testimin integrues të jenë në SDK-në natyrore të gjuhëve. Ju mund të përdorni kuadrin e testimit integrues Go pavarësisht nga gjuha në të cilën është shkruar programi juaj i Pulumi).

Duke e ekzekutuar programin me ndihmën e këtij kuadri ju mund të verifikoni:

  • Kodi i projektit tuaj Ă«shtĂ« sintaksikisht i saktĂ« dhe funksionon pa gabime.
  • Caktimet e konfigurimit tĂ« stekĂ«s dhe sekretet funksionojnĂ« dhe interpretohen saktĂ«.
  • Projekti juaj mund tĂ« implementohet me sukses nĂ« ofruesin e tuaj tĂ« preferuar tĂ« cloud.
  • Projekti juaj mund tĂ« azhurnohet me sukses nga gjendja fillestare nĂ« N gjendje tĂ« tjera.
  • Projekti juaj mund tĂ« shkatĂ«rrohet dhe fshihet me sukses nga ofruesi juaj i cloud.

Siç do të shohim së shpejti, ky kuadër gjithashtu mund të përdoret për të kryer validimin e runtime.

Test i thjeshtë i integrimit

Për ta parë këtë në veprim, ne do të shohim në repositorin pulumi/examples, pasi ekipi ynë dhe komuniteti Pulumi e përdorin atë për të testuar kërkesat e veta të bazës, komitet dhe ndërtimet e natës.

Më poshtë është një test i thjeshtuar i shembullit tonë që krijon një S3 bucket dhe disa objekte të tjera:

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

Ky test kalon përmes ciklit të jetës së krijimit, modifikimit dhe shkatërrimit të një staku për dosjen aws-js-s3-folder. Do të marrë rreth një minutë për të raportuar testin e kaluar:

$ go test .
PASS
ok      ... 43.993s

Ka shumë parametra për të konfiguruar sjelljen e këtyre testeve. Lista e plotë e opsioneve mund të shikohet në strukturën ProgramTestOptions. Për shembull, mund të konfiguroni endpoint-in Jaeger për gjurmimin (Tracing), të specifikoni se prisni dështimin e testit në testimin negativ (ExpectFailure), të aplikoni një seri "korrigjimesh" në program për kalimin e gjendjeve (EditDirs) dhe shumë më tepër. Le të shohim si t'i përdorim ato për të verifikuar shpërndarjen e aplikacioneve.

Verifikimi i pronave të burimeve

Integrimi qĂ« u pĂ«rmend mĂ« lart siguron qĂ« programi ynĂ« "punon" — nuk dĂ«shton. Por çfarĂ« nĂ«se duam tĂ« verifikojmĂ« pronat e stack-ut tĂ« marrĂ«? PĂ«r shembull, se disa lloje burimesh ishin (ose nuk ishin) krijuar dhe se ato kanĂ« disa atributet tĂ« caktuara.

Parametri ExtraRuntimeValidation për ProgramTestOptions na lejon të shohim në statusin e regjistruar nga Pulumi pas shpërndarjes (post-deployment state), në mënyrë që të mund të bëjmë verifikime të tjera. Kjo përfshin një pamje të plotë të gjendjes së stack-ut rezultues, duke përfshirë konfigurimin, vlerat e dalura të eksportuara, të gjitha burimet dhe vlerat e pronave të tyre, si dhe të gjitha varësitë midis burimeve.

Për të parë një shembull të thjeshtë të kësaj, le të kontrollojmë se programi ynë krijon një S3 Bucket:

  integration.ProgramTest(t, &integration.ProgramTestOptions{
        \/\/ si më parë...
        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, "Pr expecting to find a single AWS S3 Bucket")
        },
    })

Tani, kur ne do ta ekzekutojmë go test, ai do të kalojë jo vetëm përmes një serie testesh të ciklit të jetës, por gjithashtu, pas një implementimi të suksesshëm të stek-ut, do të kryejë një kontrolle shtesë të gjendjes përfundimtare.

Testet në kohë reale

deri tani tĂ« gjitha testet kanĂ« qenĂ« ekskluzivisht pĂ«r sjelljen gjatĂ« implementimit dhe pĂ«r modelin e burimeve Pulumi. ÇfarĂ« tĂ« bĂ«jmĂ«, nĂ«se dĂ«shiron tĂ« verifikosh qĂ« infrastruktura jote e pĂ«rgatitur funksionon vĂ«rtet? PĂ«r shembull, a funksionon makina virtuale, a pĂ«rmban S3 bucket ajo qĂ« presim, dhe kĂ«shtu me radhĂ«.

Ju ndoshta tashmë e keni kuptuar se si ta bëni këtë: opsioni ExtraRuntimeValidation për ProgramTestOptions është një mundësi e shkëlqyer për këtë. Në këtë fazë, ju ekzekutoni një test të rastësishëm Go me qasje në gjendjen e plotë të burimeve të programit tuaj. Kjo gjendje përfshin informata të tilla si adresat IP të makinave virtuale, URL-të dhe gjithçka që nevojitet për ndërveprim real me aplikacionet dhe infrastrukturën e shpërndara në cloud.

Për shembull, programi ynë testues eksporton pronën webEndpoint të bucket-it të quajtur websiteUrl, e cila është një URL e plotë ku mund të marrim dokumentin e index. Megjithëse ne mund të shqyrtojmë skedarin e gjendjes për të gjetur bucket dhe ta lexojmë këtë pronë drejtpërdrejt, në shumë raste stekët tanë eksportojnë prona të dobishme si kjo, që neve na është e lehtë t'i përdorim për verifikim:

integration.ProgramTest(t, &integration.ProgramTestOptions{
            \/\/ si më parë ...
        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!")
        },
    })

Ashtu si verifikimet tona tĂ« mĂ«parshme nĂ« kohĂ« reale, ky kontroll do tĂ« ekzekutohet menjĂ«herĂ« pas ngritjes sĂ« stek-ut, dhe e gjithĂ« kjo nĂ« pĂ«rgjigje tĂ« njĂ« thirrje tĂ« thjeshtĂ« go test. Dhe kjo Ă«shtĂ« vetĂ«m maja e ajsbergut — tĂ« gjitha mundĂ«sitĂ« testuese tĂ« Go janĂ« tĂ« gjitha tĂ« disponueshme, qĂ« ju mund tĂ« shkruani nĂ« kod.

Integrimi i vazhdueshëm i infrastrukturës

ËshtĂ« mirĂ« qĂ« tĂ« keni mundĂ«sinĂ« tĂ« ekzekutoni teste nĂ« laptopin tuaj, kur ka shumĂ« ndryshime nĂ« infrastrukturĂ«, pĂ«r t'i kontrolluar ato para se t'i dĂ«rgoni pĂ«r shqyrtim tĂ« kodit. Por ne dhe shumĂ« nga klientĂ«t tanĂ« i testojmĂ« infrastrukturat nĂ« faza tĂ« ndryshme tĂ« ciklit tĂ« zhvillimit:

  • NĂ« çdo kĂ«rkesĂ« tĂ« hapur tĂ« pullĂ«s pĂ«r testin pĂ«rpara bashkimit.
  • NĂ« pĂ«rgjigje tĂ« çdo komiti, pĂ«r tĂ« verifikuar qĂ« bashkimi Ă«shtĂ« kryer siç duhet.
  • Rregullisht, pĂ«r shembull, natĂ«n ose çdo javĂ« pĂ«r teste shtesĂ«.
  • Si pjesĂ« e testimit tĂ« performancĂ«s ose testimit tĂ« stresit, qĂ« zakonisht kryhen pĂ«r njĂ« periudhĂ« tĂ« gjatĂ« kohe dhe ekzekutojnĂ« teste paralelisht dhe/ose zhvillojnĂ« tĂ« njĂ«jtin program disa herĂ«.

Për çdo një prej tyre, Pulumi mbështet integrimin me sistemin tuaj të preferuar të integrazhës së vazhdueshme. Me integrimin e vazhdueshëm, kjo ju ofron të njëjtin mbulim testesh për infrastrukturën tuaj, ashtu si për software-in aplikativ.

Pulumi ka mbështetje për sistemet CI më të zakonshme. Ja disa prej tyre:

Për më shumë informacion, ju lutemi referojuni dokumentacionit për Dërgimi i Vazhdushëm.

Mjediset efemere

Një mundësi shumë e fuqishme që hapet është mundësia për të zhvilluar mjedise efemere vetëm për qëllime testimi të pranuara. Koncepti projekteve dhe stekeve Pulumi është projektuar në mënyrë që të lehtësojë zhvillimin dhe shkatërrimin e mjediseve krejtësisht të izoluara dhe të pavarura, gjithçka në disa direktiva të thjeshta CLI ose me ndihmën e kornizës së testimit të integrimit.

Nëse përdorni GitHub, atëherë Pulumi ofron GitHub App, e cila do t'ju ndihmojë të lidhni testimin e pranuar me kërkesat e pullës brenda CI-të tuaj. Thjesht instaloni aplikacionin në repositorin GitHub, dhe Pulumi në CI-në tuaj dhe informacioni mbi paraprakët e infrastrukturës, azhurnimet dhe rezultatet e testeve do të shtohet në kërkesat e pullës:

Teste e infrastruktura si kod me ndihmën e Pulumi. Pjesa 2

Duke përdorni Pulumi për testet tuaja kryesore të pranimit, do të keni mundësi të reja automatizimi që do të përmirësojnë performancën e ekipit dhe do t'ju japin siguri për cilësinë e ndryshimeve.

Përfundimi

Në këtë artikull, pamë se duke përdorur gjuhët e programimit të përgjithshme, na hapet shumë metoda zhvillimi softueri që ishin të dobishme për zhvillimin e aplikacioneve tona. Këto përfshijnë testimin modular, testimin e integrimit, si dhe ndërveprimin e tyre për të kryer testime të gjera runtime. Testet janë të lehta për t'u ekzekutuar me kërkesë ose në sistemin tuaj CI.

Pulumi — njĂ« program i hapur, i cili Ă«shtĂ« falas pĂ«r t'u pĂ«rdorur dhe punon me gjuhĂ«t dhe cloud-et tuaja tĂ« preferuara — provoje sot!

→ Pjesa e parĂ«

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster