Pulumi ilə kod kimi infrastrukturu sınayın. 2-ci hissə

Hamıya salam. Bu gün məqalənin son hissəsini sizinlə bölüşürük. "İnfrastrukturun Pulumi ilə kod kimi sınaqdan keçirilməsi", tərcüməsi xüsusi olaraq kurs tələbələri üçün hazırlanmışdır "DevOps təcrübələri və alətləri".

Pulumi ilə kod kimi infrastrukturu sınayın. 2-ci hissə

Yerləşdirmə sınağı

Bu sınaq tərzi güclü bir yanaşmadır və infrastruktur kodumuzun daxili işini yoxlamaq üçün ağ qutu testini həyata keçirməyə imkan verir. Bununla belə, sınaqdan keçirə biləcəyimizi bir qədər məhdudlaşdırır. Testlər faktiki yerləşdirmədən əvvəl Pulumi tərəfindən yaradılmış yaddaşdaxili yerləşdirmə planına əsasən həyata keçirilir və buna görə də yerləşdirmənin özü sınaqdan keçirilə bilməz. Belə hallar üçün Pulumi inteqrasiya testi çərçivəsinə malikdir. Və bu iki yanaşma birlikdə əla işləyir!

Pulumi inteqrasiya testi çərçivəsi Go-da yazılmışdır, biz daxili kodun əksəriyyətini belə yoxlayırıq. Əvvəllər müzakirə edilən vahid test yanaşması daha çox ağ qutu testinə bənzəsə də, inteqrasiya testi qara qutudur. (Ciddi daxili sınaq üçün seçimlər də var.) Bu çərçivə tam Pulumi proqramını götürmək və onun üzərində sıfırdan yeni yığın yerləşdirmək, variasiyalarla yeniləmək və onu silmək kimi müxtəlif həyat dövrü əməliyyatlarını yerinə yetirmək üçün yaradılmışdır. . Biz onları müntəzəm olaraq (məsələn, gecə) və stress testləri kimi həyata keçiririk.

(Biz biz bunun üzərində işləyirik, belə ki, oxşar inteqrasiya test imkanları dillərin yerli SDK-da mövcuddur. Siz Pulumi proqramınızın hansı dildə yazılmasından asılı olmayaraq Go inteqrasiya testi çərçivəsindən istifadə edə bilərsiniz).

Bu çərçivədən istifadə edərək proqramı işlətməklə aşağıdakıları yoxlaya bilərsiniz:

  • Layihə kodunuz sintaktik olaraq düzgündür və səhvsiz işləyir.
  • Yığın və sirlərin konfiqurasiya parametrləri işləyir və düzgün şərh olunur.
  • Layihəniz seçdiyiniz bulud provayderində uğurla yerləşdirilə bilər.
  • Layihəniz ilkin vəziyyətdən N başqa ştata uğurla yüksəldilə bilər.
  • Layihəniz uğurla məhv edilə və bulud provayderinizdən silinə bilər.

Qısa müddətdə görəcəyimiz kimi, bu çərçivə həm də iş vaxtının doğruluğunu həyata keçirmək üçün istifadə edilə bilər.

Sadə inteqrasiya testi

Bunu hərəkətdə görmək üçün depoya baxacağıq pulumi/examples, çünki komandamız və Pulumi icması ondan öz çəkmə sorğularımızı, öhdəliklərimizi və gecə qurmalarımızı sınamaq üçün istifadə edir.

Aşağıda bizim sadələşdirilmiş testimiz var S3 bucket və bəzi digər obyektləri təmin edən nümunə:

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

Bu test qovluq üçün yığının yaradılması, dəyişdirilməsi və məhv edilməsinin əsas həyat dövründən keçir aws-js-s3-folder. Keçilmiş testi bildirmək təxminən bir dəqiqə çəkəcək:

$ go test .
PASS
ok      ... 43.993s

Bu testlərin davranışını fərdiləşdirmək üçün bir çox variant var. Seçimlərin tam siyahısına baxın. strukturunda ProgramTestOptions. Məsələn, Jaeger son nöqtəsini izləmək üçün konfiqurasiya edə bilərsiniz (Tracing), test mənfi olarsa, testin uğursuz olacağını gözlədiyinizi göstərin (ExpectFailure), dövlətlərin ardıcıl keçidi üçün proqrama bir sıra "redaktələr" tətbiq edin (EditDirs) və daha çox. Tətbiq yerləşdirmənizi yoxlamaq üçün onlardan necə istifadə edəcəyinizi görək.

Resurs xüsusiyyətlərinin yoxlanılması

Yuxarıda müzakirə edilən inteqrasiya proqramımızın “işlədiyini” təmin edir – o, qəzaya uğramır. Bəs əldə edilən yığının xüsusiyyətlərini yoxlamaq istəsək nə etməli? Məsələn, müəyyən resurs növlərinin təmin edilməsi (və ya edilməməsi) və onların müəyyən atributlarına malik olması.

Parametr ExtraRuntimeValidation uğrunda ProgramTestOptions Bizə əlavə yoxlamalar apara bilmək üçün Pulumi tərəfindən qeydə alınan yerləşdirmədən sonrakı vəziyyətə baxmağa imkan verir. Bu, konfiqurasiya, ixrac edilmiş çıxış dəyərləri, bütün resurslar və onların mülkiyyət qiymətləri və resurslar arasında bütün asılılıqlar daxil olmaqla, nəticədə yaranan yığının vəziyyətinin tam surətini ehtiva edir.

Bunun əsas nümunəsini görmək üçün proqramımızın onu yaratdığını yoxlayaq S3 kovası:

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

İndi biz go testini işə saldığımız zaman o, nəinki həyat dövrü testlərinin batareyasından keçəcək, həm də yığını uğurla yerləşdirdikdən sonra nəticədə yaranan vəziyyətə əlavə yoxlama aparacaq.

İş vaxtı testləri

İndiyə qədər bütün testlər sırf yerləşdirmə davranışı və Pulumi resurs modeli ilə bağlı olub. Təmin edilmiş infrastrukturunuzun həqiqətən işlədiyini yoxlamaq istəyirsinizsə nə etməli? Məsələn, virtual maşının işlədiyi, S3 kovası gözlədiyimizi ehtiva edir və s.

Bunu necə edəcəyinizi artıq təxmin etmiş ola bilərsiniz: seçim ExtraRuntimeValidation uğrunda ProgramTestOptions - bunun üçün əla fürsətdir. Bu nöqtədə, proqramınızın resurslarının tam vəziyyətinə çıxışı olan xüsusi Go testini icra edirsiniz. Bu vəziyyətə virtual maşının IP ünvanları, URL-lər və nəticədə yaranan bulud proqramları və infrastrukturu ilə həqiqətən qarşılıqlı əlaqə yaratmaq üçün lazım olan hər şey kimi məlumatlar daxildir.

Məsələn, test proqramımız əmlakı ixrac edir webEndpoint vedrə çağırılır websiteUrl, konfiqurasiyanı əldə edə biləcəyimiz tam URL-dir index document. Baxmayaraq ki, tapmaq üçün dövlət faylını qaza bildik bucket və həmin xassəni birbaşa oxuyun, lakin bir çox hallarda yığınlarımız yoxlamaq üçün istifadə etmək üçün əlverişli hesab etdiyimiz bu kimi faydalı xassələri ixrac edir:

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

Əvvəlki iş vaxtı yoxlamalarımız kimi, bu yoxlama yığını qaldırdıqdan dərhal sonra sadə zəngə cavab olaraq yerinə yetiriləcək. go test. Və bu, aysberqin görünən hissəsidir — kodda yaza biləcəyiniz hər Go test funksiyası mövcuddur.

Davamlı İnfrastruktur İnteqrasiyası

Kod nəzərdən keçirilməsi üçün təqdim etməzdən əvvəl onları sınaqdan keçirmək üçün bir çox infrastruktur dəyişiklikləri edildiyi zaman noutbukda testlər keçirə bilmək yaxşıdır. Lakin biz və bir çox müştərilərimiz inkişaf dövrünün müxtəlif mərhələlərində infrastrukturu sınaqdan keçiririk:

  • Birləşmədən əvvəl sınaq üçün hər açıq çəkmə sorğusunda.
  • Hər bir öhdəliyə cavab olaraq birləşmənin düzgün aparıldığını iki dəfə yoxlamaq.
  • Dövri olaraq, məsələn, gecə və ya həftəlik əlavə sınaq üçün.
  • Performans və ya stress testinin bir hissəsi kimi, adətən uzun müddət ərzində işləyir və testləri paralel olaraq həyata keçirir və/və ya eyni proqramı dəfələrlə yerləşdirir.

Bunların hər biri üçün Pulumi sevimli davamlı inteqrasiya sisteminizlə inteqrasiyanı dəstəkləyir. Davamlı inteqrasiya ilə bu, sizə infrastrukturunuz üçün tətbiqi proqram təminatı ilə eyni sınaq əhatəsini verir.

Pulumi ümumi CI sistemlərini dəstəkləyir. Onlardan bəzilərini təqdim edirik:

Daha ətraflı məlumat üçün sənədlərə müraciət edin Davamlı Çatdırılma.

Efemer mühitlər

Açılan çox güclü bir fürsət, efemer mühitləri yalnız qəbul testi məqsədləri üçün yerləşdirmək bacarığıdır. Konsepsiya layihələr və yığınlar Pulumi bir neçə sadə CLI əmrində və ya inteqrasiya testi çərçivəsindən istifadə etməklə tamamilə təcrid olunmuş və müstəqil mühitləri asanlıqla yerləşdirmək və sökmək üçün nəzərdə tutulmuşdur.

GitHub istifadə edirsinizsə, Pulumi təklif edir GitHub Tətbiqi, bu, CI boru kəmərinizdə sorğuları çəkmək üçün qəbul testini birləşdirməyə kömək edəcək. Sadəcə tətbiqi GitHub repozitoriyasına quraşdırın və Pulumi CI və hovuz sorğularınıza infrastruktur önizləmələri, yeniləmələr və sınaq nəticələri haqqında məlumat əlavə edəcək:

Pulumi ilə kod kimi infrastrukturu sınayın. 2-ci hissə

Əsas qəbul testləriniz üçün Pulumi-dən istifadə etdiyiniz zaman siz komandanın məhsuldarlığını artıracaq və dəyişikliklərinizin keyfiyyətinə inam verəcək yeni avtomatlaşdırma imkanları əldə edəcəksiniz.

Ümumi

Bu məqalədə gördük ki, ümumi məqsədli proqramlaşdırma dillərindən istifadə etməklə, tətbiqlərimizi inkişaf etdirməkdə faydalı olan bir çox proqram inkişaf texnikası bizim üçün əlçatan olur. Bunlara vahid testi, inteqrasiya testi və geniş iş vaxtı testini yerinə yetirmək üçün necə birlikdə işlədikləri daxildir. Testləri tələb əsasında və ya CI sisteminizdə icra etmək asandır.

Pulumi - açıq mənbə proqram təminatı, istifadəsi pulsuzdur və sevimli proqramlaşdırma dilləri və buludlarla işləyir - bu gün cəhd edin!

Birinci hissə

Mənbə: www.habr.com

Добавить комментарий