Infrastruktúra tesztelése kódként Pulumi segítségével. 2. rész

Mindenki helló. Ma megosztjuk veletek a cikk utolsó részét „Infrastruktúra tesztelése kódként Pulumi segítségével”, amelyet kifejezetten a kurzus hallgatói számára készítettünk az új fordítást osztjuk meg veletek. Induljunk..

Infrastruktúra tesztelése kódként Pulumi segítségével. 2. rész

Telepítés tesztelése

A tárgyalt tesztelési stílus egy erőteljes megközelítés, amely lehetővé teszi számunkra az infrastruktúra kódunk belső működésének ellenőrzésére irányuló fehér dobozos tesztelés végrehajtását. Azonban némi korlátozást is jelent arra, hogy mit ellenőrizhetünk. A tesztek a Pulumi által közvetlen telepítés előtt létrehozott in-memory telepítési terv alapján hajtódnak végre, és ezért a telepítést magát nem lehet tesztelni. Az ilyen esetekre a Pulumi integrációs tesztelési keretrendszert biztosít. Ezek a megközelítések remekül működnek együtt!

A Pulumi integrációs tesztelési keretrendszere Go nyelven íródott, és éppen ezt használjuk belső kódunk nagy részének tesztelésére. Ha a korábban tárgyalt moduláris tesztelési megközelítés inkább a fehér dobozos teszteléshez hasonlított, az integrációs tesztelés a fekete dobozos teszteléshez. (Vannak alapos belső tesztelési lehetőségek is.) Ezt a keretrendszert azért hozták létre, hogy egy teljes Pulumi programot vegyen és különböző életciklus-műveleteket végezzen, mint például egy új verem telepítése a nulláról, annak frissítése variációkkal és törlése, akár többször is. Rendszeresen futtatjuk őket (például éjszaka) és stresszteszteként.

(Dolgozunk azon, hogy hasonló integrációs tesztelési lehetőségek legyenek a nyelvek natív SDK-jában. Az integrációs tesztelési keretrendszert függetlenül használhatja attól a nyelvtől, amelyen a Pulumi programja íródott.)A keretrendszer segítségével futó program futtatása során ellenőrizheti a következőket:

A projekt kódja szintaktikailag helyes és hibák nélkül működik.

  • A verem és a titkok konfigurációs beállításai működnek és helyesen értelmeződnek.
  • A projekt sikeresen telepíthető a választott felhőszolgáltatónál.
  • A projekt sikeresen frissíthető a kezdeti állapotból N más állapotra.
  • A projekt sikeresen megsemmisíthető és eltávolítható a felhőszolgáltatójából.
  • Amint hamarosan láthatjuk, ezt a keretrendszert a futási idő validálására is fel lehet használni.

Как мы скоро увидим, этот фреймворк можно использовать также для выполнения runtime-валидации.

Egyszerű integrációs teszt

A működés megtekintéséhez nézzük meg a tárolót pulumi/examples, mivel a Pulumi csapatunk és közösségünk használja a saját pull requestjeik, commitjaik és éjszakai buildjeik tesztelésére.

Az alábbiakban egy leegyszerűsített teszt található, amely provisionálja az S3 tárolót és néhány más objektumot:

example_test.go:

csomag teszt
 
import (
    "os"
    "path"
    "testing"
 
    "github.com/pulumi/pulumi/pkg/testing/integration"
)
 
funk 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,
        },
    })
}

Ez a teszt végigmegy egy alapvető életcikluson, amely a stack létrehozását, módosítását és megsemmisítését foglalja magában az aws-js-s3-foldermappáért. Körülbelül egy percet vesz igénybe a teszt bejelentéséhez:

$ go test .
PASS
ok      ... 43.993s

Sok paraméter áll rendelkezésre a tesztek viselkedésének testreszabásához. A lehetőségek teljes listáját lásd a struktúrában ProgramTestOptions. Például beállíthatja a Jaeger végpontot a nyomkövetéshez (Nyomkövetés), megadhatja, hogy negatív tesztelés során várja a teszt hibáját (ElvártHiba), alkalmazhat egy sor "javítást" a programra az állapotok sorozatos váltásához (EditDirs) és még sok mást. Nézzük meg, hogyan használhatjuk őket az alkalmazás telepítésének ellenőrzésére.

Erőforrások tulajdonságainak ellenőrzése

A fent említett integráció garantálja, hogy a programunk "működik" - nem hibázik. De mi van, ha azt akarjuk ellenőrizni, hogy a létrehozott stack milyen tulajdonságai vannak? Például, hogy bizonyos típusú erőforrások elő legyenek készítve (vagy ne legyenek), és hogy milyen saját attribútumaik vannak.

A parameter ExtraFuttatásiValidáció a ProgramTestOptions lehetővé teszi számunkra, hogy megnézzük az állapotot, amelyet a Pulumi rögzített a telepítés után (post-deployment state), így további ellenőrzéseket végezhetünk. Ez tartalmaz egy teljes pillanatfelvételt az eredmény stack állapotáról, beleértve a konfigurációt, az exportált kimeneti értékeket, az összes erőforrást és azok tulajdonságainak értékeit, valamint az erőforrások közötti összes függőséget.

Egy alapvető példa megtekintéséhez ellenőrizzük, hogy a programunk létrehoz egy S3 Buckete-t:

  integration.ProgramTest(t, &integration.ProgramTestOptions{
        \/\/ ahogy korábban...
        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, "Várhatóan találni egy AWS S3 Buckettet")
        },
    })

Most, hogy futtatni fogjuk a go test-et, nemcsak átmegy a létfontosságú tesztelések sorozatán, hanem a verem sikeres telepítése után további ellenőrzést is fog végezni az eredmény állapotával kapcsolatban.

Futási tesztek

Eddig minden teszt kizárólag a telepítési viselkedésről és a Pulumi erőforrás modellről szólt. Mi a teendő, ha szeretnéd ellenőrizni, hogy az elkészített infrastruktúra valóban működik? Például, hogy a virtuális gép működik, az S3 bucket tartalmazza a várt dolgokat, és így tovább.

Valószínűleg már kitaláltad, hogyan lehet ezt megtenni: a lehetőség ExtraFuttatásiValidáció a ProgramTestOptions — nagyszerű alkalom erre. Ezen a ponton egy tetszőleges Go tesztet futtatsz, teljes hozzáféréssel a programod erőforrásainak állapotához. Ez az állapot olyan információkat tartalmaz, mint a virtuális gépek IP-címei, URL-címek és minden, ami szükséges a felhőalkalmazásokkal és infrastruktúrával való valós interakcióhoz.

Például, a tesztprogramunk exportálja a következő tulajdonságot webEndpoint bucket nevű websiteUrl, amely a teljes URL-cím, ahol elérhetjük a beállított index dokumentumot. Bár kereshetnénk az állományfájlban, hogy megtaláljuk tároló és közvetlenül olvashatnánk ezt a tulajdonságot, sok esetben a stackjeink hasznos tulajdonságokat exportálnak, mint ez, amelyeket kényelmes használni az ellenőrzéshez:

integration.ProgramTest(t, &integration.ProgramTestOptions{
            \/\/ ahogy korábban ...
        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!")
        },
    })

Ahogyan az előző futási ellenőrzéseink, ez az ellenőrzés is közvetlenül a verem felemelése után fog végrehajtásra kerülni, és mindez egy egyszerű hívásra válaszul go test. És ez még csak a jéghegy csúcsa — minden olyan tesztelési lehetőség elérhető, amelyet a Go-ban megírhat.

Folyamatos integrációs infrastruktúra

Jó dolog, hogy a sok változás során teszteket futhatunk a laptopon, hogy ellenőrizzük őket, mielőtt a kódellenőrzésre küldenénk. De mi és sok ügyfelünk az infrastruktúrát különböző fejlesztési életciklus szakaszokban teszteljük:

  • Minden nyitott pull request-ben a teszt számára a merge-elés előtt.
  • Minden commit-ra, hogy újraellenőrizzük, hogy a merge helyesen történt.
  • Időszakonként, például éjszaka vagy hetente az extra tesztelés érdekében.
  • Teljesítmény- vagy stressztesztelés keretében, amely általában hosszabb időn keresztül történik, párhuzamosan futtatva a teszteket és/vagy ugyanazt a programot többször telepítve.

Ezekhez a Pulumi támogatja a kedvenc folyamatos integrációs rendszerével való integrációt. Folyamatos integrálás esetén ugyanolyan tesztlefedettséget nyújt az infrastruktúrájához, mint az alkalmazásprogramokhoz.

A Pulumi támogatja a népszerű CI rendszereket. Itt van néhány közülük:

További részletekért kérjük, nézze meg a A Continuous Delivery.

Ephemeral környezetek

Egy nagyon erőteljes lehetőség, ami felmerül, az az, hogy kizárólag áttekintő tesztelés céljából ephemeral környezeteket telepíthetünk. A koncepció projektek és verem A Pulumi úgy van megtervezve, hogy könnyen telepíthessen és eltávolíthasson teljesen elszigetelt és független környezeteket, mindezt néhány egyszerű CLI parancs vagy integrációs tesztelő keretrendszer segítségével.

Ha GitHub-ot használ, a Pulumi kínál egy GitHub App, amely segít kapcsolódni az áttekintő teszteléshez a pull request-en belül a CI folyamatában. Egyszerűen telepítse az alkalmazást a GitHub tárhelyébe, és a Pulumi-t a CI-jébe, és a pull request-ekhez információt ad hozzá az infrastruktúra előnézetéről, frissítésekről és tesztelési eredményekről:

Infrastruktúra tesztelése kódként Pulumi segítségével. 2. rész

Ha a Pulumi-t használja alapvető áttekintési tesztjeihez, új automatizálási lehetőségek nyílnak meg, amelyek javítják a csapat teljesítményét és biztosítják a változások minőségét.

Result

A cikkben láthattuk, hogy a többcélú programozási nyelvek használatával számos szoftverfejlesztési módszer válik elérhetővé, amelyek hasznosak voltak alkalmazásaink fejlesztése során. Ezek közé tartozik a moduláris tesztelés, az integrációs tesztelés, valamint ezek kölcsönhatása a kiterjedt futásidejű tesztelés végrehajtásához. A tesztek könnyen futtathatók igény szerint vagy a CI-rendszerében.

Pulumi — nyílt forráskódú szoftver, ingyenesen használható, és kedvenc programozási nyelveiddel és felhőszolgáltatásaiddal dolgozik — próbáld ki még ma!

→ Első rész

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster