

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 테스트 기반 개발 접근 방식 채택
<a name="development-best-practices"></a>

를 사용하여 테스트 기반 개발(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/) 및 JavaScript 또는 Python용 [pytest](https://docs.pytest.org/en/6.2.x/)와 같은 널리 사용되는 테스트 프레임워크를 사용하는 것입니다.

애플리케이션에 대해 작성할 수 있는 테스트에는 두 가지 범주가 있습니다 AWS CDK .
+ **세분화된 어설션**을 사용하여 생성된 CloudFormation 템플릿의 특정 측면을 테스트합니다(예: '이 리소스에는 이 값이 있는 이 속성이 있음'). 이러한 테스트는 회귀를 탐지할 수 있으며 TDD를 사용하여 새 기능을 개발할 때 유용합니다(먼저 테스트를 작성한 다음 올바른 구현을 작성하여 통과하도록 함). 세분화된 어설션이 가장 많이 작성하게 될 테스트입니다.
+ **스냅샷 테스트**를 사용하여 이전에 저장된 기본선 템플릿과 비교하여 합성된 CloudFormation 템플릿을 테스트합니다. 스냅샷 테스트를 통해 리팩터링된 코드가 원본과 정확히 동일한 방식으로 작동하는지 확인할 수 있으므로 자유롭게 리팩터링할 수 있습니다. 의도적으로 변경한 경우 향후 테스트에 사용할 새 기준선을 적용할 수 있습니다. 그러나 AWS CDK 업그레이드로 인해 합성된 템플릿이 변경될 수도 있으므로 구현이 올바른지 확인하기 위해 스냅샷에만 의존할 수 없습니다.

## 단위 테스트
<a name="unit-test"></a>

이 가이드는 특히 TypeScript의 단위 테스트 통합에 중점을 둡니다. 테스트를 활성화하려면 `package.json` 파일에의 `@types/jest`, `jest`및 라이브러리가 있어야 `ts-jest` 합니다`devDependencies`. 이 패키지를 추가하려면 `cdk init lib --language=typescript` 명령을 실행합니다. 이전 명령을 실행하면 다음 구조가 표시됩니다.

![\[단위 테스트 구조\]](http://docs.aws.amazon.com/ko_kr/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",
    ...
  }
}
```

**Test** 폴더에서 테스트 사례를 작성할 수 있습니다. 다음 예제에서는 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).

## 통합 테스트
<a name="integration-test"></a>

`integ-tests` 모듈을 사용하여 AWS CDK 구문에 대한 통합 테스트를 포함할 수도 있습니다. 통합 테스트는 AWS CDK 애플리케이션으로 정의해야 합니다. 통합 테스트와 AWS CDK 애플리케이션 간에one-to-one 관계가 있어야 합니다. 자세한 내용은 API 참조의 [integ-tests-alpha 모듈을](https://docs.aws.amazon.com/cdk/api/v2/docs/integ-tests-alpha-readme.html) 참조하세요. *AWS CDK * 