Sziasztok. Ma megosztjuk veletek a cikk utolsó részét.
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
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ó
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. 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
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ó
Ha GitHubot használ, akkor a Pulumi kínálja
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 -