Ahoj všem. Dnes se s vámi dělíme o závěrečnou část článku , jehož překlad byl speciálně připraven pro studenty kurzu .

Testování nasazení
Zvážený styl testování je mocný přístup, který nám umožňuje provádět testování bílého boxu pro ověření vnitřních funkcí našeho infrastrukturního kódu. Avšak omezuje, co můžeme testovat. Testy se provádějí na základě in-memory plánu nasazení, který Pulumi vytvořilo před skutečným nasazením, a proto nemůžeme testovat samotné nasazení. Pro takové případy má Pulumi rámec integračních testů. A tyto dva přístupy skvěle spolupracují!
Rámec integračního testování Pulumi je napsán v Go a právě s jeho pomocí testujeme většinu našeho interního kódu. Pokud byl dříve zvažovaný přístup modulárního testování více podobný testování bílého boxu, pak integrované testování je černý box. (Existují také varianty pečlivého interního testování.) Tento rámec byl vytvořen pro to, aby vzal kompletní program Pulumi a provedl různé operace životního cyklu, jako je nasazení nového stacku od nuly, jeho aktualizace s variacemi a odstranění, možná několikrát. Provádíme je pravidelně (např. v noci) a jako stresové testy.
(Pracujeme , aby podobné možnosti integračního testování byly v nativním SDK jazyků. Můžete používat rámec integračního testování Go nezávisle na jazyce, ve kterém je váš program Pulumi napsán).
Po spuštění programu pomocí tohoto rámce můžete ověřit následující:
- Kód vašeho projektu je syntakticky správný a funguje bez chyb.
- Nastavení konfigurace stacku a tajemství fungují a jsou správně interpretována.
- Váš projekt může být úspěšně nasazen u vámi vybraného poskytovatele cloudových služeb.
- Váš projekt může být úspěšně aktualizován z výchozího stavu na N dalších stavů.
- Váš projekt může být úspěšně zničen a odstraněn z vašeho poskytovatele cloudových služeb.
Jak brzy uvidíme, tento rámec lze použít také pro provádění runtime validace.
Jednoduchý integrační test
Abychom to viděli v akci, podíváme se na repozitář pulumi/examples, protože náš tým a komunita Pulumi jej používají k testování vlastních pull requestů, commitů a nočních buildů.
Níže je zjednodušený test našeho :
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 vytváření, změny a ničení stacku pro složku aws-js-s3-folder. Bude trvat asi minutu, než se otestování úspěšně projde:
$ go test .
PASS
ok ... 43.993s Existuje mnoho parametrů pro nastavení chování těchto testů. Úplný seznam možností naleznete ProgramTestOptions. Například můžete nastavit Jaeger endpoint pro sledování (Tracing), určit, že očekáváte selhání testu při negativním testování (ExpectFailure), aplikovat sérii „úprav“ programu pro sekvenční přechod stavů (EditDirs) a mnohem více. Podívejme se, jak je použít k ověření nasazení aplikace.
Ověření vlastností zdrojů
Integrace, o které jsme mluvili výše, zajišťuje, že naše aplikace funguje — neselže. Ale co když chceme ověřit vlastnosti získaného stacku? Například, že určité typy zdrojů byly (nebo nebyly) vytvořeny a že mají určité atributy.
Parameter ExtraRuntimeValidation pro ProgramTestOptions nám umožňuje podívat se na stav, který Pulumi zaznamenal po nasazení (post-deployment state), abychom mohli provést další kontroly. Tím se zahrnuje kompletní snímek stavu výsledného stacku, včetně konfigurace, exportovaných výstupních hodnot, všech zdrojů a hodnot jejich vlastností, jakož i všech závislostí mezi zdroji.
Abychom viděli základní příklad tohoto, pojďme zkontrolovat, že naše aplikace vytváří jeden S3 bucket:
integration.ProgramTest(t, &integration.ProgramTestOptions{
\/\/ jako dříve...
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čekávali jsme, že najdeme jediný AWS S3 Bucket")
},
})Nyní, když spustíme go test, neprojde pouze sadou testů životního cyklu, ale také po úspěšném nasazení zásobníku provede další kontrolu výsledného stavu.
Runtime testy
Dosud byly všechny testy výhradně o chování při nasazení a o modelu zdrojů Pulumi. Co dělat, pokud chcete zkontrolovat, že vaše připravená infrastruktura skutečně funguje? Například, že virtuální stroj běží, S3 bucket obsahuje to, co očekáváme, a tak dále.
Možná už tušíte, jak to udělat: možnost ExtraRuntimeValidation pro ProgramTestOptions — je pro to skvělá příležitost. V této fázi spouštíte libovolný test Go s přístupem k plnému stavu zdrojů vaší aplikace. Tento stav zahrnuje informace jako IP adresy virtuálních strojů, URL adresy a vše, co je potřeba pro skutečnou interakci s nasazenými cloudovými aplikacemi a infrastrukturou.
Například naše testovací aplikace exportuje vlastnost webEndpoint bucketu s názvem websiteUrl, která představuje úplný URL adresu, na které můžeme získat nastavený index document. I když bychom se mohli ponořit do souboru stavu, abychom našli bucket a přečetli tuto vlastnost přímo, v mnoha případech naše zásobníky exportují užitečné vlastnosti, jako je tato, které nám usnadňují použití pro kontrolu:
integration.ProgramTest(t, &integration.ProgramTestOptions{
\/\/ jako dříve ...
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, tato kontrola bude provedena okamžitě po zvednutí zásobníku a to vše v reakci na jednoduché zavolání go test. A to je teprve špička ledovce – všechny testovací možnosti Go, které můžete napsat do kódu, jsou k dispozici.
Nepřetržitá integrace infrastruktury
Je dobré mít možnost spouštět testy na notebooku, když se provádí mnoho změn v infrastruktuře, aby se ověřily před odesláním na revizi kódu. Ale my a mnozí naši klienti testujeme infrastrukturu v různých fázích životního cyklu vývoje:
- V každém otevřeném pull requestu pro testování před sloučením.
- V reakci na každý commit, abychom znovu zkontrolovali, že sloučení proběhlo správně.
- Pravidelně, například v noci nebo jednou týdně pro další testování.
- V rámci testování výkonu nebo zátěžového testování, která obvykle probíhá po delší období a spouští testy paralelně a/nebo nasazují stejný program několikrát.
Pro každého z nich Pulumi podporuje integraci s vaším oblíbeným systémem nepřetržité integrace. S nepřetržitou integrací to poskytuje stejnou úroveň testování pro vaši infrastrukturu, jakou máte pro aplikační software.
Pulumi má podporu pro běžné CI systémy. Zde je několik z nich:
Pro více informací se obraťte na dokumentaci k .
Efemérní prostředí
Velmi silná funkce, která se otvírá, je možnost nasazovat efemérní prostředí výhradně pro účely akceptačního testování. Koncept Pulumi je navržena tak, aby bylo snadné nasadit a zrušit plně izolovaná a nezávislá prostředí, vše pomocí několika jednoduchých CLI příkazů nebo prostřednictvím rámce integrovaného testování.
Pokud používáte GitHub, Pulumi nabízí , které vám pomůže propojit akceptační testování s pull requesty uvnitř vašeho CI pipeline. Stačí nainstalovat aplikaci do repozitáře GitHub a Pulumi do vašeho CI a do pull requestů se přidá informace o náhledu infrastruktury, aktualizacích a výsledcích testování:

Při používání Pulumi pro vaše hlavní akceptační testy získáte nové možnosti automatizace, které zlepší výkon týmu a zvýší důvěru v kvalitu změn.
Výsledek
V tomto článku jsme viděli, že používáním jazyků obecného účelu máme k dispozici mnoho metod vývoje softwaru, které byly užitečné při vývoji našich aplikací. Ty zahrnují moduly testování, integrační testování a také jejich interakci pro provádění rozsáhlého runtime testování. Testy lze snadno spouštět na požádání nebo ve vašem CI systému.
Pulumi — je software s otevřeným zdrojovým kódem, je zdarma k použití a funguje s vašimi oblíbenými programovacími jazyky a cloudy — !
→
Zdroj: habr.com
