Testování infrastruktury jako kódu s Pulumi. Část 2

Ahoj všichni. Dnes s vámi sdílíme závěrečnou část článku. "Testování infrastruktury jako kódu s Pulumi", jejíž překlad byl připraven speciálně pro studenty kurzu "Postupy a nástroje DevOps".

Testování infrastruktury jako kódu s Pulumi. Část 2

Testování nasazení

Tento styl testování je účinným přístupem a umožňuje nám provádět testování bílé skříňky, abychom otestovali interní fungování kódu naší infrastruktury. To však poněkud omezuje to, co můžeme testovat. Testy jsou prováděny na základě plánu nasazení v paměti vytvořeného Pulumi před samotným nasazením, a proto nelze samotné nasazení testovat. Pro takové případy má Pulumi integrační testovací rámec. A tyto dva přístupy spolu skvěle fungují!

Integrační testovací rámec Pulumi je napsán v Go, což je způsob, jakým testujeme většinu našeho interního kódu. Zatímco dříve diskutovaný přístup k testování jednotek byl spíše jako testování bílé skříňky, integrační testování je černá skříňka. (Existují také možnosti pro přísné interní testování.) Tento rámec byl vytvořen, aby převzal kompletní program Pulumi a prováděl na něm různé operace životního cyklu, jako je nasazení nového zásobníku od začátku, jeho aktualizace s variacemi a jeho odstranění, možná několikrát. . Provozujeme je pravidelně (například v noci) a jako zátěžové testy.

(My pracujeme na tom, takže podobné možnosti testování integrace jsou dostupné v nativní sadě SDK jazyků. Rámec testování integrace Go můžete používat bez ohledu na jazyk, ve kterém je váš program Pulumi napsán).

Spuštěním programu pomocí tohoto rámce můžete zkontrolovat následující:

  • Kód vašeho projektu je syntakticky správný a běží bez chyb.
  • Nastavení konfigurace zásobníku a tajných klíčů funguje a je správně interpretováno.
  • Váš projekt lze úspěšně nasadit u vámi zvoleného poskytovatele cloudu.
  • Váš projekt lze úspěšně upgradovat z počátečního stavu do N dalších stavů.
  • Váš projekt může být úspěšně zničen a odstraněn od vašeho poskytovatele cloudu.

Jak brzy uvidíme, tento rámec lze také použít k provádění runtime validace.

Jednoduchý integrační test

Abychom to viděli v akci, podíváme se na úložiště pulumi/examples, protože jej náš tým a komunita Pulumi používá k testování našich vlastních požadavků na stažení, potvrzení a nočních sestav.

Níže je náš zjednodušený test příklad, který poskytuje kbelík S3 a některé další objekty:

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 prochází základním životním cyklem vytvoření, úpravy a zničení zásobníku pro složku aws-js-s3-folder. Nahlášení úspěšného testu bude trvat asi minutu:

$ go test .
PASS
ok      ... 43.993s

Existuje mnoho možností, jak přizpůsobit chování těchto testů. Zobrazit úplný seznam možností. ve struktuře ProgramTestOptions. Můžete například nakonfigurovat koncový bod Jaeger pro trasování (Tracing), uveďte, že očekáváte, že test selže, pokud je test negativní (ExpectFailure), aplikujte na program řadu „úprav“ pro sekvenční přechod stavů (EditDirs) a mnohem víc. Podívejme se, jak je použít k testování nasazení aplikace.

Kontrola vlastností zdroje

Výše popsaná integrace zajišťuje, že náš program „funguje“ – nepadá. Co když ale chceme zkontrolovat vlastnosti výsledného zásobníku? Například, že určité typy zdrojů byly (nebo nebyly) poskytovány a že mají určité atributy.

Parametr ExtraRuntimeValidation pro ProgramTestOptions nám umožňuje podívat se na stav po nasazení zaznamenaný Pulumi, abychom mohli provádět další kontroly. To zahrnuje kompletní snímek stavu výsledného zásobníku, včetně konfigurace, exportovaných výstupních hodnot, všech zdrojů a jejich hodnot vlastností a všech závislostí mezi zdroji.

Abychom viděli základní příklad tohoto, zkontrolujme, že náš program nějaký vytvořil Kbelík S3:

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

Nyní, když spustíme go test, projde nejen baterií testů životního cyklu, ale také po úspěšném nasazení zásobníku provede dodatečnou kontrolu výsledného stavu.

Runtime testy

Doposud byly všechny testy čistě o chování při nasazení a modelu zdrojů Pulumi. Co když chcete ověřit, že vaše zřízená infrastruktura skutečně funguje? Například, že virtuální stroj běží, bucket S3 obsahuje to, co očekáváme, a tak dále.

Možná jste již uhodli, jak to udělat: možnost ExtraRuntimeValidation pro ProgramTestOptions - je to skvělá příležitost. V tomto okamžiku spustíte vlastní test Go s přístupem k úplnému stavu prostředků vašeho programu. Tento stav zahrnuje informace, jako jsou IP adresy virtuálních strojů, adresy URL a vše potřebné ke skutečné interakci s výslednými cloudovými aplikacemi a infrastrukturou.

Náš testovací program například exportuje vlastnost webEndpoint kýbl zvaný websiteUrl, což je úplná adresa URL, kde můžeme získat nakonfigurované index document. I když bychom mohli zapátrat ve státní složce a najít bucket a číst tuto vlastnost přímo, ale v mnoha případech naše zásobníky exportují užitečné vlastnosti, jako je tato, které považujeme za vhodné pro kontrolu:

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

Stejně jako naše předchozí runtime kontroly bude tato kontrola provedena okamžitě po zvýšení zásobníku, to vše v reakci na jednoduché volání go test. A to je jen špička ledovce – k dispozici je každá testovací funkce Go, kterou můžete napsat do kódu.

Průběžná integrace infrastruktury

Je dobré mít možnost spouštět testy na notebooku, když se provádí spousta změn infrastruktury, aby se otestovaly, než je odešlete ke kontrole kódu. Ale my a mnoho našich klientů testujeme infrastrukturu v různých fázích životního cyklu vývoje:

  • V každém otevřeném požadavku na vytažení pro testování před sloučením.
  • V reakci na každé potvrzení znovu zkontrolujte, zda bylo sloučení provedeno správně.
  • Pravidelně, například v noci nebo týdně pro dodatečné testování.
  • Jako součást výkonu nebo zátěžového testování, které obvykle běží po dlouhou dobu a spouští testy paralelně a/nebo nasazuje stejný program vícekrát.

U každého z nich Pulumi podporuje integraci s vaším oblíbeným systémem kontinuální integrace. Díky nepřetržité integraci získáte stejné testovací pokrytí vaší infrastruktury jako vašeho aplikačního softwaru.

Pulumi podporuje běžné CI systémy. Tady jsou některé z nich:

Podrobnější informace naleznete v dokumentaci k Continuous Delivery.

Pomíjivá prostředí

Velmi silnou příležitostí, která se otevírá, je možnost nasadit pomíjivá prostředí výhradně pro účely akceptačního testování. Pojem projekty a zásobníky Pulumi je navržen tak, aby bylo možné snadno nasadit a zničit zcela izolovaná a nezávislá prostředí, to vše pomocí několika jednoduchých příkazů CLI nebo pomocí rámce pro testování integrace.

Pokud používáte GitHub, pak Pulumi nabízí Aplikace GitHub, který vám pomůže propojit akceptační testování s požadavky na stahování v rámci vašeho kanálu CI. Stačí nainstalovat aplikaci do úložiště GitHub a Pulumi přidá informace o náhledech infrastruktury, aktualizacích a výsledcích testování do vašich požadavků CI a fondu:

Testování infrastruktury jako kódu s Pulumi. Část 2

Když Pulumi použijete pro své základní akceptační testy, získáte nové možnosti automatizace, které zlepší produktivitu týmu a poskytnou vám důvěru v kvalitu vašich změn.

Celkový

V tomto článku jsme viděli, že používáním programovacích jazyků pro všeobecné použití se nám zpřístupňuje mnoho technik vývoje softwaru, které byly užitečné při vývoji našich aplikací. Zahrnují testování jednotek, testování integrace a způsob jejich vzájemné spolupráce při provádění rozsáhlého testování za běhu. Testy lze snadno spouštět na vyžádání nebo ve vašem systému CI.

Pulumi - open source software, zdarma k použití a funguje s vašimi oblíbenými programovacími jazyky a cloudy - zkuste to dnes!

První část

Zdroj: www.habr.com

Přidat komentář