Тествайте инфраструктурата като код с Pulumi. Част 2

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

Тествайте инфраструктурата като код с Pulumi. Част 2

Тестване на внедряване

Този стил на тестване е мощен подход и ни позволява да извършваме тестване на бяла кутия, за да тестваме вътрешната работа на нашия инфраструктурен код. Това обаче донякъде ограничава това, което можем да тестваме. Тестовете се извършват въз основа на плана за внедряване в паметта, създаден от Pulumi преди действителното внедряване и следователно самото внедряване не може да бъде тествано. За такива случаи Pulumi има интеграционна тестова рамка. И тези два подхода работят чудесно заедно!

Рамката за тестване на интеграция Pulumi е написана на Go, което е начинът, по който тестваме по-голямата част от нашия вътрешен код. Докато по-рано обсъжданият подход за тестване на модули беше по-скоро като тестване с бяла кутия, тестването на интеграцията е черна кутия. (Има и опции за стриктно вътрешно тестване.) Тази рамка е създадена, за да вземе пълна програма Pulumi и да извърши върху нея различни операции от жизнения цикъл, като внедряване на нов стек от нулата, актуализирането му с варианти и изтриването му, евентуално многократно . Пускаме ги редовно (например през нощта) и като стрес тестове.

(Ние ние работим върху това, така че подобни възможности за тестване на интеграция да са налични в собствения SDK на езиците. Можете да използвате рамката за тестване на интеграция Go независимо от езика, на който е написана вашата програма Pulumi).

Като стартирате програмата с тази рамка, можете да проверите следното:

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

Както ще видим скоро, тази рамка може да се използва и за извършване на валидиране по време на изпълнение.

Прост интеграционен тест

За да видим това в действие, ще разгледаме хранилището pulumi/examples, тъй като нашият екип и общността на Pulumi го използват, за да тестват нашите собствени заявки за изтегляне, ангажименти и нощни компилации.

По-долу е даден опростен тест на нашия пример, който предоставя кофа 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 ни позволява да разгледаме състоянието след внедряване, записано от Pulumi, за да можем да правим допълнителни проверки. Това включва пълна моментна снимка на състоянието на получения стек, включително конфигурация, експортирани изходни стойности, всички ресурси и стойностите на техните свойства и всички зависимости между ресурсите.

За да видите основен пример за това, нека проверим дали програмата ни създава такъв 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")
        },
    })

Сега, когато стартираме go test, той не само ще премине през набор от тестове на жизнения цикъл, но също така, след успешно разгръщане на стека, ще извърши допълнителна проверка на полученото състояние.

Тестове по време на изпълнение

Досега всички тестове бяха само за поведението при внедряване и модела на ресурсите Pulumi. Какво ще стане, ако искате да проверите дали предоставената от вас инфраструктура действително работи? Например, че виртуалната машина работи, кофата 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 системи. Ето някои от тях:

За по-подробна информация, моля, вижте документацията за Continuous Delivery.

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

Много мощна възможност, която се отваря, е възможността за внедряване на краткотрайни среди единствено за целите на тестването за приемане. Концепция проекти и стекове Pulumi е проектиран за лесно внедряване и разрушаване на напълно изолирани и независими среди, всичко това в няколко прости CLI команди или с помощта на рамка за тестване на интеграция.

Ако използвате GitHub, тогава Pulumi предлага Приложение GitHub, което ще ви помогне да свържете тестване за приемане към заявки за изтегляне в рамките на вашия CI тръбопровод. Просто инсталирайте приложението в хранилището на GitHub и Pulumi ще добави информация за визуализации на инфраструктурата, актуализации и резултати от тестване към вашите заявки за CI и пул:

Тествайте инфраструктурата като код с Pulumi. Част 2

Когато използвате Pulumi за вашите основни тестове за приемане, ще получите нови възможности за автоматизация, които ще подобрят производителността на екипа и ще ви дадат увереност в качеството на вашите промени.

Общо

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

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

Първата част

Източник: www.habr.com

Добавяне на нов коментар