Testovanie infraštruktúry ako kódu pomocou Pulumi. Časť 2

Ahojte. Dnes sa s vami delíme o poslednú časť článku „Testovanie infraštruktúry ako kódu pomocou Pulumi“, ktorého preklad bol pripravený špeciálne pre študentov kurzu „Praktiky a nástroje DevOps“.

Testovanie infraštruktúry ako kódu pomocou Pulumi. Časť 2

Testovanie nasadenia

Preberaný štýl testovania je mocný prístup, ktorý nám umožňuje vykonávať testovanie bielej skrinky na overenie vnútorného fungovania nášho infraštruktúrneho kódu. Avšak, obmedzuje to, čo môžeme overiť. Testy sa vykonávajú na základe in-memory plánu nasadenia, ktorý Pulumi vytvorí pred samotným nasadením, a preto sa samotné nasadenie nemôže testovať. Na tieto prípady má Pulumi rámec integračných testov. A tieto dva prístupy spolu skvele fungujú!

Rámec integračného testovania Pulumi je napísaný v Go a práve s jeho pomocou testujeme väčšinu nášho interného kódu. Ak mal predtým zvažovaný prístup modulárneho testovania viac spoločného s testovaním bielej skrinky, tak integračné testovanie je čierna skrinka. (Existujú aj možnosti dôkladného interného testovania.) Tento rámec bol vytvorený na to, aby vzal kompletný Pulumi program a vykonával preň rôzne operácie životného cyklu, ako je nasadenie nového stacku od základov, jeho aktualizácia s variáciami a odstránenie, najlepšie niekoľkokrát. Spúšťame ich pravidelne (napríklad v noci) a ako stres testy.

(My pracujeme na tom, aby podobné možnosti integračného testovania boli v natívnom SDK jazykov. Môžete použiť rámec integračného testovania Go nezávisle od jazyka, v ktorom je naprogramovaný váš Pulumi program).

Spustením programu pomocou tohto rámca môžete overiť nasledovné:

  • Kód vášho projektu je syntakticky správny a funguje bez chýb.
  • Nastavenia konfigurácie stacku a tajomstiev fungujú a sú správne interpretované.
  • Váš projekt môže byť úspešne nasadený u vami vybraného poskytovateľa cloudu.
  • Váš projekt môže byť úspešne aktualizovaný zo základného stavu do N iných stavov.
  • Váš projekt môže byť úspešne zničený a odstránený z vášho poskytovateľa cloudu.

Ako čoskoro uvidíme, tento framework sa dá využiť aj na vykonávanie runtime validácie.

Jednoduchý integračný test

Aby sme to videli v akcii, pozrieme sa na repozitár pulumi/examples, pretože náš tím a komunita Pulumi ho používajú na testovanie vlastných pull requestov, commitov a nočných buildov.

Nižšie je uvedený zjednodušený test nášho príkladu, ktorý robí provisioning S3 bucket a niektorých ďalších objektov:

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

Tento test prechádza základným životným cyklom vytvárania, modifikácie a zničenia stacku pre priečinok aws-js-s3-folder. Potrvá to asi minútu, kým oznámi, že test bol úspešne vykonaný:

$ go test .
PASS
ok      ... 43.993s

Existuje mnoho parametrov na prispôsobenie správania týchto testov. Úplný zoznam možností pozri v štruktúre ProgramTestOptions. Napríklad, môžete nastaviť Jaeger endpoint pre trasovanie (Tracing), uviesť, že očakávate zlyhanie testu pri negatívnom testovaní (ExpectFailure), aplikovať sériu “úprav” programu na sekvenčný prechod stavov (EditDirs) a mnoho ďalšieho. Pozrime sa, ako ich použiť na overenie nasadenia aplikácie.

Overenie vlastností zdrojov

Integrácia, o ktorej sme hovorili vyššie, zaručuje, že náš program "funguje" — nepadá. Ale čo ak chceme skontrolovať vlastnosti získaného stacku? Napríklad, či určité typy zdrojov boli (alebo neboli) pripravené a či majú určité atribúty.

Parameter ExtraRuntimeValidation pre ProgramTestOptions nám umožňuje pozrieť sa na stav, ktorý zafixoval Pulumi po nasadení (post-deployment state), aby sme mohli vykonať ďalšie kontroly. To zahŕňa úplný snímok stavu výsledného stacku, vrátane konfigurácie, exportovaných výstupných hodnôt, všetkých zdrojov a hodnôt ich vlastností, ako aj všetkých závislostí medzi zdrojmi.

Aby sme videli základný príklad tohto, pozrime sa, čo vytvára náš program pre jeden S3 Bucket:

  integration.ProgramTest(t, &integration.ProgramTestOptions{
        // ako predtým...
        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, "Očakávali sme, že nájdeme jediný AWS S3 Bucket")
        },
    })

Teraz, keď spustíme go test, prejde nielen sériou testov životného cyklu, ale tiež, po úspešnom nasadení stacku, vykoná ďalšiu kontrolu výsledného stavu.

Runtime testy

Doteraz sa všetky testy týkali výhradne správania pri nasadení a modelu zdrojov Pulumi. Čo robiť, ak chcete skontrolovať, či vaša pripravená infraštruktúra skutočne funguje? Napríklad, či je virtuálny stroj v prevádzke, S3 bucket obsahuje to, čo očakávame, a tak ďalej.

Možno ste už uhádli, ako to urobiť: možnosť ExtraRuntimeValidation pre ProgramTestOptions — je výbornou príležitosťou na to. V tomto kroku spustíte ľubovoľný test Go s prístupom k úplnému stavu zdrojov vašej aplikácie. Tento stav obsahuje informácie ako IP adresy virtuálnych strojov, URL adresy a všetko potrebné na skutočnú interakciu s priradenými cloudovými aplikáciami a infraštruktúrou.

Napríklad, naša testovacia aplikácia exportuje vlastnosť webEndpoint bucketu s názvom websiteUrl, ktorá predstavuje plnú URL adresu, na ktorej môžeme získať nastavený index document. Hoci by sme mohli prehľadať súbor stavu, aby sme našli bucket a prečítať túto vlastnosť priamo, v mnohých prípadoch naše stacky exportujú užitočné vlastnosti, ako je táto, ktoré je pohodlné použiť na kontrolu:

integration.ProgramTest(t, &integration.ProgramTestOptions{
            // ako predtým ...
        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!")
        },
    })

Rovnako ako naše predchádzajúce runtime kontroly, táto kontrola sa vykoná ihneď po zvýšení stacku a to všetko na jednoduché zavolanie go test. A to je len špička ľadovca - sú k dispozícii všetky testovacie možnosti Go, ktoré môžete napísať do kódu.

Neprerušovaná integrácia infraštruktúry

Je dobré mať možnosť spúšťať testy na notebooku, keď sa uskutočňuje veľa zmien v infraštruktúre, aby sa mohli skontrolovať pred odoslaním na revíziu kódu. Avšak my a mnohí naši klienti testujeme infraštruktúru v rôznych fázach životného cyklu vývoja:

  • V každom otvorenom pull request pre test pred zlúčením.
  • V reakcii na každý commit, aby sa overilo, že zlúčenie bolo vykonané správne.
  • Pravidelne, napríklad v noci alebo každý týždeň na doplnkové testovanie.
  • V rámci testovania výkonu alebo stresového testovania, ktoré sa zvyčajne vykonáva počas dlhšieho obdobia a spúšťa testy paralelne a/alebo nasadzuje rovnaký program viackrát.

Pre každého z nich Pulumi podporuje integráciu s vaším obľúbeným systémom kontinuálnej integrácie. Pri kontinuálnej integrácii vám to dáva rovnaké pokrytie testami pre vašu infraštruktúru ako pre aplikačný softvér.

Pulumi má podporu pre bežné CI systémy. Tu je niekoľko z nich:

Na získanie podrobnejších informácií sa obráťte na dokumentáciu o Kontinuálne dodávanie.

Efemérne prostredia

Veľmi silná funkcia, ktorá sa otvára - je to možnosť nasadzovať efemérne prostredia výlučne na účely akceptačných testov. Koncept projektov a zásobníkov Pulumi je navrhnuté tak, aby sa jednoducho nasadzovali a odstraňovali úplne izolované a nezávislé prostredia, a to všetko z niekoľkých jednoduchých príkazov CLI alebo pomocou rámca pre integračné testovanie.

Ak používate GitHub, Pulumi ponúka GitHub App, ktoré vám pomôže pripojiť akceptačné testovanie k pull requestom v rámci vášho CI pipeline. Stačí nainštalovať aplikáciu do repozitára GitHub a Pulumi do vášho CI a do pull requestov sa pridá informácia o náhľade infraštruktúry, aktualizáciách a výsledkoch testovania:

Testovanie infraštruktúry ako kódu pomocou Pulumi. Časť 2

Používaním Pulumi pre vaše základné akceptačné testy získate nové možnosti automatizácie, ktoré zlepšia výkonnosť tímu a poskytnú dôveru v kvalitu zmien.

Záver

V tomto článku sme videli, že používaním programovacích jazykov všeobecného účelu máme k dispozícii mnohé metódy vývoja softvéru, ktoré boli užitočné pri vývoji našich aplikácií. Tieto metódy zahŕňajú modulové testovanie, integračné testovanie a ich vzájomné pôsobenie pre vykonávanie rozsiahleho runtime testovania. Testy je možné jednoducho spúšťať na požiadanie alebo vo vašej CI systéme.

Pulumi je open source softvér, ktorý je zadarmo na používanie a funguje s vašimi obľúbenými programovacími jazykmi a cloudami — vyskúšajte ho dnes!

→ Prvá časť

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster