清理测试装置
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
我有一个 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