

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# テスト駆動型の開発アプローチを採用


では、テスト駆動型開発 (TDD) アプローチに従うことをお勧めします AWS CDK。TDD は、コードを指定して検証するためのテストケースを開発するソフトウェア開発アプローチです。簡単に言うと、まず機能ごとにテストケースを作成し、テストが失敗したら、テストをパスする新しいコードを書き、コードをシンプルでバグのないものにします。

TDD を使って最初にテストケースを書くことができます。これにより、リソースにセキュリティポリシーを適用し、プロジェクト固有の命名規則に従うという点で、さまざまな設計上の制約があるインフラストラクチャを検証できます。 AWS CDK アプリケーションをテストするための標準的なアプローチは、 AWS CDK [アサーション](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.assertions-readme.html) モジュールと、TypeScript 用の [Jest](https://jestjs.io/) や Python 用の JavaScript や [pytest](https://docs.pytest.org/en/6.2.x/) などの一般的なテストフレームワークを使用することです。

アプリケーション用に記述できるテストには 2 つのカテゴリがあります AWS CDK 。
+ **きめ細かいアサーション**を使用して、例えば「このリソースにはこの値を持つこのプロパティがあります」など、生成された CloudFormation テンプレートの特定の側面をテストします。これらのテストはリグレッションを検出できるだけでなく、TDD を使用して新機能を開発する場合にも役立ちます (最初にテストを書いてから、正しい実装を書いてパス合格させます)。きめ細かいアサーションは、最も多く作成するテストです。
+ **スナップショットテスト**を使用して、合成されたCloudFormation テンプレートを、以前に保存したベースラインテンプレートと照合してテストします。スナップショットテストでは、リファクタリングされたコードが元のコードとまったく同じように動作することを確認できるため、自由にリファクタリングできます。変更が意図的なものであった場合は、将来のテストのために新しいベースラインを受け入れることができます。ただし、 AWS CDK アップグレードすると合成されたテンプレートが変更される可能性があるため、実装が正しいことを確認するためにスナップショットのみに依存することはできません。

## ユニットテスト


このガイドでは、特に TypeScript のユニットテスト統合を中心に説明します。テストを有効にするには、 `package.json` `ts-jest`ファイルに `@types/jest`、、 `jest`のライブラリがあることを確認します`devDependencies`。これらのパッケージを追加するには、`cdk init lib --language=typescript` のコマンドを実行します。上記のコマンドを実行すると、次の構造が表示されます。

![\[ユニットテスト構造\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/best-practices-cdk-typescript-iac/images/unit_test_structure.png)


次のコードは、Jest ライブラリで有効になっている`package.json`ファイルの例です。

```
{
  ...
  "scripts": {
    "build": "npm run lint && tsc",
    "watch": "tsc -w",
    "test": "jest",
  },
  "devDependencies": {
    ...
    "@types/jest": "27.5.2",
    "jest": "27.5.1",
    "ts-jest": "27.1.5",
    ...
  }
}
```

**テスト**フォルダの下にテストケースを書き込めます。次の例は、 AWS CodePipeline コンストラクトのテストケースを示しています。

```
import { Stack } from 'aws-cdk-lib';
import { Template } from 'aws-cdk-lib/assertions';
import * as CodePipeline from 'aws-cdk-lib/aws-codepipeline';
import * as CodePipelineActions from 'aws-cdk-lib/aws-codepipeline-actions';
import { MyPipelineStack } from '../lib/my-pipeline-stack';
test('Pipeline Created with GitHub Source', () => {
  // ARRANGE
  const stack = new Stack();
  // ACT
  new MyPipelineStack(stack, 'MyTestStack');
  // ASSERT
  const template = Template.fromStack(stack);
  // Verify that the pipeline resource is created
  template.resourceCountIs('AWS::CodePipeline::Pipeline', 1);
  // Verify that the pipeline has the expected stages with GitHub source
  template.hasResourceProperties('AWS::CodePipeline::Pipeline', {
    Stages: [
      {
        Name: 'Source',
        Actions: [
          {
            Name: 'SourceAction',
            ActionTypeId: {
              Category: 'Source',
              Owner: 'ThirdParty',
              Provider: 'GitHub',
              Version: '1'
            },
            Configuration: {
              Owner: {
                'Fn::Join': [
                  '',
                  [
                    '{{resolve:secretsmanager:',
                    {
                      Ref: 'GitHubTokenSecret'
                    },
                    ':SecretString:owner}}'
                  ]
                ]
              },
              Repo: {
                'Fn::Join': [
                  '',
                  [
                    '{{resolve:secretsmanager:',
                    {
                      Ref: 'GitHubTokenSecret'
                    },
                    ':SecretString:repo}}'
                  ]
                ]
              },
              Branch: 'main',
              OAuthToken: {
                'Fn::Join': [
                  '',
                  [
                    '{{resolve:secretsmanager:',
                    {
                      Ref: 'GitHubTokenSecret'
                    },
                    ':SecretString:token}}'
                  ]
                ]
              }
            },
            OutputArtifacts: [
              {
                Name: 'SourceOutput'
              }
            ],
            RunOrder: 1
          }
        ]
      },
      {
        Name: 'Build',
        Actions: [
          {
            Name: 'BuildAction',
            ActionTypeId: {
              Category: 'Build',
              Owner: 'AWS',
              Provider: 'CodeBuild',
              Version: '1'
            },
            InputArtifacts: [
              {
                Name: 'SourceOutput'
              }
            ],
            OutputArtifacts: [
              {
                Name: 'BuildOutput'
              }
            ],
            RunOrder: 1
          }
        ]
      }
      // Add more stage checks as needed
    ]
  });
  // Verify that a GitHub token secret is created
  template.resourceCountIs('AWS::SecretsManager::Secret', 1);
});
);
```

テストを実行するには、プロジェクト内の `npm run test` コマンドを実行します。テストは次の結果を返します。

```
PASS  test/codepipeline-module.test.ts (5.972 s)
  ✓ Code Pipeline Created (97 ms)
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        6.142 s, estimated 9 s
```

テストケースの詳細については、 *AWS Cloud Development Kit (AWS CDK) デベロッパーガイド*の[「コンストラクトのテスト](https://docs.aws.amazon.com/cdk/v2/guide/testing.html)」を参照してください。

## 統合テスト


 AWS CDK コンストラクトの統合テストは、 `integ-tests`モジュールを使用して含めることもできます。統合テストは AWS CDK アプリケーションとして定義する必要があります。統合テストと AWS CDK アプリケーションの間には one-to-one の関係が必要です。詳細については、 *AWS CDK API リファレンス*[の integ-tests-alpha モジュール](https://docs.aws.amazon.com/cdk/api/v2/docs/integ-tests-alpha-readme.html)を参照してください。