Тестирање на инфраструктурата како код со Pulumi. Дел 2

Здраво на сите. Денес го споделуваме со вас последниот дел од статијата. „Тестирање на инфраструктурата како код со Пулуми“, чиј превод е подготвен специјално за студенти на курсеви „Практики и алатки на DevOps“.

Тестирање на инфраструктурата како код со Pulumi. Дел 2

Тестирање на распоредување

Овој стил на тестирање е моќен пристап и ни овозможува да извршиме тестирање на белата кутија за да ги тестираме храброста за тоа како функционира нашиот инфраструктурен код. Сепак, тоа донекаде го ограничува она што можеме да го тестираме. Тестовите се вршат врз основа на планот за распоредување во меморијата креиран од Pulumi пред вистинското распоредување и затоа самото распоредување не може да се тестира. За такви случаи, Пулуми има рамка за тест за интеграција. И овие два пристапа одлично функционираат заедно!

Рамката за тестирање за интеграција на Pulumi е напишана во Go, на тој начин го тестираме најголемиот дел од нашиот внатрешен код. Додека претходно дискутираниот пристап за тестирање на единици беше повеќе како тестирање во бела кутија, тестирањето за интеграција е црна кутија. (Постојат и опции за ригорозно внатрешно тестирање.) Оваа рамка е создадена за да преземе целосна програма Pulumi и да изврши различни операции на животниот циклус на неа, како што е распоредување на нов стек од нула, негово ажурирање со варијации и бришење, можеби повеќекратно . Ги извршуваме редовно (на пример, ноќе) и како стрес тестови.

(Ние работиме на тоа, така што слични способности за тестирање за интеграција се достапни во мајчин SDK на јазиците. Можете да ја користите рамката за тестирање за интеграција Go без оглед на јазикот на кој е напишана вашата програма Пулуми).

Со извршување на програмата користејќи ја оваа рамка, можете да го проверите следново:

  • Кодот на вашиот проект е синтаксички точен и работи без грешки.
  • Поставките за конфигурација на магацинот и тајните работат и се толкуваат правилно.
  • Вашиот проект може успешно да се распореди во провајдерот на облак по ваш избор.
  • Вашиот проект може успешно да се надгради од почетната состојба во N други состојби.
  • Вашиот проект може успешно да биде уништен и отстранет од вашиот облак провајдер.

Како што ќе видиме наскоро, оваа рамка може да се користи и за извршување на валидација на време на траење.

Едноставен тест за интеграција

За да го видиме ова во акција, ќе го погледнеме складиштето pulumi/examples, бидејќи нашиот тим и заедницата Пулуми го користат за тестирање на нашите сопствени барања за повлекување, обврски и ноќни изданија.

Подолу е нашиот поедноставен тест пример кој обезбедува кофа S3 и некои други објекти:

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

Овој тест поминува низ основниот животен циклус на создавање, менување и уништување на стек за папка aws-js-s3-folder. Ќе треба околу една минута да се пријави положен тест:

$ go test .
PASS
ok      ... 43.993s

Постојат многу опции за прилагодување на однесувањето на овие тестови. Погледнете ја целосната листа на опции. во структурата ProgramTestOptions. На пример, можете да ја конфигурирате крајната точка на Jaeger да следи (Tracing), означете дека очекувате тестот да не успее ако тестирањето е негативно (ExpectFailure), примени серија на „уредувања“ на програмата за секвенцијална транзиција на состојби (EditDirs) и уште повеќе. Ајде да видиме како да ги користиме за да го тестираме распоредувањето на вашата апликација.

Проверка на својствата на ресурсите

Интеграцијата дискутирана погоре осигурува дека нашата програма „работи“ - не се урива. Но, што ако сакаме да ги провериме својствата на добиениот оџак? На пример, дека одредени видови ресурси се обезбедени (или не) и дека имаат одредени атрибути.

Параметар ExtraRuntimeValidation за ProgramTestOptions ни овозможува да ја погледнеме состојбата по распоредувањето снимена од Пулуми за да можеме да направиме дополнителни проверки. Ова вклучува целосна слика на состојбата на добиениот оџак, вклучувајќи ја конфигурацијата, извезените излезни вредности, сите ресурси и нивните вредности на имотот и сите зависности помеѓу ресурсите.

За да видите основен пример за ова, ајде да провериме дали нашата програма создава таков Кофа S3:

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

Сега, кога ќе го извршиме тестот оди, тој не само што ќе помине низ батерија од тестови на животниот циклус, туку, исто така, по успешното распоредување на стекот, ќе изврши дополнителна проверка на добиената состојба.

Тестови за траење

Досега, сите тестови беа чисто за однесувањето на распоредувањето и моделот на ресурси Пулуми. Што ако сакате да потврдите дека вашата обезбедена инфраструктура навистина работи? На пример, дека виртуелната машина работи, корпата S3 го содржи она што го очекуваме и така натаму.

Можеби веќе сте погодиле како да го направите ова: опција ExtraRuntimeValidation за ProgramTestOptions - ова е одлична можност за ова. Во овој момент, извршувате сопствен Go тест со пристап до целосната состојба на ресурсите на вашата програма. Оваа состојба вклучува информации како што се IP адреси на виртуелната машина, URL-адреси и сè што е потребно за вистинска интеракција со добиените облак апликации и инфраструктура.

На пример, нашата програма за тестирање го извезува имотот webEndpoint повикана кофа websiteUrl, што е целосната URL-адреса каде што можеме да го добиеме конфигурираното index document. Иако можевме да копаме во државната датотека за да најдеме bucket и директно прочитајте го тоа својство, но во многу случаи нашите купишта извезуваат корисни својства како ова што ни е погодно да ги користиме за проверка:

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

Како и нашите претходни проверки на траење, оваа проверка ќе се изврши веднаш по подигнувањето на магацинот, сето тоа како одговор на едноставен повик go test. И тоа е само врвот на ледениот брег - секоја функција за тестирање Go што можете да ја напишете во код е достапна.

Континуирана интеграција на инфраструктурата

Добро е да можете да извршите тестови на лаптоп кога се прават многу промени во инфраструктурата за да ги тестирате пред да ги испратите на преглед на кодот. Но, ние и многу од нашите клиенти ја тестираме инфраструктурата во различни фази од животниот циклус на развојот:

  • Во секое отворено барање за влечење за тестирање пред спојување.
  • Како одговор на секое извршување, повторно да се провери дали спојувањето е направено правилно.
  • Периодично, како на пример ноќе или неделно за дополнително тестирање.
  • Како дел од перформансите или стрес-тестирањето, кое обично трае долг временски период и паралелно ги извршува тестовите и/или ја распоредува истата програма повеќе пати.

За секое од овие, Pulumi поддржува интеграција со вашиот омилен систем за континуирана интеграција. Со континуирана интеграција, ова ви ја дава истата тест покриеност за вашата инфраструктура како и за вашиот апликативен софтвер.

Pulumi има поддршка за заеднички CI системи. Еве некои од нив:

За подетални информации, ве молиме погледнете ја документацијата за Континуирана испорака.

Ефемерни средини

Многу моќна можност што се отвора е можноста за распоредување на ефемерни средини исклучиво за цели на тестирање на прифаќање. Концепт проекти и стекови Pulumi е дизајниран за лесно распоредување и уништување на целосно изолирани и независни средини, сето тоа во неколку едноставни CLI команди или користејќи рамка за тестирање на интеграцијата.

Ако користите GitHub, тогаш Pulumi нуди Апликација GitHub, што ќе ви помогне да го поврзете тестирањето за прифаќање за да ги повлечете барањата во вашиот CI гасовод. Само инсталирајте ја апликацијата во складиштето на GitHub, а Pulumi ќе додаде информации за прегледите на инфраструктурата, ажурирањата и резултатите од тестирањето на вашите барања за CI и базен:

Тестирање на инфраструктурата како код со Pulumi. Дел 2

Кога користите Pulumi за вашите основни тестови за прифаќање, ќе стекнете нови способности за автоматизација кои ќе ја подобрат продуктивноста на тимот и ќе ви дадат доверба во квалитетот на вашите промени.

Вкупно

Во оваа статија, видовме дека со користење на програмски јазици за општа намена, ни стануваат достапни многу техники за развој на софтвер кои биле корисни во развојот на нашите апликации. Тие вклучуваат тестирање на единици, тестирање за интеграција и како тие работат заедно за да извршат опширно тестирање за време на траење. Тестовите се лесни за извршување на барање или во вашиот CI систем.

Пулуми - софтвер со отворен код, бесплатен за употреба и работи со вашите омилени програмски јазици и облаци - пробајте го денес!

Во првиот дел

Извор: www.habr.com

Додадете коментар