Ynfrastruktuer testen as koade mei Pulumi. Diel 2

Hoi allegearre. Hjoed diele wy it lêste diel fan it artikel mei jo. "Test ynfrastruktuer as koade mei Pulumi", wêrfan de oersetting spesjaal foar kursusstudinten taret is "DevOps-praktiken en ark".

Ynfrastruktuer testen as koade mei Pulumi. Diel 2

Ynset testen

Dizze styl fan testen is in krêftige oanpak en lit ús testen fan wite doazen útfiere om de ynterne wurking fan ús ynfrastruktuerkoade te testen. It beheint lykwols wat wat wy kinne testen. De tests wurde útfierd op basis fan it yn-ûnthâld-ynsetplan makke troch Pulumi foar de eigentlike ynset en dêrom kin de ynset sels net hifke wurde. Foar sokke gefallen hat Pulumi in ramt foar yntegraasjetest. En dizze twa oanpakken wurkje geweldich tegearre!

It ramt foar Pulumi-yntegraasjetesten is skreaun yn Go, dat is hoe't wy it measte fan ús ynterne koade testen. Wylst de earder besprutsen oanpak fan ienheidstesten mear wie as testen fan wite doazen, is yntegraasjetesten in swarte doaze. (Der binne ek opsjes foar strang ynterne testen.) Dit ramt is makke om in folslein Pulumi-programma te nimmen en dêr ferskate libbenssyklusoperaasjes op út te fieren, lykas it ynsetten fan in nije stapel fanôf it begjin, it bywurkjen mei fariaasjes en it wiskjen, mooglik meardere kearen . Wy rinne se geregeld (bygelyks nachts) en as stresstests.

(Wy wy wurkje der oan, sadat ferlykbere yntegraasjetestmooglikheden beskikber binne yn 'e memmetaal SDK fan talen. Jo kinne it Go-yntegraasjetestkader brûke, nettsjinsteande de taal wêryn jo Pulumi-programma is skreaun).

Troch it programma út te fieren mei dit ramt kinne jo it folgjende kontrolearje:

  • Jo projektkoade is syntaktysk korrekt en rint sûnder flaters.
  • De konfiguraasje ynstellings foar stapel en geheimen wurkje en wurde korrekt ynterpretearre.
  • Jo projekt kin mei súkses ynset wurde yn 'e wolkprovider fan jo kar.
  • Jo projekt kin mei súkses opwurdearre wurde fan de earste steat nei N oare steaten.
  • Jo projekt kin mei súkses ferneatige en fuortsmiten wurde fan jo wolkprovider.

Lykas wy ynkoarten sille sjen, kin dit ramt ek brûkt wurde om runtime-validaasje út te fieren.

Ienfâldige yntegraasjetest

Om dit yn aksje te sjen, sille wy nei it repository sjen pulumi/examples, lykas ús team en de Pulumi-mienskip it brûkt om ús eigen pull-oanfragen, commits en nachtlike builds te testen.

Hjirûnder is in ferienfâldige test fan ús foarbyld dat jout S3 emmer en guon oare objekten:

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

Dizze test giet troch de basis libbenssyklus fan it meitsjen, feroarjen en ferneatigjen fan in stapel foar in map aws-js-s3-folder. It sil sawat in minút duorje om in slagge test te rapportearjen:

$ go test .
PASS
ok      ... 43.993s

D'r binne in protte opsjes om it gedrach fan dizze tests oan te passen. Sjoch folsleine list mei opsjes. yn de struktuer ProgramTestOptions. Jo kinne bygelyks Jaeger-einpunt ynstelle om te trace (Tracing), jouwe oan dat jo ferwachtsje dat de test mislearret as de test negatyf is (ExpectFailure), tapasse in searje "bewurkings" op it programma foar in opienfolgjende oergong fan steaten (EditDirs) en safolle mear. Litte wy sjen hoe't jo se kinne brûke om jo applikaasje-ynset te testen.

Kontrolearje boarne eigenskippen

De hjirboppe besprutsen yntegraasje soarget derfoar dat ús programma "wurket" - it crasht net. Mar wat as wy de eigenskippen fan 'e resultearjende stapel wolle kontrolearje? Bygelyks, dat bepaalde soarten boarnen binne (of net) foarsjoen en dat se bepaalde attributen hawwe.

Parameter ExtraRuntimeValidation foar ProgramTestOptions lit ús sjen nei de steat nei ynset opnommen troch Pulumi, sadat wy ekstra kontrôles kinne dwaan. Dit omfettet in folsleine momintopname fan 'e steat fan' e resultearjende stapel, ynklusyf konfiguraasje, eksportearre útfierwearden, alle boarnen en har eigendomswearden, en alle ôfhinklikens tusken boarnen.

Om in basisfoarbyld hjirfan te sjen, litte wy kontrolearje dat ús programma ien makket S3 Biker:

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

No, as wy de go-test útfiere, sil it net allinich in batterij fan libbenssyklustests trochgean, mar ek, nei it suksesfol ynsetten fan de stapel, sil it in ekstra kontrôle útfiere op 'e resultearjende steat.

Runtime tests

Oant no binne alle tests suver oer ynsetgedrach en it Pulumi-boarnemodel. Wat as jo wolle ferifiearje dat jo foarsjoen ynfrastruktuer wirklik wurket? Bygelyks, dat de firtuele masine rint, de S3-emmer befettet wat wy ferwachtsje, ensfh.

Jo hawwe miskien al rieden hoe't jo dit dwaan: opsje ExtraRuntimeValidation foar ProgramTestOptions - dit is in geweldige kâns foar dit. Op dit punt rinne jo in oanpaste Go-test mei tagong ta de folsleine steat fan jo programma's boarnen. Dizze steat omfettet ynformaasje lykas IP-adressen fan firtuele masines, URL's, en alles wat nedich is om feitlik te ynteraksje mei de resultearjende wolkapplikaasjes en ynfrastruktuer.

Bygelyks, ús testprogramma eksportearret it pân webEndpoint bak neamd websiteUrl, dat is de folsleine URL wêr't wy de konfigureare kinne krije index document. Hoewol't wy koenen grave yn de steat triem te finen bucket en lês dat pân direkt, mar yn in protte gefallen eksportearje ús stapels nuttige eigenskippen lykas dit dy't wy handich fine om te brûken foar kontrôle:

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

Lykas ús foarige runtime-kontrôles, sil dizze kontrôle fuortdaliks wurde útfierd nei it ferheegjen fan de stapel, alles yn reaksje op in ienfâldige oprop go test. En dat is gewoan it tip fan 'e iisberch - elke Go-testfunksje dy't jo yn koade kinne skriuwe is beskikber.

Trochrinnende ynfrastruktuer yntegraasje

It is goed om tests út te kinnen op in laptop as in protte ynfrastruktuerwizigingen wurde makke om se te testen foardat se yntsjinje foar koadebeoardieling. Mar wy en in protte fan ús kliïnten testen ynfrastruktuer yn ferskate stadia fan 'e ûntwikkelingslibben:

  • Yn elke iepen pull-oanfraach foar testen foar fúzje.
  • As antwurd op elke commit, om dûbel te kontrolearjen dat de fúzje goed dien is.
  • Periodyk, lykas nachts of wykliks foar ekstra testen.
  • As ûnderdiel fan prestaasjes of stress testen, dy't typysk rint oer in lange perioade fan tiid en rint tests parallel en / of ynset itselde programma meardere kearen.

Foar elk fan dizze stipet Pulumi yntegraasje mei jo favorite trochgeande yntegraasjesysteem. Mei trochgeande yntegraasje jout dit jo deselde testdekking foar jo ynfrastruktuer as foar jo applikaasjesoftware.

Pulumi hat stipe foar mienskiplike CI-systemen. Hjir binne guon fan harren:

Foar mear detaillearre ynformaasje, nim dan ferwize nei de dokumintaasje foar Trochgeande levering.

Efemere omjouwings

In heul krêftige kâns dy't iepenet is de mooglikheid om efemere omjouwings allinich yn te setten foar doelen fan akseptaasjetests. Konsept projekten en stapels Pulumi is ûntworpen om folslein isolearre en ûnôfhinklike omjouwings maklik yn te setten en ôf te brekken, allegear yn in pear ienfâldige CLI-kommando's of mei in ramt foar yntegraasjetesten.

As jo ​​​​GitHub brûke, dan biedt Pulumi oan GitHub App, wat jo sil helpe om akseptaasjetesten te ferbinen om oanfragen binnen jo CI-pipeline te lûken. Ynstallearje gewoan de applikaasje yn it GitHub-repository, en Pulumi sil ynformaasje tafoegje oer ynfrastruktuerfoarbylden, updates en testresultaten oan jo CI- en poolfersiken:

Ynfrastruktuer testen as koade mei Pulumi. Diel 2

As jo ​​​​Pulumi brûke foar jo kearnakseptaasjetests, krije jo nije automatisearringsmooglikheden dy't de produktiviteit fan team sille ferbetterje en jo fertrouwen jouwe yn 'e kwaliteit fan jo feroaringen.

It resultaat

Yn dit artikel hawwe wy sjoen dat troch it brûken fan programmeartalen foar algemiene doelen, in protte softwareûntwikkelingstechniken foar ús beskikber wurde dy't nuttich west hawwe by it ûntwikkeljen fan ús applikaasjes. Se omfetsje ienheidstesten, yntegraasjetesten, en hoe't se gearwurkje om wiidweidige runtime-testen út te fieren. Tests binne maklik te rinnen op oanfraach of yn jo CI-systeem.

Pulumi - iepen boarne software, fergees te brûken en wurket mei jo favorite programmeartalen en wolken - besykje it hjoed!

Earste diel

Boarne: www.habr.com

Add a comment