Testen Infrastruktur als Code mat Pulumi. Deel 2

Moien alleguer. Haut deele mir Iech de leschten Deel vum Artikel. "Test Infrastruktur als Code mat Pulumi", d'Iwwersetzung vun deem speziell fir Course Studenten virbereet gouf "DevOps Praktiken an Tools".

Testen Infrastruktur als Code mat Pulumi. Deel 2

Deployment Testen

Dësen Teststil ass eng mächteg Approche an erlaabt eis White Box Tester auszeféieren fir d'intern Aarbecht vun eisem Infrastrukturcode ze testen. Wéi och ëmmer, et limitéiert e bësse wat mir testen kënnen. D'Tester ginn op Basis vum In-Memory Deployment Plang erstallt vum Pulumi virun der aktueller Deployment gemaach an dofir kann d'Deployment selwer net getest ginn. Fir esou Fäll huet Pulumi en Integratiounstestkader. An dës zwou Approche funktionnéieren super zesummen!

De Pulumi Integratiounstestkader ass a Go geschriwwen, dat ass wéi mir de gréissten Deel vun eisem internen Code testen. Wärend déi virdru diskutéiert Eenheetstest Approche méi wéi wäiss Box Testen war, ass Integratiounstest eng schwaarz Këscht. (Et ginn och Méiglechkeete fir rigoréis intern Testen.) Dëse Kader gouf geschaf fir e komplette Pulumi Programm ze huelen a verschidde Liewenszyklus Operatiounen drop auszeféieren, sou wéi en neie Stack vun Null ofzesetzen, et mat Variatiounen ze aktualiséieren an ze läschen, méiglecherweis e puer Mol . Mir lafen se regelméisseg (zum Beispill an der Nuecht) an als Stress Tester.

(Mir mir schaffen drun, sou datt ähnlech Integratiounstestméiglechkeeten an der gebierteg SDK vu Sprooche verfügbar sinn. Dir kënnt de Go Integratiounstestkader benotzen onofhängeg vun der Sprooch an där Äre Pulumi Programm geschriwwen ass).

Andeems Dir de Programm mat dësem Kader benotzt, kënnt Dir déi folgend kontrolléieren:

  • Äre Projetcode ass syntaktesch korrekt a leeft ouni Feeler.
  • D'Stack a Geheimnisser Konfiguratiounsastellungen funktionnéieren a ginn korrekt interpretéiert.
  • Äre Projet kann erfollegräich am Cloud Provider vun Ärer Wiel agesat ginn.
  • Äre Projet kann erfollegräich aus dem initialen Zoustand op N aner Staaten Upgrade ginn.
  • Äre Projet kann erfollegräich zerstéiert an aus Ärem Cloud Provider geläscht ginn.

Wéi mir kuerz gesinn, kann dëse Kader och benotzt ginn fir d'Runtime Validatioun auszeféieren.

Einfach Integratioun Test

Fir dëst an Aktioun ze gesinn, wäerte mir de Repository kucken pulumi/examples, wéi eist Team an d'Pulumi Gemeinschaft et benotzt fir eis eegen Pull-Ufroen ze testen, engagéiert an d'Nuetsbau.

Drënner ass e vereinfacht Test vun eisem Beispill datt S3 Eemer an e puer aner Objete gëtt:

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

Dësen Test geet duerch de Basis Liewenszyklus fir e Stack fir en Dossier ze kreéieren, z'änneren an ze zerstéieren aws-js-s3-folder. Et dauert ongeféier eng Minutt fir e passéierten Test ze berichten:

$ go test .
PASS
ok      ... 43.993s

Et gi vill Optiounen fir d'Behuele vun dësen Tester ze personaliséieren. Gesinn voll Lëscht vun Optiounen. an der Struktur ProgramTestOptions. Zum Beispill kënnt Dir de Jaeger Endpunkt konfiguréieren fir ze verfolgen (Tracing), uginn datt Dir erwaart datt den Test versoen wann den Test negativ ass (ExpectFailure), gëllen eng Serie vun "Ännerungen" op de Programm fir e sequentiellen Iwwergang vu Staaten (EditDirs) a vill méi. Loosst eis kucken wéi Dir se benotzt fir Är Uwendungsdeployment ze testen.

Iwwerpréift Ressource Eegeschafte

D'Integratioun uewen diskutéiert garantéiert datt eise Programm "fonctionnéiert" - et crasht net. Awer wat wa mir d'Eegeschafte vum resultéierende Stack wëllen iwwerpréiwen? Zum Beispill, datt verschidden Aarte vu Ressourcen (oder net) zur Verfügung gestallt goufen an datt se bestëmmten Attributer hunn.

Parameter ExtraRuntimeValidation fir ProgramTestOptions erlaabt eis de Post-Deployment Staat ze kucken, dee vum Pulumi opgeholl gouf, sou datt mir zousätzlech Kontrolle kënne maachen. Dëst beinhalt e komplette Snapshot vum Zoustand vum resultéierende Stack, inklusiv Konfiguratioun, exportéiert Ausgangswäerter, all Ressourcen an hir Eegeschafte Wäerter, an all Ofhängegkeet tëscht Ressourcen.

Fir e Basis Beispill vun dësem ze gesinn, loosst eis kucken ob eise Programm een ​​erstellt S3 Becher:

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

Elo, wa mir go Test lafen, wäert et net nëmmen duerch eng Batterie vu Liewenszyklus Tester goen, awer och, nodeems de Stack erfollegräich ofgebaut gouf, wäert et eng zousätzlech Kontroll iwwer de resultéierende Staat maachen.

Runtime Tester

Bis elo waren all Tester reng iwwer Deploymentverhalen an de Pulumi Ressourcemodell. Wat wann Dir wëllt verifizéieren datt Är virgesinn Infrastruktur tatsächlech funktionnéiert? Zum Beispill, datt déi virtuell Maschinn leeft, de S3 Eemer enthält wat mir erwaarden, a sou weider.

Dir hutt vläicht scho virgestallt wéi Dir dëst maacht: Optioun ExtraRuntimeValidation fir ProgramTestOptions - dëst ass eng super Geleeënheet fir dëst. Zu dësem Zäitpunkt leeft Dir e personaliséierte Go Test mat Zougang zum vollen Zoustand vun Ärem Programmressourcen. Dëse Staat enthält Informatioun wéi virtuell Maschinn IP Adressen, URLen, an alles wat néideg ass fir tatsächlech mat der resultéierender Cloud Uwendungen an Infrastruktur ze interagéieren.

Zum Beispill exportéiert eisen Testprogramm d'Propriétéit webEndpoint Eemer genannt websiteUrl, dat ass déi komplett URL wou mir d'konfiguréiert kréien index document. Obwuel mir kënnen an de Staat Dossier Gruef ze fannen bucket a liest dës Immobilie direkt, awer a ville Fäll exportéieren eis Stack nëtzlech Eegeschafte wéi dës, déi mir bequem fannen fir ze kontrolléieren:

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

Wéi eis virdru Runtime Kontrollen, gëtt dëse Scheck direkt nodeems de Stack erhéicht gouf, alles an Äntwert op en einfachen Uruff ausgefouert. go test. An dat ass just den Tipp vum Äisbierg - all Go Test Feature déi Dir am Code schreiwen kënnt ass verfügbar.

Kontinuéierlech Infrastruktur Integratioun

Et ass gutt Tester op engem Laptop auszeféieren wann vill Infrastrukturännerunge gemaach gi fir se ze testen ier Dir se fir Code review ofginn. Awer mir a vill vun eise Clienten testen Infrastruktur a verschiddene Stadien vum Entwécklungsliewenszyklus:

  • An all oppene Pull Ufro fir Tester virum Fusioun.
  • Als Äntwert op all Engagement, fir duebel ze kontrolléieren ob d'Fusioun richteg gemaach gouf.
  • Periodesch, sou wéi an der Nuecht oder wöchentlech fir zousätzlech Tester.
  • Als Deel vun der Leeschtung oder Stress Testen, déi typesch iwwer eng laang Zäit leeft an Tester parallel leeft an/oder dee selwechte Programm e puer Mol ofsetzt.

Fir jiddereng vun dësen ënnerstëtzt Pulumi Integratioun mat Ärem Liiblings kontinuéierlechen Integratiounssystem. Mat kontinuéierlecher Integratioun gëtt dëst Iech déiselwecht Testofdeckung fir Är Infrastruktur wéi fir Är Applikatiounssoftware.

Pulumi huet Ënnerstëtzung fir gemeinsam CI Systemer. Hei sinn e puer vun hinnen:

Fir méi detailléiert Informatiounen, kuckt w.e.g. op d'Dokumentatioun fir Kontinuéierlech Liwwerung.

Ephemeral Ëmfeld

Eng ganz mächteg Geleeënheet déi opmaacht ass d'Fäegkeet fir ephemeral Ëmfeld eleng fir Akzeptanztestzwecker z'installéieren. Konzept Projeten a Stack Pulumi ass entwéckelt fir ganz isoléiert an onofhängeg Ëmfeld einfach z'installéieren an ze räissen, alles an e puer einfache CLI Kommandoen oder mat engem Integratiounstestkader.

Wann Dir GitHub benotzt, da bitt Pulumi GitHub App, wat Iech hëlleft Akzeptanztest ze verbannen fir Ufroen an Ärer CI Pipeline ze zéien. Installéiert just d'Applikatioun am GitHub Repository, a Pulumi wäert Informatioun iwwer Infrastrukturvirschau, Updates an Testresultater op Är CI a Pool Ufroen addéieren:

Testen Infrastruktur als Code mat Pulumi. Deel 2

Wann Dir Pulumi fir Är Kär Akzeptanz Tester benotzt, kritt Dir nei Automatisatiounsfäegkeeten déi Teamproduktivitéit verbesseren an Iech Vertrauen an d'Qualitéit vun Ären Ännerungen ginn.

D 'Resultat

An dësem Artikel hu mir gesinn datt duerch allgemeng Zwecker Programméierungssprooche vill Softwareentwécklungstechnike fir eis verfügbar ginn, déi nëtzlech waren fir eis Uwendungen z'entwéckelen. Si enthalen Eenheetstesten, Integratiounstesten, a wéi se zesumme schaffen fir extensiv Runtime Tester auszeféieren. Tester sinn einfach op Ufro oder an Ärem CI System ze lafen.

Pulumi - Open Source Software, gratis ze benotzen a funktionnéiert mat Äre Liiblingsprogramméierungssproochen a Wolleken - probéieren et haut!

Éischten Deel

Source: will.com

Setzt e Commentaire