Ahoj všichni. Dnes s vámi sdílíme závěrečnou část článku.
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
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
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í. 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
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
Pokud používáte GitHub, pak Pulumi nabízí
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 -
→
Zdroj: www.habr.com