Ahojte. Dnes sa s vami delíme o poslednú časť článku , ktorého preklad bol pripravený špeciálne pre študentov kurzu .

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 , 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 :
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 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 .
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 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 , 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:

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 — !
→
Zdroj: habr.com
