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

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

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

Тестирање примене

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

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

(Ми радимо на томе, тако да су сличне могућности тестирања интеграције доступне у изворном СДК-у језика. Можете користити оквир за тестирање интеграције Го без обзира на језик на којем је написан ваш Пулуми програм).

Покретањем програма користећи овај оквир можете проверити следеће:

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

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

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

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

Испод је наш поједностављени тест пример који пружа С3 канту и неке друге објекте:

екампле_тест.го:

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. На пример, можете да конфигуришете Јаегер крајњу тачку за праћење (Tracing), назначите да очекујете да тест не успе ако је тестирање негативно (ExpectFailure), примените серију „измена“ на програм за секвенцијални прелаз стања (EditDirs) и још много тога. Хајде да видимо како их користити за тестирање примене апликације.

Провера својстава ресурса

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

Параметар ExtraRuntimeValidation за ProgramTestOptions омогућава нам да погледамо стање након постављања које је забележио Пулуми како бисмо могли да извршимо додатне провере. Ово укључује комплетан снимак стања резултујућег стека, укључујући конфигурацију, извезене излазне вредности, све ресурсе и вредности њихових својстава, и све зависности између ресурса.

Да бисмо видели основни пример овога, хајде да проверимо да ли га наш програм креира С3 Буцкет:

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

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

Рунтиме тестови

До сада су сви тестови били искључиво везани за понашање при постављању и Пулуми модел ресурса. Шта ако желите да проверите да ли ваша обезбеђена инфраструктура заиста функционише? На пример, да виртуелна машина ради, С3 корпа садржи оно што очекујемо и тако даље.

Можда сте већ погодили како да урадите ово: опција ExtraRuntimeValidation за ProgramTestOptions - ово је одлична прилика за ово. У овом тренутку покрећете прилагођени Го тест са приступом пуном стању ресурса вашег програма. Ово стање укључује информације као што су ИП адресе виртуелних машина, УРЛ-ови и све што је потребно за стварну интеракцију са резултујућим апликацијама у облаку и инфраструктуром.

На пример, наш програм за тестирање извози својство webEndpoint канта зове websiteUrl, што је пуна УРЛ адреса на којој можемо да добијемо конфигурисану 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. И то је само врх леденог брега — доступна је свака функција Го теста коју можете да напишете у коду.

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

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

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

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

Пулуми има подршку за уобичајене ЦИ системе. Ево неких од њих:

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

Ефемерна окружења

Веома моћна прилика која се отвара је могућност примене ефемерних окружења искључиво у сврхе тестирања прихватљивости. Концепт пројекти и стекови Пулуми је дизајниран да лако примени и уништи потпуно изолована и независна окружења, све у неколико једноставних ЦЛИ команди или користећи оквир за тестирање интеграције.

Ако користите ГитХуб, онда Пулуми нуди ГитХуб Апп, који ће вам помоћи да повежете тестирање прихватања са захтевима за повлачење унутар вашег ЦИ цевовода. Само инсталирајте апликацију у ГитХуб спремиште и Пулуми ће додати информације о прегледима инфраструктуре, ажурирањима и резултатима тестирања вашим захтевима за ЦИ и скупове:

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

Када користите Пулуми за своје основне тестове прихватања, добићете нове могућности аутоматизације које ће побољшати продуктивност тима и дати вам поверење у квалитет ваших промена.

Укупан

У овом чланку смо видели да нам коришћењем програмских језика опште намене постају доступне многе технике развоја софтвера које су биле корисне у развоју наших апликација. Они обухватају тестирање јединица, тестирање интеграције и начин на који раде заједно на извођењу опсежног тестирања времена извршавања. Тестове је лако покренути на захтев или у вашем ЦИ систему.

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

Први део

Извор: ввв.хабр.цом

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