

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Adopsi pendekatan pengembangan berbasis pengujian
<a name="development-best-practices"></a>

Kami menyarankan Anda mengikuti pendekatan pengembangan berbasis tes (TDD) dengan. AWS CDK TDD adalah pendekatan pengembangan perangkat lunak di mana Anda mengembangkan kasus uji untuk menentukan dan memvalidasi kode Anda. Secara sederhana, pertama Anda membuat kasus uji untuk setiap fungsi dan jika tes gagal, maka Anda menulis kode baru untuk lulus tes dan membuat kode sederhana dan bebas bug.

Anda dapat menggunakan TDD untuk menulis kasus uji terlebih dahulu. Ini membantu Anda memvalidasi infrastruktur dengan kendala desain yang berbeda dalam hal menegakkan kebijakan keamanan untuk sumber daya dan mengikuti konvensi penamaan unik untuk proyek. [Pendekatan standar untuk menguji AWS CDK aplikasi adalah dengan menggunakan modul AWS CDK[pernyataan](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.assertions-readme.html) dan kerangka pengujian populer, seperti [Jest](https://jestjs.io/) untuk TypeScript dan atau pytest untuk JavaScript Python.](https://docs.pytest.org/en/6.2.x/)

Ada dua kategori tes yang dapat Anda tulis untuk AWS CDK aplikasi Anda:
+ Gunakan **pernyataan berbutir halus** untuk menguji aspek tertentu dari CloudFormation template yang dihasilkan, seperti “sumber daya ini memiliki properti ini dengan nilai ini.” Tes ini dapat mendeteksi regresi dan juga berguna saat Anda mengembangkan fitur baru menggunakan TDD (tulis tes terlebih dahulu, lalu lulus dengan menulis implementasi yang benar). Pernyataan berbutir halus adalah tes yang paling sering Anda tulis.
+ Gunakan **tes snapshot** untuk menguji template yang disintesis terhadap CloudFormation templat dasar yang disimpan sebelumnya. Tes snapshot memungkinkan untuk melakukan refactor secara bebas, karena Anda dapat yakin bahwa kode refactored bekerja persis dengan cara yang sama seperti aslinya. Jika perubahan itu disengaja, Anda dapat menerima baseline baru untuk pengujian masa depan. Namun, AWS CDK peningkatan juga dapat menyebabkan templat yang disintesis berubah, sehingga Anda tidak dapat hanya mengandalkan snapshot untuk memastikan implementasi Anda benar.

## Tes unit
<a name="unit-test"></a>

Panduan ini berfokus pada integrasi pengujian unit untuk TypeScript secara khusus. Untuk mengaktifkan pengujian, pastikan `package.json` file Anda memiliki pustaka berikut:`@types/jest`,`jest`, dan `ts-jest` di`devDependencies`. Untuk menambahkan paket-paket ini, jalankan `cdk init lib --language=typescript` perintah. Setelah Anda menjalankan perintah sebelumnya, Anda melihat struktur berikut.

![\[Struktur uji unit\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/best-practices-cdk-typescript-iac/images/unit_test_structure.png)


Kode berikut adalah contoh `package.json` file yang diaktifkan dengan pustaka Jest.

```
{
  ...
  "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",
    ...
  }
}
```

Di bawah folder **Uji**, Anda dapat menulis kasus uji. Contoh berikut menunjukkan kasus uji untuk AWS CodePipeline konstruksi.

```
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);
});
);
```

Untuk menjalankan pengujian, jalankan `npm run test` perintah dalam proyek Anda. Tes mengembalikan hasil berikut.

```
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
```

Untuk informasi selengkapnya tentang kasus [pengujian, lihat Menguji konstruksi](https://docs.aws.amazon.com/cdk/v2/guide/testing.html) di *Panduan AWS Cloud Development Kit (AWS CDK) Pengembang*.

## Tes integrasi
<a name="integration-test"></a>

Tes integrasi untuk AWS CDK konstruksi juga dapat disertakan dengan menggunakan `integ-tests` modul. Tes integrasi harus didefinisikan sebagai AWS CDK aplikasi. Harus ada one-to-one hubungan antara tes integrasi dan AWS CDK aplikasi. Untuk informasi selengkapnya, kunjungi [integ-tests-alpha modul](https://docs.aws.amazon.com/cdk/api/v2/docs/integ-tests-alpha-readme.html) di *Referensi AWS CDK API*.