清理测试装置

Clean up test fixtures

我有一个 CloudFormation 堆栈,它定义了一个由 DynamoDB 提供支持的 GraphQL API。我想要 运行 一个测试脚本:

执行此操作的“简洁方法”是为测试创建一个新阶段,但这非常耗时(就等待结果所花费的挂钟时间而言)。

“困难的方法”是精确跟踪在测试过程中创建的每条 DynamoDB 记录,然后在之后将它们一一删除(and/or 使用多次批量更新)。这将是一个巨大的编码痛苦,而且出错的可能性非常高。

一种中间方法是使用专门的预先存在的集成测试阶段,在测试结束时将其清除,并确保只有一组测试 运行ning时间。这将需要编写一个脚本来手动清除表,这听起来比“困难的方法”稍微不那么乏味和容易出错。

对此是否有既定的最佳实践?还有其他我没有考虑过的方法吗?

部署堆栈需要多长时间?

如果只花费 运行 测试的一小部分时间,则测试使用 "clean way",否则使用已部署专用测试堆栈的中间方法。

您不必编写脚本。 我实际上正是为此目的编写了一个测试库: https://github.com/erezrokah/aws-testing-library/blob/master/src/jest/README.md#tohaveitem

用法示例(TypeScript):

import { clearAllItems } from 'aws-testing-library/lib/utils/dynamoDb';
import { invoke } from 'aws-testing-library/lib/utils/lambda';

describe('db service e2e tests', () => {
  const region = 'us-east-1';
  const table = 'db-service-dev';
  beforeEach(async () => {
    await clearAllItems(region, table);
  });

  afterEach(async () => {
    await clearAllItems(region, table);
  });

  test('should create db entry on lambda invoke', async () => {
    const result = await invoke(region, 'db-service-dev-create', {
      body: JSON.stringify({ text: 'from e2e test' }),
    });
    const lambdaItem = JSON.parse(result.body);

    expect.assertions(1);
    await expect({ region, table, timeout: 0 }).toHaveItem(
      { id: lambdaItem.id },
      lambdaItem,
    );
  });
});

如果您自己编写脚本,您可能需要考虑最终一致性并重试(因为写入后数据可能无法直接使用)

我会在测试结束时删除此 "test stack",然后让 CloudFormation 为您清理 DynamoDB -- 查看 DeletionPolicy 文档。

您可能想要从您的 CI 环境中 trigger/hook 堆栈删除,无论它是什么。例如,我找到了这个 CodePipeline 演练:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/continuous-delivery-codepipeline-basic-walkthrough.html