0Pricing
Terraform Infrastructure as Code · レッスン

Terratest によるユニットテスト

インフラコードをテストする Go ライブラリ Terratest を使って、Terraform モジュールのユニットテストを記述する方法を学びます。

「Terratest によるユニットテスト」はCoddyKit上の無料Terraform Infrastructure as Codeレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTerraform Infrastructure as Code学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Terraform Infrastructure as Codeコースには全4レッスンが含まれています。

IaC をテストする理由

Infrastructure as Code(IaC)を使うと、ソフトウェアと同じようにインフラストラクチャを管理できます。ソフトウェアと同様に、IaC の設定にもバグが入り込む可能性があります。

  • 信頼性:デプロイ前にエラーを発見できます。
  • 一貫性:リソースが期待どおりにプロビジョニングされることを確認できます。
  • 安心感:既存のインフラストラクチャを壊す不安を減らして変更できます。

堅牢で保守しやすいクラウド環境を構築するには、Terraform コードのテストが不可欠です。

ユニットテストと統合テスト

IaC のテストでは、主に次の 2 種類について説明します。

  • ユニットテスト:単一の Terraform モジュールなど、コードの小さく独立した部分に焦点を当てます。各コンポーネントが単独で正しく動作することを確認します。
  • 統合テスト:複数のコンポーネントやモジュールがシステムとして連携して動作することを確認します。多くの場合、クラウド環境に実際のリソースをデプロイします。

このレッスンでは、Terraform モジュールのユニットテストに焦点を当てます。

Terratest の紹介

Terratest は、Terraform の開発元である HashiCorp が開発した、インフラストラクチャコードのテスト専用 Go ライブラリです。

  • Terraform、Packer、Kubernetes などの IaC コードに対する自動テストの作成を支援します。
  • Terratest はクラウドプロバイダーに実際のインフラストラクチャをデプロイし、それに対してアサーションを実行した後、リソースをクリーンアップできます。
  • ユニットテストと統合テストの両方で強力な機能を発揮します。

Terratestの前提条件

Terratestを始めるには、いくつか準備が必要です。

  • Go: TerratestはGoのライブラリであるため、Goをインストールする必要があります(バージョン1.13以降を推奨します)。
  • Terraform CLI: Terraformのコマンドラインインターフェースをインストールし、利用できる状態にする必要があります。
  • クラウドプロバイダーの認証情報: 実際のリソースをデプロイする場合(クラウドAPIにアクセスする単体テストの場合も含む)、認証済みのクラウドプロバイダーアクセスが必要です(例: AWS CLIを設定済みの状態)。

また、Goプログラミングの基本概念についての知識も必要です。

Goテストファイルの構成

TerratestのテストはGoで記述し、Goの標準的なテスト規約に従います。

  • テストファイルの末尾は_test.goです(例: main_test.go)。
  • テスト関数はTestで始まります(例: TestMyModule(t *testing.T))。
  • Go組み込みのtestingパッケージを使用します。

通常、これらのファイルはTerraformモジュールと同じディレクトリに置くか、専用のtestディレクトリに配置します。

`terraform.Options`の説明

TerratestでTerraformをテストする際の中心となるのが、terraform.Options構造体です。このオブジェクトで、TerratestがTerraformを実行する方法を指定します。

主なフィールドは次のとおりです。

  • TerraformDir: Terraformモジュールへのパスです。
  • Vars: Terraformモジュールに渡す入力変数です。
  • EnvVars: Terraformプロセスに設定する環境変数です。
  • BackendConfig: Terraformバックエンドの設定です。

これは、テスト内でTerraformコマンドを実行するための設計図です。

基本的なテストの流れ

Terraformを対象とするTerratestの一般的な単体テストは、次の手順で行います。

  1. オプションを定義する: モジュールを指し、変数を設定したterraform.Options構造体を作成します。
  2. デプロイする: terraform.InitAndApply(t, options)を使用して、設定を初期化して適用します。
  3. 破棄を遅延実行する: テスト終了後のクリーンアップを確実に行うため、すぐにdefer terraform.Destroy(t, options)を追加します。
  4. アサーションを行う: Goのtestify/assertまたはTerratestのterraform.Outputを使用して、リソースのプロパティや出力を確認します。

これにより、クリーンで分離されたテスト環境を確保できます。

`terraform.Options`のコーディング

ここでは、terraform.Optionsの設定方法を示すシンプルなGoプログラムを紹介します。これは、Terratestを使用する際の基本的な手順です。

package main

import (
	"fmt"
	"path/filepath"
	"github.com/gruntwork-io/terratest/modules/terraform"
)

func main() {
	// Define the path to your Terraform configuration directory.
	// In a real test, this would point to your module under test.
	terraformConfigDir := filepath.Join(".", "my-example-module")

	// Create a terraform.Options object.
	// This struct holds all the configuration for running Terraform via Terratest.
	options := &terraform.Options{
		TerraformDir: terraformConfigDir,
		// You would add input variables here, e.g.:
		// Vars: map[string]interface{}{"instance_type": "t2.micro"},
		// And environment variables, e.g.:
		// EnvVars: map[string]string{"AWS_REGION": "us-east-1"},
	}

	fmt.Println("--- Terratest Options Configuration Demo ---")
	fmt.Printf("Configured Terraform Directory: %s\n", options.TerraformDir)
	fmt.Println("This shows how to initialize Terratest options.")
	fmt.Println("Actual Terratest unit tests are run using 'go test' command.")
}

出力をアサートする

Terraformの設定を適用した後は、その出力を検証します。Terratestには、これらの値を簡単に取得するための関数が用意されています。

  • terraform.Output(t, options, "output_name"): 1つの文字列出力を取得します。
  • terraform.OutputMap(t, options, "output_name"): map形式の出力を取得します。
  • terraform.OutputList(t, options, "output_name"): list形式の出力を取得します。

その後、Goのテスト用アサーション(例: github.com/stretchr/testify/assertのアサーション)を使用して、出力が期待どおりかどうかを確認します。

理解度を確認する

Terratestを使用すると、実際のクラウドリソースを操作してTerraformコードをテストできます。次のうち、Terratestの単体テストの一般的な流れに含まれないものはどれですか。

まとめと次のステップ

Terratestを使ったTerraformの単体テストの基礎を学びました。

  • TerratestはIaCをテストするためのGoライブラリです。
  • 実際のクラウドインフラストラクチャをデプロイし、アサーションを行い、クリーンアップできます。
  • 主な構成要素には、_test.goファイル、func TestXxx(t *testing.T)、terraform.Options構造体があります。
  • ワークフローでは、オプションの定義、Terraformの適用、アサーション、deferを使ったクリーンアップを行います。

次は、より複雑なアサーションの記述方法と、自動テストのためにTerratestをCI/CDパイプラインへ統合する方法を学びましょう。

よくある質問

「Terratest によるユニットテスト」レッスンは無料ですか?

はい。「Terratest によるユニットテスト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Terraform Infrastructure as Codeコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Terraform Infrastructure as Codeコースには全4レッスンが含まれています。

「Terratest によるユニットテスト」で何を学びますか?

インフラコードをテストする Go ライブラリ Terratest を使って、Terraform モジュールのユニットテストを記述する方法を学びます。 ブラウザで直接実行するハンズオンコードでTerraform Infrastructure as Codeを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Terraform Infrastructure as Codeを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTerraform Infrastructure as Codeは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「Terratest によるユニットテスト」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTerraform Infrastructure as Codeレッスンでコードを書いて実行できますか?

はい。すべてのTerraform Infrastructure as Codeレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Terraform の `validate` と `fmt`
  2. Terratest によるユニットテスト
  3. クラウドリソースの統合テスト
  4. Policy as Codeとコンプライアンスチェック
← Terraform Infrastructure as Codeに戻る