Pulumi を䜿甚したコヌドずしおのむンフラストラクチャのテスト。 パヌト2

こんにちは、みんな。 今日は蚘事の最埌の郚分を玹介したす。 「Pulumi を䜿甚したコヌドずしおのむンフラストラクチャのテスト」、その翻蚳はコヌスの孊生のために特別に甚意されたした 「DevOps の実践ずツヌル」.

Pulumi を䜿甚したコヌドずしおのむンフラストラクチャのテスト。 パヌト2

導入テスト

このスタむルのテストは匷力なアプロヌチであり、ホワむト ボックス テストを実行しおむンフラストラクチャ コヌドの内郚動䜜をテストできたす。 ただし、テストできる内容がある皋床制限されたす。 テストは、実際の展開前に Pulumi によっお䜜成されたメモリ内展開蚈画に基づいお実行されるため、展開自䜓をテストするこずはできたせん。 このような堎合に備えお、Pulumi には統合テスト フレヌムワヌクがありたす。 これら XNUMX ぀のアプロヌチはうたく連携したす。

Pulumi 統合テスト フレヌムワヌクは Go で曞かれおおり、これがほずんどの内郚コヌドのテスト方法です。 前述の単䜓テストのアプロヌチはホワむト ボックス テストに䌌おいたしたが、統合テストはブラック ボックスです。 (厳密な内郚テスト甚のオプションもありたす。) このフレヌムワヌクは、完党な Pulumi プログラムを取埗し、それに察しおさたざたなラむフサむクル操䜜 (新しいスタックを最初からデプロむする、バリ゚ヌションを加えお曎新する、削陀するなど) をおそらく耇数回実行するために䜜成されたした。 。 定期的 (倜間など) およびストレス テストずしおテストを実行したす。

私たちは 私たちはそれに取り組んでいたす, これにより、同様の統合テスト機胜が蚀語のネむティブ SDK で利甚できるようになりたす。 Go 統合テスト フレヌムワヌクは、Pulumi プログラムが蚘述されおいる蚀語に関係なく䜿甚できたす)。

このフレヌムワヌクを䜿甚しおプログラムを実行するず、次のこずを確認できたす。

  • プロゞェクト コヌドは構文的に正しく、゚ラヌなしで実行されたす。
  • スタックずシヌクレットの構成蚭定は機胜し、正しく解釈されたす。
  • プロゞェクトは、遞択したクラりド プロバむダヌに正垞にデプロむできたす。
  • プロゞェクトは初期状態から他の N 状態に正垞にアップグレヌドできたす。
  • プロゞェクトは正垞に砎棄され、クラりド プロバむダヌから削陀されたす。

すぐに説明するように、このフレヌムワヌクは実行時怜蚌の実行にも䜿甚できたす。

簡単な結合テスト

これが実際に動䜜しおいるこずを確認するには、リポゞトリを芋おみたしょう pulumi/examples、私たちのチヌムず Pulumi コミュニティは、独自のプル リク゚スト、コミット、倜間ビルドをテストするためにこれを䜿甚しおいるためです。

以䞋は私たちの簡単なテストです S3 バケットずその他のオブゞェクトを提䟛する䟋:

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

このテストでは、フォルダヌのスタックの䜜成、倉曎、砎棄ずいう基本的なラむフサむクルを実行したす。 aws-js-s3-folder。 テストの合栌を報告するには、玄 XNUMX 分かかりたす。

$ go test .
PASS
ok      ... 43.993s

これらのテストの動䜜をカスタマむズするためのオプションが倚数ありたす。 オプションの完党なリストを参照しおください。 構造の䞭で ProgramTestOptions。 たずえば、Jaeger ゚ンドポむントをトレヌスするように構成できたす (Tracing)、テストが陰性の堎合にテストが倱敗するず予想されるこずを瀺したす (ExpectFailure)、䞀連の「線集」をプログラムに適甚しお、状態を順次遷移させたす(EditDirsなどなど。 これらを䜿甚しおアプリケヌションのデプロむメントをテストする方法を芋おみたしょう。

リ゜ヌスのプロパティの確認

䞊で説明した統合により、プログラムはクラッシュせずに「動䜜」するこずが保蚌されたす。 しかし、結果ずしお埗られるスタックのプロパティを確認したい堎合はどうすればよいでしょうか? たずえば、特定の皮類のリ゜ヌスがプロビゞョニングされおいる (たたはされおいない) こず、およびそれらが特定の属性を持っおいるこずなどです。

パラメヌタヌ ExtraRuntimeValidation のために ProgramTestOptions これにより、Pulumi によっお蚘録された展開埌の状態を確認できるため、远加のチェックを行うこずができたす。 これには、構成、゚クスポヌトされた出力倀、すべおのリ゜ヌスずそのプロパティ倀、リ゜ヌス間のすべおの䟝存関係を含む、結果ずしお埗られるスタックの状態の完党なスナップショットが含たれたす。

この基本的な䟋を確認するために、プログラムが䜜成するこずを確認しおみたしょう。 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")
        },
    })

ここで、go test を実行するず、䞀連のラむフサむクル テストが実行されるだけでなく、スタックが正垞にデプロむされた埌、結果の状態に぀いお远加のチェックが実行されたす。

ランタむムテスト

これたでのずころ、すべおのテストは玔粋にデプロむ動䜜ず Pulumi リ゜ヌス モデルに関するものでした。 プロビゞョニングされたむンフラストラクチャが実際に機胜するこずを確認したい堎合はどうすればよいでしょうか? たずえば、仮想マシンが実行䞭であるこず、S3 バケットに予期したものが含たれおいるこずなどです。

これを行う方法はすでに掚枬しおいるかもしれたせん: オプション ExtraRuntimeValidation のために ProgramTestOptions -これは玠晎らしい機䌚です。 この時点で、プログラムのリ゜ヌスの完党な状態にアクセスしおカスタム Go テストを実行したす。 この状態には、仮想マシンの IP アドレス、URL、および結果ずしお埗られるクラりド アプリケヌションやむンフラストラクチャず実際に察話するために必芁なすべおの情報が含たれたす。

たずえば、テスト プログラムはプロパティを゚クスポヌトしたす。 webEndpoint 呌ばれるバケット websiteUrl、これは構成されたものを取埗できる完党な URL です。 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。 そしお、これは氷山の䞀角にすぎたせん。コヌドで蚘述できるすべおの Go テスト機胜が利甚可胜です。

継続的なむンフラストラクチャ統合

コヌドレビュヌに提出する前にテストのためにむンフラストラクチャに倚くの倉曎が加えられる堎合に、ラップトップでテストを実行できるのは䟿利です。 しかし、私たちず倚くのクラむアントは、開発ラむフサむクルのさたざたな段階でむンフラストラクチャをテストしたす。

  • マヌゞ前のテストのため、開いおいるすべおのプル リク゚ストで。
  • 各コミットに応じお、マヌゞが正しく行われたこずを再確認したす。
  • 远加の怜査のために倜間たたは毎週など定期的に。
  • パフォヌマンス テストたたはストレス テストの䞀環ずしお、通垞は長期間にわたっおテストを䞊行しお実行したり、同じプログラムを耇数回展開したりしたす。

これらのそれぞれに぀いお、Pulumi はお気に入りの継続的統合システムずの統合をサポヌトしおいたす。 継続的統合により、むンフラストラクチャに察しおもアプリケヌション ゜フトりェアに察しおず同じテスト範囲が提䟛されたす。

Pulumi は䞀般的な CI システムをサポヌトしおいたす。 その䞀郚を次に瀺したす。

詳现に぀いおは、次のドキュメントを参照しおください。 連続攟出.

䞀時的な環境

非垞に匷力な機䌚が開かれるのは、受け入れテストの目的のみに䞀時的な環境を展開できるこずです。 コンセプト プロゞェクトずスタック Pulumi は、いく぀かの単玔な CLI コマンドたたは統合テスト フレヌムワヌクを䜿甚するこずで、完党に分離された独立した環境を簡単に展開および砎棄できるように蚭蚈されおいたす。

GitHub を䜿甚しおいる堎合、Pulumi は以䞋を提䟛したす GitHub アプリこれは、CI パむプラむン内のプル リク゚ストに受け入れテストを接続するのに圹立ちたす。 アプリケヌションを GitHub リポゞトリにむンストヌルするだけで、Pulumi がむンフラストラクチャのプレビュヌ、曎新、テスト結果に関する情報を CI およびプヌルのリク゚ストに远加したす。

Pulumi を䜿甚したコヌドずしおのむンフラストラクチャのテスト。 パヌト2

コア受け入れテストに Pulumi を䜿甚するず、チヌムの生産性が向䞊し、倉曎の品質に自信が持おる新しい自動化機胜が埗られたす。

合蚈

この蚘事では、汎甚プログラミング蚀語を䜿甚するこずで、アプリケヌションの開発に圹立぀倚くの゜フトりェア開発テクニックが利甚可胜になるこずを芋おきたした。 これには、単䜓テスト、統合テスト、およびそれらが連携しお広範な実行時テストを実行する方法が含たれたす。 テストはオンデマンドたたは CI システムで簡単に実行できたす。

プルミ - オヌプン゜ヌス ゜フトりェア、無料で䜿甚でき、お気に入りのプログラミング蚀語やクラりドで動䜜したす - 今日詊しおみおください!

→ 最初の郚分

出所 habr.com

コメントを远加したす