Menguji Infrastruktur sebagai Kode dengan Pulumi. Bagian 2

Halo semua. Hari ini kami membagikan kepada Anda bagian terakhir artikel ini. "Menguji Infrastruktur sebagai Kode dengan Pulumi", terjemahannya disiapkan khusus untuk mahasiswa kursus "Praktik dan alat DevOps".

Menguji Infrastruktur sebagai Kode dengan Pulumi. Bagian 2

Pengujian penerapan

Gaya pengujian ini adalah pendekatan yang ampuh dan memungkinkan kami melakukan pengujian kotak putih untuk menguji cara kerja internal kode infrastruktur kami. Namun, ini agak membatasi apa yang bisa kami uji. Pengujian dilakukan berdasarkan rencana penerapan dalam memori yang dibuat oleh Pulumi sebelum penerapan sebenarnya dan oleh karena itu penerapan itu sendiri tidak dapat diuji. Untuk kasus seperti itu, Pulumi memiliki kerangka pengujian integrasi. Dan kedua pendekatan ini bekerja sama dengan baik!

Kerangka pengujian integrasi Pulumi ditulis dalam Go, yang merupakan cara kami menguji sebagian besar kode internal kami. Meskipun pendekatan pengujian unit yang dibahas sebelumnya lebih mirip pengujian kotak putih, pengujian integrasi adalah kotak hitam. (Ada juga opsi untuk pengujian internal yang ketat.) Kerangka kerja ini dibuat untuk mengambil program Pulumi lengkap dan melakukan berbagai operasi siklus hidup di dalamnya, seperti menerapkan tumpukan baru dari awal, memperbaruinya dengan variasi, dan menghapusnya, mungkin beberapa kali. . Kami menjalankannya secara teratur (misalnya, pada malam hari) dan sebagai tes stres.

(Kami kami sedang mengerjakannya, sehingga kemampuan pengujian integrasi serupa tersedia di SDK bahasa asli. Anda dapat menggunakan kerangka pengujian integrasi Go apa pun bahasa yang digunakan untuk menulis program Pulumi Anda).

Dengan menjalankan program menggunakan framework ini Anda dapat memeriksa hal berikut:

  • Kode proyek Anda benar secara sintaksis dan berjalan tanpa kesalahan.
  • Pengaturan konfigurasi tumpukan dan rahasia berfungsi dan ditafsirkan dengan benar.
  • Proyek Anda dapat berhasil diterapkan di penyedia cloud pilihan Anda.
  • Proyek Anda berhasil ditingkatkan dari status awal ke N status lainnya.
  • Proyek Anda berhasil dimusnahkan dan dihapus dari penyedia cloud Anda.

Seperti yang akan segera kita lihat, kerangka kerja ini juga dapat digunakan untuk melakukan validasi runtime.

Tes integrasi sederhana

Untuk melihat cara kerjanya, kita akan melihat repositori pulumi/examples, karena tim kami dan komunitas Pulumi menggunakannya untuk menguji pull request, commit, dan night build kami sendiri.

Di bawah ini adalah tes kami yang disederhanakan contoh yang menyediakan bucket S3 dan beberapa objek lainnya:

contoh_tes.pergi:

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

Pengujian ini melewati siklus hidup dasar dalam membuat, memodifikasi, dan menghancurkan tumpukan untuk sebuah folder aws-js-s3-folder. Diperlukan waktu sekitar satu menit untuk melaporkan tes yang lulus:

$ go test .
PASS
ok      ... 43.993s

Ada banyak opsi untuk menyesuaikan perilaku pengujian ini. Lihat daftar opsi selengkapnya. dalam struktur ProgramTestOptions. Misalnya, Anda dapat mengonfigurasi titik akhir Jaeger untuk melacak (Tracing), menunjukkan bahwa Anda memperkirakan pengujian akan gagal jika pengujian negatif (ExpectFailure), terapkan serangkaian “pengeditan” pada program untuk transisi keadaan yang berurutan (EditDirs) dan banyak lagi. Mari kita lihat cara menggunakannya untuk menguji penerapan aplikasi Anda.

Memeriksa properti sumber daya

Integrasi yang dibahas di atas memastikan bahwa program kami “berfungsi”—tidak crash. Namun bagaimana jika kita ingin memeriksa properti tumpukan yang dihasilkan? Misalnya, jenis sumber daya tertentu telah (atau belum) disediakan dan memiliki atribut tertentu.

Parameter ExtraRuntimeValidation untuk ProgramTestOptions memungkinkan kami melihat status pasca penerapan yang dicatat oleh Pulumi sehingga kami dapat melakukan pemeriksaan tambahan. Ini mencakup gambaran lengkap tentang status tumpukan yang dihasilkan, termasuk konfigurasi, nilai keluaran yang diekspor, semua sumber daya dan nilai propertinya, serta semua ketergantungan antar sumber daya.

Untuk melihat contoh dasarnya, mari kita periksa apakah program kita membuatnya Ember 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, saat kita menjalankan go test, ia tidak hanya akan menjalani serangkaian pengujian siklus hidup, namun juga, setelah berhasil menerapkan tumpukan, ia akan melakukan pemeriksaan tambahan pada status yang dihasilkan.

Tes waktu proses

Sejauh ini, semua pengujian murni mengenai perilaku penerapan dan model sumber daya Pulumi. Bagaimana jika Anda ingin memverifikasi bahwa infrastruktur yang Anda sediakan benar-benar berfungsi? Misalnya mesin virtual sedang berjalan, bucket S3 berisi apa yang kita harapkan, dan seterusnya.

Anda mungkin sudah menebak cara melakukan ini: opsi ExtraRuntimeValidation untuk ProgramTestOptions - ini adalah peluang besar untuk ini. Pada titik ini, Anda menjalankan pengujian Go kustom dengan akses ke status penuh sumber daya program Anda. Status ini mencakup informasi seperti alamat IP mesin virtual, URL, dan segala sesuatu yang diperlukan untuk benar-benar berinteraksi dengan aplikasi dan infrastruktur cloud yang dihasilkan.

Misalnya, program pengujian kami mengekspor properti webEndpoint ember disebut websiteUrl, yang merupakan URL lengkap tempat kita dapat mengonfigurasinya index document. Meskipun kita bisa menggali file negara untuk menemukannya bucket dan membaca properti itu secara langsung, namun dalam banyak kasus tumpukan kami mengekspor properti berguna seperti ini yang menurut kami mudah digunakan untuk memeriksa:

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 pemeriksaan runtime kami sebelumnya, pemeriksaan ini akan dijalankan segera setelah menaikkan tumpukan, semuanya sebagai respons terhadap panggilan sederhana go test. Dan itu hanyalah puncak gunung es—setiap fitur pengujian Go yang dapat Anda tulis dalam kode telah tersedia.

Integrasi Infrastruktur Berkelanjutan

Ada baiknya untuk dapat menjalankan pengujian di laptop ketika banyak perubahan infrastruktur sedang dilakukan untuk mengujinya sebelum mengirimkannya untuk peninjauan kode. Namun kami dan banyak klien kami menguji infrastruktur pada berbagai tahap siklus hidup pengembangan:

  • Di setiap permintaan tarik terbuka untuk pengujian sebelum penggabungan.
  • Menanggapi setiap penerapan, untuk memeriksa ulang apakah penggabungan telah dilakukan dengan benar.
  • Secara berkala, misalnya pada malam hari atau setiap minggu untuk pengujian tambahan.
  • Sebagai bagian dari pengujian kinerja atau stres, yang biasanya berjalan dalam jangka waktu lama dan menjalankan pengujian secara paralel dan/atau menerapkan program yang sama beberapa kali.

Untuk masing-masing hal tersebut, Pulumi mendukung integrasi dengan sistem integrasi berkelanjutan favorit Anda. Dengan integrasi berkelanjutan, hal ini memberi Anda cakupan pengujian yang sama untuk infrastruktur Anda seperti untuk perangkat lunak aplikasi Anda.

Pulumi memiliki dukungan untuk sistem CI umum. Berikut beberapa di antaranya:

Untuk informasi lebih rinci, silakan merujuk ke dokumentasi untuk Pengiriman terus menerus.

Lingkungan Efemeral

Peluang yang sangat kuat yang terbuka adalah kemampuan untuk menerapkan lingkungan fana semata-mata untuk tujuan pengujian penerimaan. Konsep proyek dan tumpukan Pulumi dirancang untuk dengan mudah menerapkan dan menghancurkan lingkungan yang benar-benar terisolasi dan independen, semuanya dalam beberapa perintah CLI sederhana atau menggunakan kerangka pengujian integrasi.

Jika Anda menggunakan GitHub, maka Pulumi menawarkan Aplikasi GitHub, yang akan membantu Anda menghubungkan pengujian penerimaan untuk menarik permintaan dalam saluran CI Anda. Cukup instal aplikasi di repositori GitHub, dan Pulumi akan menambahkan informasi tentang pratinjau infrastruktur, pembaruan, dan hasil pengujian ke permintaan CI dan kumpulan Anda:

Menguji Infrastruktur sebagai Kode dengan Pulumi. Bagian 2

Saat Anda menggunakan Pulumi untuk pengujian penerimaan inti, Anda akan memperoleh kemampuan otomatisasi baru yang akan meningkatkan produktivitas tim dan memberi Anda keyakinan terhadap kualitas perubahan Anda.

Total

Dalam artikel ini, kita telah melihat bahwa dengan menggunakan bahasa pemrograman tujuan umum, banyak teknik pengembangan perangkat lunak tersedia bagi kita yang berguna dalam mengembangkan aplikasi kita. Hal ini mencakup pengujian unit, pengujian integrasi, dan cara keduanya bekerja sama untuk melakukan pengujian runtime yang ekstensif. Pengujian mudah dijalankan sesuai permintaan atau di sistem CI Anda.

Pulumi - perangkat lunak sumber terbuka, gratis untuk digunakan dan berfungsi dengan bahasa pemrograman dan cloud favorit Anda - mencobanya hari ini!

Bagian pertama

Sumber: www.habr.com

Tambah komentar