Pulumi bilan kod sifatida infratuzilmani sinovdan o'tkazish. 2-qism

Hammaga salom. Bugun biz siz bilan maqolaning yakuniy qismini baham ko'ramiz. "Infratuzilmani Pulumi bilan kod sifatida sinovdan o'tkazish", tarjimasi kurs talabalari uchun maxsus tayyorlangan "DevOps amaliyotlari va vositalari".

Pulumi bilan kod sifatida infratuzilmani sinovdan o'tkazish. 2-qism

Joylashtirish testi

Sinovning ushbu uslubi kuchli yondashuv bo'lib, infratuzilma kodimizning ichki ishlashini sinab ko'rish uchun oq quti testini o'tkazishga imkon beradi. Biroq, bu biz sinab ko'rishimiz mumkin bo'lgan narsalarni biroz cheklaydi. Sinovlar haqiqiy joylashtirishdan oldin Pulumi tomonidan yaratilgan xotirada joylashtirish rejasi asosida amalga oshiriladi va shuning uchun joylashtirishning o'zini sinab ko'rish mumkin emas. Bunday holatlar uchun Pulumi integratsiya test tizimiga ega. Va bu ikki yondashuv birgalikda ajoyib ishlaydi!

Pulumi integratsiya test tizimi Go-da yozilgan, shuning uchun biz ichki kodimizning ko'p qismini sinab ko'ramiz. Oldin muhokama qilingan birliklarni sinovdan o'tkazish yondashuvi ko'proq oq quti sinoviga o'xshash bo'lsa-da, integratsiya testi qora qutidir. (Shuningdek, jiddiy ichki test imkoniyatlari mavjud.) Ushbu ramka toʻliq Pulumi dasturini olish va unda yangi stekni noldan oʻrnatish, uni oʻzgartirishlar bilan yangilash va uni bir necha marta oʻchirish kabi turli xil hayot aylanish operatsiyalarini bajarish uchun yaratilgan. . Biz ularni muntazam ravishda (masalan, tunda) va stress testlari sifatida ishlatamiz.

(Biz ustida ishlayapmiz, shuning uchun shunga o'xshash integratsiya test imkoniyatlari tillarning mahalliy SDK-larida mavjud. Siz Pulumi dasturingiz qaysi tilda yozilganidan qat'i nazar, Go integratsiya test tizimidan foydalanishingiz mumkin).

Ushbu ramka yordamida dasturni ishga tushirish orqali siz quyidagilarni tekshirishingiz mumkin:

  • Loyiha kodingiz sintaktik jihatdan to'g'ri va xatosiz ishlaydi.
  • Stack va sirlarni konfiguratsiya sozlamalari ishlaydi va to'g'ri talqin qilinadi.
  • Loyihangiz siz tanlagan bulutli provayderda muvaffaqiyatli joylashtirilishi mumkin.
  • Loyihangiz dastlabki holatdan N boshqa shtatga muvaffaqiyatli yangilanishi mumkin.
  • Loyihangiz muvaffaqiyatli yo'q qilinishi va bulut provayderingizdan olib tashlanishi mumkin.

Tez orada ko'rib chiqamiz, bu ramka ish vaqtini tekshirishni amalga oshirish uchun ham ishlatilishi mumkin.

Oddiy integratsiya testi

Buni amalda ko'rish uchun biz omborni ko'rib chiqamiz pulumi/examples, chunki bizning jamoamiz va Pulumi hamjamiyatimiz undan o'zimizning tortishish so'rovlarimiz, majburiyatlarimiz va tungi tuzilmalarimizni sinab ko'rish uchun foydalanadi.

Quyida bizning soddalashtirilgan testimiz keltirilgan S3 paqirini va boshqa ba'zi narsalarni taqdim etadigan misol:

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

Ushbu test papka uchun stekni yaratish, o'zgartirish va yo'q qilishning asosiy hayotiy tsiklidan o'tadi aws-js-s3-folder. O'tgan test haqida xabar berish uchun taxminan bir daqiqa vaqt ketadi:

$ go test .
PASS
ok      ... 43.993s

Ushbu testlarning xatti-harakatlarini sozlashning ko'plab variantlari mavjud. Variantlarning toʻliq roʻyxatini koʻring. tuzilishida ProgramTestOptions. Masalan, siz Jaeger oxirgi nuqtasini kuzatish uchun sozlashingiz mumkin (Tracing), agar test salbiy bo'lsa, test muvaffaqiyatsiz bo'lishini kutayotganingizni bildiring (ExpectFailure), davlatlarning ketma-ket o'tish dasturiga bir qator "tahrirlarni" qo'llang (EditDirs) va boshqalar. Keling, ilovalarni joylashtirishni sinab ko'rish uchun ulardan qanday foydalanishni ko'rib chiqaylik.

Resurs xususiyatlarini tekshirish

Yuqorida muhokama qilingan integratsiya bizning dasturimizning "ishlashini" ta'minlaydi - bu ishlamay qolmaydi. Ammo natijada olingan stekning xususiyatlarini tekshirmoqchi bo'lsak nima bo'ladi? Masalan, ma'lum turdagi resurslar ta'minlanganligi (yoki taqdim etilmaganligi) va ular ma'lum atributlarga ega ekanligi.

Parametr ExtraRuntimeValidation uchun ProgramTestOptions bizga Pulumi tomonidan qayd etilgan joylashtirishdan keyingi holatni ko'rib chiqishga imkon beradi, shuning uchun biz qo'shimcha tekshiruvlar o'tkazishimiz mumkin. Bu konfiguratsiya, eksport qilingan chiqish qiymatlari, barcha resurslar va ularning mulk qiymatlari va resurslar o'rtasidagi barcha bog'liqliklarni o'z ichiga olgan natijaviy stek holatining to'liq suratini o'z ichiga oladi.

Buning asosiy misolini ko'rish uchun dasturimiz uni yaratishini tekshirib ko'raylik S3 chelak:

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

Endi biz go testini ishga tushirganimizda, u nafaqat hayot tsikli sinovlari batareyasidan o'tadi, balki stekni muvaffaqiyatli joylashtirgandan so'ng, natijada paydo bo'lgan holatni qo'shimcha tekshirishni amalga oshiradi.

Ish vaqti testlari

Hozirgacha barcha testlar faqat joylashtirish harakati va Pulumi resurs modeli haqida bo'lgan. Ta'minlangan infratuzilmangiz haqiqatda ishlayotganini tekshirmoqchi bo'lsangiz-chi? Masalan, virtual mashina ishlayotgani, S3 paqirida biz kutgan narsalar mavjud va hokazo.

Buni qanday qilishni allaqachon taxmin qilgan bo'lishingiz mumkin: variant ExtraRuntimeValidation uchun ProgramTestOptions - buning uchun ajoyib imkoniyat. Ushbu nuqtada siz dasturingiz resurslarining to'liq holatiga kirish huquqiga ega maxsus Go testini o'tkazasiz. Bu holat virtual mashinaning IP manzillari, URL manzillari va bulutli ilovalar va infratuzilma bilan ishlash uchun zarur bo'lgan barcha ma'lumotlarni o'z ichiga oladi.

Misol uchun, bizning test dasturimiz mulkni eksport qiladi webEndpoint chelak chaqirildi websiteUrl, bu konfiguratsiyani olishimiz mumkin bo'lgan to'liq URL index document. Biz topish uchun davlat faylini qazishimiz mumkin bo'lsa-da bucket va bu xususiyatni to'g'ridan-to'g'ri o'qing, lekin ko'p hollarda bizning steklarimiz tekshirish uchun foydalanish qulay bo'lgan shunga o'xshash foydali xususiyatlarni eksport qiladi:

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

Oldingi ish vaqti tekshiruvlarimiz kabi, bu tekshirish stek ko'tarilgandan so'ng darhol amalga oshiriladi, barchasi oddiy qo'ng'iroqqa javoban go test. Va bu aysbergning faqat uchi — kodda yozishingiz mumkin bo'lgan har bir Go test funksiyasi mavjud.

Infratuzilmaning uzluksiz integratsiyasi

Kodni tekshirish uchun yuborishdan oldin ularni sinab ko'rish uchun ko'plab infratuzilma o'zgarishlari amalga oshirilayotganda noutbukda testlarni o'tkazish imkoniyatiga ega bo'lish yaxshi. Ammo biz va ko'plab mijozlarimiz infratuzilmani rivojlanishning turli bosqichlarida sinovdan o'tkazamiz:

  • Birlashishdan oldin sinov uchun har bir ochiq tortishish so'rovida.
  • Har bir majburiyatga javoban, birlashma to'g'ri bajarilganligini ikki marta tekshiring.
  • Vaqti-vaqti bilan, masalan, kechasi yoki har hafta qo'shimcha sinov uchun.
  • Ishlash yoki stress testining bir qismi sifatida, odatda uzoq vaqt davomida ishlaydi va testlarni parallel ravishda bajaradi va/yoki bir xil dasturni bir necha marta o'rnatadi.

Ularning har biri uchun Pulumi sevimli uzluksiz integratsiya tizimingiz bilan integratsiyani qo'llab-quvvatlaydi. Uzluksiz integratsiya bilan bu sizning infratuzilmangiz uchun amaliy dasturiy ta'minotingiz uchun bir xil sinov qamrovini beradi.

Pulumi umumiy CI tizimlarini qo'llab-quvvatlaydi. Mana ulardan ba'zilari:

Batafsil ma'lumot olish uchun hujjatlarga qarang Har doim yetkazib berish.

Efemer muhitlar

Ochilgan juda kuchli imkoniyat - bu vaqtinchalik muhitlarni faqat qabul qilish sinovlari uchun joylashtirish qobiliyati. Kontseptsiya loyihalar va steklar Pulumi bir nechta oddiy CLI buyruqlari yoki integratsiya test tizimi yordamida butunlay izolyatsiya qilingan va mustaqil muhitlarni osongina joylashtirish va buzish uchun mo'ljallangan.

Agar siz GitHub-dan foydalansangiz, Pulumi taklif qiladi GitHub ilovasi, bu sizning CI quvuringizdagi so'rovlarni qabul qilish uchun qabul testini ulashingizga yordam beradi. Shunchaki dasturni GitHub omboriga oʻrnating va Pulumi CI va hovuz soʻrovlaringizga infratuzilmani oldindan koʻrish, yangilanishlar va sinov natijalari haqida maʼlumot qoʻshadi:

Pulumi bilan kod sifatida infratuzilmani sinovdan o'tkazish. 2-qism

Pulumi-dan asosiy qabul sinovlari uchun foydalansangiz, siz yangi avtomatlashtirish imkoniyatlariga ega bo'lasiz, bu esa jamoa samaradorligini oshiradi va o'zgartirishlaringiz sifatiga ishonch beradi.

Xulosa

Ushbu maqolada biz umumiy maqsadli dasturlash tillarini qo'llash orqali biz uchun dasturlarni ishlab chiqishda foydali bo'lgan ko'plab dasturiy ta'minot ishlab chiqish usullari mavjud bo'lganini ko'rdik. Ular birlik testini, integratsiya testini va keng qamrovli ish vaqti sinovini o'tkazish uchun birgalikda ishlashni o'z ichiga oladi. Sinovlarni talab bo'yicha yoki CI tizimingizda bajarish oson.

Pulumi - ochiq kodli dasturiy ta'minot, foydalanish uchun bepul va sevimli dasturlash tillari va bulutlar bilan ishlaydi - bugun sinab ko'ring!

Birinchi qism

Manba: www.habr.com

a Izoh qo'shish