Infrastruktúra tesztelése kódként a Pulumival. 2. rész

Sziasztok. Ma megosztjuk veletek a cikk utolsó részét. "Infrastruktúra tesztelése kódként a Pulumival", melynek fordítása kifejezetten kurzusos hallgatók számára készült "DevOps gyakorlatok és eszközök".

Infrastruktúra tesztelése kódként a Pulumival. 2. rész

Telepítési tesztelés

Ez a tesztelési stílus hatékony megközelítés, és lehetővé teszi számunkra, hogy fehérdobozos tesztelést hajtsunk végre infrastruktúra kódunk belső működésének tesztelésére. Ez azonban némileg korlátozza azt, amit tesztelhetünk. A tesztek a Pulumi által a tényleges üzembe helyezés előtt készített memórián belüli telepítési terv alapján történnek, ezért maga a telepítés nem tesztelhető. Ilyen esetekre a Pulumi rendelkezik egy integrációs teszt keretrendszerrel. És ez a két megközelítés remekül működik együtt!

A Pulumi integrációs tesztelési keretrendszer Go nyelven íródott, így teszteljük a legtöbb belső kódot. Míg a korábban tárgyalt egységtesztelési megközelítés inkább a fehér dobozos teszteléshez hasonlított, az integrációs tesztelés egy fekete doboz. (Szigorú belső tesztelésre is van lehetőség.) Ez a keretrendszer úgy jött létre, hogy egy komplett Pulumi programot vegyen, és különböző életciklus-műveleteket hajtson végre rajta, mint például egy új verem alapból üzembe helyezése, változatokkal való frissítése és törlése, esetleg többször is. . Rendszeresen (például éjszaka) és stressztesztként futtatjuk őket.

(Mi dolgozunk rajta, így hasonló integrációs tesztelési lehetőségek állnak rendelkezésre a nyelvek natív SDK-jában. A Go integrációs tesztelési keretrendszert attól függetlenül használhatja, hogy a Pulumi program milyen nyelven íródott).

A program ezen keretrendszer használatával történő futtatásával a következőket ellenőrizheti:

  • A projekt kódja szintaktikailag helyes, és hiba nélkül fut.
  • A verem és a titkok konfigurációs beállításai működnek és megfelelően értelmezik.
  • Projektje sikeresen telepíthető az Ön által választott felhőszolgáltatóban.
  • A projekt sikeresen frissíthető a kezdeti állapotról N másik állapotra.
  • Projektje sikeresen megsemmisíthető, és eltávolítható a felhőszolgáltatóból.

Amint azt hamarosan látni fogjuk, ez a keretrendszer futásidejű érvényesítés végrehajtására is használható.

Egyszerű integrációs teszt

Ahhoz, hogy ezt működés közben lássuk, megnézzük az adattárat pulumi/examples, mivel csapatunk és a Pulumi közösség saját lehívási kérelmeink, commit-jaink és éjszakai buildjeink tesztelésére használja.

Az alábbiakban egy egyszerűsített tesztünk látható példa, amely S3 gyűjtődobozt és néhány más objektumot biztosít:

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

Ez a teszt végigmegy a mappák veremének létrehozásának, módosításának és megsemmisítésének alapvető életciklusán aws-js-s3-folder. Körülbelül egy percet vesz igénybe a sikeres teszt jelentése:

$ go test .
PASS
ok      ... 43.993s

Számos lehetőség van ezeknek a teszteknek a viselkedésének testreszabására. Tekintse meg a lehetőségek teljes listáját. a szerkezetben ProgramTestOptions. Például beállíthatja a Jaeger végpontot, hogy nyomon kövesse (Tracing), jelezze, hogy várhatóan a teszt sikertelen lesz, ha a teszt negatív (ExpectFailure), alkalmazzon egy sor „szerkesztést” a programon az állapotok szekvenciális átmenetéhez (EditDirs) és még sok más. Nézzük meg, hogyan használhatjuk őket az alkalmazás üzembe helyezésének tesztelésére.

Az erőforrás tulajdonságainak ellenőrzése

A fent tárgyalt integráció biztosítja, hogy programunk „működjön” – ne omoljon össze. De mi van akkor, ha ellenőrizni akarjuk a kapott verem tulajdonságait? Például, hogy bizonyos típusú erőforrások ki vannak építve (vagy nincsenek), és bizonyos attribútumokkal rendelkeznek.

Paraméter ExtraRuntimeValidation a ProgramTestOptions lehetővé teszi, hogy megnézzük a Pulumi által rögzített üzembe helyezés utáni állapotot, így további ellenőrzéseket végezhetünk. Ez magában foglalja az eredményül kapott verem állapotának teljes pillanatfelvételét, beleértve a konfigurációt, az exportált kimeneti értékeket, az összes erőforrást és tulajdonságaik értékét, valamint az erőforrások közötti összes függőséget.

Ennek egy alapvető példájának megtekintéséhez nézzük meg, hogy a programunk létrehoz egyet S3 Vödör:

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

Most, amikor elindítjuk a go tesztet, nem csak egy sor életciklus-teszten megy keresztül, hanem a verem sikeres telepítése után további ellenőrzést is végez az eredményül kapott állapoton.

Futásidejű tesztek

Eddig minden teszt pusztán a telepítési viselkedésre és a Pulumi erőforrásmodellre vonatkozott. Mi a teendő, ha ellenőrizni szeretné, hogy a kiépített infrastruktúra valóban működik-e? Például, hogy a virtuális gép fut, az S3 vödör azt tartalmazza, amit várunk, és így tovább.

Lehet, hogy már sejtette, hogyan kell ezt megtenni: opció ExtraRuntimeValidation a ProgramTestOptions - ez egy remek lehetőség erre. Ezen a ponton lefuttat egy egyéni Go-tesztet, amely hozzáférést biztosít a program erőforrásainak teljes állapotához. Ez az állapot olyan információkat tartalmaz, mint a virtuális gépek IP-címei, URL-címei és minden, ami a létrejövő felhőalkalmazásokkal és infrastruktúrával való tényleges interakcióhoz szükséges.

Például a tesztprogramunk exportálja a tulajdonságot webEndpoint vödör hívott websiteUrl, amely a teljes URL, ahol a konfigurált index document. Bár beleáshatnánk az állapotfájlba, hogy megtaláljuk bucket és közvetlenül olvassa el azt a tulajdonságot, de sok esetben veremeink olyan hasznos tulajdonságokat exportálnak, mint ez, amelyeket kényelmesnek találunk az ellenőrzéshez:

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

A korábbi futásidejű ellenőrzéseinkhez hasonlóan ez az ellenőrzés is azonnal végrehajtódik a verem emelése után, mindezt egy egyszerű hívásra válaszul go test. És ez csak a jéghegy csúcsa – minden Go tesztfunkció, amit kódba írhat, elérhető.

Folyamatos infrastruktúra-integráció

Jó, ha teszteket futtathat egy laptopon, amikor sok infrastruktúra-módosítást hajtanak végre, hogy teszteljék őket, mielőtt elküldik őket kódellenőrzésre. De mi és sok ügyfelünk teszteljük az infrastruktúrát a fejlesztési életciklus különböző szakaszaiban:

  • Minden nyitott lehívási kérelemben az összevonás előtti tesztelésre.
  • Válaszul minden véglegesítésre, még egyszer ellenőrizze, hogy az egyesítés helyesen történt-e.
  • Rendszeresen, például éjszaka vagy hetente további vizsgálatok céljából.
  • Teljesítmény- vagy stresszteszt részeként, amely jellemzően hosszú ideig fut, és párhuzamosan futtatja a teszteket és/vagy többször telepíti ugyanazt a programot.

Ezek mindegyikénél a Pulumi támogatja az integrációt kedvenc folyamatos integrációs rendszerével. Folyamatos integrációval ez ugyanolyan tesztlefedettséget biztosít az infrastruktúra számára, mint az alkalmazásszoftver számára.

A Pulumi támogatja az általános CI-rendszereket. Itt van néhány közülük:

További részletekért kérjük, tekintse meg a(z) dokumentációját Folyamatos szállítás.

Efemer környezetek

Egy nagyon hatékony lehetőség, amely megnyílik, az a képesség, hogy efemer környezeteket telepítsünk kizárólag elfogadási tesztelési célokra. Koncepció projektek és halmok A Pulumi-t úgy tervezték, hogy egyszerűen telepítse és lebontsa a teljesen elszigetelt és független környezeteket, mindezt néhány egyszerű CLI-parancs vagy integrációs tesztelési keretrendszer segítségével.

Ha GitHubot használ, akkor a Pulumi kínálja GitHub App, amely segít az elfogadási tesztelés összekapcsolásában a kérések lehívásához a CI-folyamatban. Csak telepítse az alkalmazást a GitHub adattárba, és a Pulumi információkat ad az infrastruktúra előnézeteiről, frissítéseiről és tesztelési eredményeiről a CI és a pool kéréseihez:

Infrastruktúra tesztelése kódként a Pulumival. 2. rész

Ha a Pulumit használja az alapvető elfogadási tesztekhez, új automatizálási képességekre tesz szert, amelyek javítják a csapat termelékenységét, és bizalmat adnak a változtatások minőségében.

Teljes

Ebben a cikkben láthattuk, hogy az általános célú programozási nyelvek használatával számos olyan szoftverfejlesztési technika válik elérhetővé számunkra, amelyek hasznosak voltak alkalmazásaink fejlesztésében. Ezek magukban foglalják az egységtesztelést, az integrációs tesztelést, valamint azt, hogy hogyan működnek együtt a kiterjedt futásidejű tesztelés során. A tesztek igény szerint vagy a CI rendszerben könnyen futtathatók.

Pulumi - nyílt forráskódú szoftver, ingyenesen használható és működik kedvenc programozási nyelveivel és felhőivel - próbáld ki még ma!

Első rész

Forrás: will.com

Hozzászólás