Menguji Infrastruktur sebagai Kod dengan Pulumi. Bahagian 2

Hai semua. Hari ini kami berkongsi dengan anda bahagian akhir artikel. "Menguji Infrastruktur sebagai Kod dengan Pulumi", terjemahannya disediakan khusus untuk pelajar kursus "Amalan dan alatan DevOps".

Menguji Infrastruktur sebagai Kod dengan Pulumi. Bahagian 2

Ujian penempatan

Gaya ujian ini ialah pendekatan yang berkuasa dan membolehkan kami melakukan ujian kotak putih untuk menguji kerja dalaman kod infrastruktur kami. Walau bagaimanapun, ia agak mengehadkan apa yang boleh kita uji. Ujian dilakukan berdasarkan pelan penggunaan dalam memori yang dibuat oleh Pulumi sebelum penggunaan sebenar dan oleh itu penggunaan itu sendiri tidak boleh diuji. Untuk kes sedemikian, Pulumi mempunyai rangka kerja ujian integrasi. Dan kedua-dua pendekatan ini berfungsi dengan baik bersama-sama!

Rangka kerja ujian integrasi Pulumi ditulis dalam Go, iaitu cara kami menguji kebanyakan kod dalaman kami. Walaupun pendekatan ujian unit yang dibincangkan sebelum ini lebih seperti ujian kotak putih, ujian integrasi ialah kotak hitam. (Terdapat juga pilihan untuk ujian dalaman yang ketat.) Rangka kerja ini dicipta untuk mengambil program Pulumi yang lengkap dan melaksanakan pelbagai operasi kitaran hayat padanya, seperti menggunakan timbunan baharu dari awal, mengemas kininya dengan variasi dan memadamkannya, mungkin beberapa kali. . Kami menjalankannya dengan kerap (contohnya, pada waktu malam) dan sebagai ujian tekanan.

(Kami kami sedang mengusahakannya, supaya keupayaan ujian penyepaduan yang serupa tersedia dalam SDK asli bahasa. Anda boleh menggunakan rangka kerja ujian integrasi Go tanpa mengira bahasa di mana program Pulumi anda ditulis).

Dengan menjalankan program menggunakan rangka kerja ini, anda boleh menyemak perkara berikut:

  • Kod projek anda betul dari segi sintaksis dan berjalan tanpa ralat.
  • Tetapan konfigurasi tindanan dan rahsia berfungsi dan ditafsirkan dengan betul.
  • Projek anda boleh berjaya digunakan dalam pembekal awan pilihan anda.
  • Projek anda boleh berjaya dinaik taraf daripada keadaan awal kepada N negeri lain.
  • Projek anda boleh berjaya dimusnahkan dan dialih keluar daripada pembekal awan anda.

Seperti yang akan kita lihat sebentar lagi, rangka kerja ini juga boleh digunakan untuk melaksanakan pengesahan masa jalan.

Ujian integrasi mudah

Untuk melihat tindakan ini, kami akan melihat repositori pulumi/examples, kerana pasukan kami dan komuniti Pulumi menggunakannya untuk menguji permintaan tarikan, komitmen dan binaan setiap malam kami sendiri.

Di bawah adalah ujian ringkas kami contoh yang menyediakan baldi S3 dan beberapa objek lain:

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

Ujian ini melalui kitaran hayat asas untuk mencipta, mengubah suai dan memusnahkan tindanan untuk folder aws-js-s3-folder. Ia akan mengambil masa kira-kira seminit untuk melaporkan ujian yang lulus:

$ go test .
PASS
ok      ... 43.993s

Terdapat banyak pilihan untuk menyesuaikan tingkah laku ujian ini. Lihat senarai penuh pilihan. dalam struktur ProgramTestOptions. Sebagai contoh, anda boleh mengkonfigurasi titik akhir Jaeger untuk mengesan (Tracing), nyatakan bahawa anda menjangkakan ujian akan gagal jika ujian negatif (ExpectFailure), gunakan satu siri "suntingan" pada program untuk peralihan keadaan berurutan (EditDirs) dan banyak lagi. Mari lihat cara menggunakannya untuk menguji penggunaan aplikasi anda.

Menyemak sifat sumber

Penyepaduan yang dibincangkan di atas memastikan program kami "berfungsi"β€”ia tidak ranap. Tetapi bagaimana jika kita ingin menyemak sifat timbunan yang terhasil? Contohnya, jenis sumber tertentu telah (atau belum) diperuntukkan dan mereka mempunyai atribut tertentu.

Parameter ExtraRuntimeValidation untuk ProgramTestOptions membolehkan kami melihat keadaan pasca penempatan yang direkodkan oleh Pulumi supaya kami boleh melakukan semakan tambahan. Ini termasuk petikan lengkap keadaan tindanan yang terhasil, termasuk konfigurasi, nilai output yang dieksport, semua sumber dan nilai hartanya, dan semua kebergantungan antara sumber.

Untuk melihat contoh asas ini, mari semak sama ada program kami mencipta satu Baldi 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")
        },
    })

Sekarang, apabila kita menjalankan ujian go, ia bukan sahaja akan melalui bateri ujian kitaran hayat, tetapi juga, selepas berjaya menggunakan timbunan, ia akan melakukan semakan tambahan pada keadaan yang terhasil.

Ujian masa jalan

Setakat ini, semua ujian adalah semata-mata tentang tingkah laku penggunaan dan model sumber Pulumi. Bagaimana jika anda ingin mengesahkan bahawa infrastruktur yang anda sediakan benar-benar berfungsi? Sebagai contoh, bahawa mesin maya sedang berjalan, baldi S3 mengandungi perkara yang kita harapkan, dan sebagainya.

Anda mungkin sudah meneka cara melakukan ini: pilihan ExtraRuntimeValidation untuk ProgramTestOptions - ini adalah peluang yang baik untuk ini. Pada ketika ini, anda menjalankan ujian Go tersuai dengan akses kepada keadaan penuh sumber program anda. Keadaan ini termasuk maklumat seperti alamat IP mesin maya, URL, dan semua yang diperlukan untuk benar-benar berinteraksi dengan aplikasi dan infrastruktur awan yang terhasil.

Contohnya, program ujian kami mengeksport harta tersebut webEndpoint baldi dipanggil websiteUrl, yang merupakan URL penuh di mana kita boleh mendapatkan konfigurasi index document. Walaupun kita boleh menggali fail negeri untuk mencari bucket dan baca harta itu secara terus, tetapi dalam kebanyakan kes tindanan kami mengeksport sifat berguna seperti ini yang kami rasa mudah digunakan untuk menyemak:

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

Seperti semakan masa jalan kami sebelum ini, semakan ini akan dilaksanakan serta-merta selepas menaikkan tindanan, semuanya sebagai tindak balas kepada panggilan mudah go test. Dan itu hanyalah puncak gunung aisβ€”setiap ciri ujian Go yang anda boleh tulis dalam kod tersedia.

Integrasi Infrastruktur Berterusan

Adalah baik untuk dapat menjalankan ujian pada komputer riba apabila banyak perubahan infrastruktur sedang dibuat untuk mengujinya sebelum menyerahkannya untuk semakan kod. Tetapi kami dan ramai pelanggan kami menguji infrastruktur pada pelbagai peringkat kitaran hayat pembangunan:

  • Dalam setiap permintaan tarik terbuka untuk ujian sebelum bergabung.
  • Sebagai tindak balas kepada setiap komit, untuk menyemak semula bahawa penggabungan telah dilakukan dengan betul.
  • Secara berkala, seperti pada waktu malam atau mingguan untuk ujian tambahan.
  • Sebagai sebahagian daripada ujian prestasi atau tekanan, yang biasanya berjalan dalam tempoh masa yang panjang dan menjalankan ujian secara selari dan/atau menggunakan program yang sama beberapa kali.

Bagi setiap ini, Pulumi menyokong penyepaduan dengan sistem penyepaduan berterusan kegemaran anda. Dengan penyepaduan berterusan, ini memberikan anda liputan ujian yang sama untuk infrastruktur anda seperti untuk perisian aplikasi anda.

Pulumi mempunyai sokongan untuk sistem CI biasa. Berikut adalah sebahagian daripada mereka:

Untuk maklumat lebih terperinci, sila rujuk dokumentasi untuk Penghantaran berterusan.

Persekitaran Ephemeral

Peluang yang sangat berkuasa yang terbuka ialah keupayaan untuk menggunakan persekitaran sementara semata-mata untuk tujuan ujian penerimaan. Konsep projek dan timbunan Pulumi direka untuk menggunakan dan meruntuhkan persekitaran terpencil dan bebas sepenuhnya dengan mudah, semuanya dalam beberapa arahan CLI mudah atau menggunakan rangka kerja ujian penyepaduan.

Jika anda menggunakan GitHub, Pulumi menawarkan Apl GitHub, yang akan membantu anda menyambung ujian penerimaan untuk menarik permintaan dalam saluran paip CI anda. Hanya pasang aplikasi dalam repositori GitHub, dan Pulumi akan menambah maklumat tentang pratonton infrastruktur, kemas kini dan hasil ujian pada permintaan CI dan kumpulan anda:

Menguji Infrastruktur sebagai Kod dengan Pulumi. Bahagian 2

Apabila anda menggunakan Pulumi untuk ujian penerimaan teras anda, anda akan memperoleh keupayaan automasi baharu yang akan meningkatkan produktiviti pasukan dan memberi anda keyakinan terhadap kualiti perubahan anda.

Jumlah

Dalam artikel ini, kami telah melihat bahawa dengan menggunakan bahasa pengaturcaraan tujuan umum, banyak teknik pembangunan perisian tersedia kepada kami yang telah berguna dalam membangunkan aplikasi kami. Ia termasuk ujian unit, ujian integrasi dan cara mereka bekerjasama untuk melaksanakan ujian masa jalan yang meluas. Ujian mudah dijalankan atas permintaan atau dalam sistem CI anda.

Pulumi - perisian sumber terbuka, percuma untuk digunakan dan berfungsi dengan bahasa pengaturcaraan kegemaran anda dan awan - cubalah hari ini!

β†’ Bahagian pertama

Sumber: www.habr.com

Tambah komen