【问题标题】:Unit test AWS DynamoDB take a lot of time单元测试 AWS DynamoDB 需要很多时间
【发布时间】:2025-11-30 17:35:01
【问题描述】:

我确实针对 AWS Dynamo DB 运行了一些测试。我得到了一些集成测试,我需要加快它们的速度。 SetupTableAsync 需要大约 10 秒,并且代码在我的构造函数中,因此它在每个实例/测试上运行。 是否可以在每次测试中使用相同的 IAmazonDynamoDB 实例?

private string TableName { get; }
IAmazonDynamoDB DDBClient { get; }

public FunctionTest()
{
    this.TableName = "Table-" + DateTime.Now.Ticks;
    this.DDBClient = new AmazonDynamoDBClient(RegionEndpoint.EUWest1);

    SetupTableAsync().Wait();
}

//... some tests

private async Task SetupTableAsync()
{
    var request = new CreateTableRequest
    {
        TableName = this.TableName,
        ProvisionedThroughput = new ProvisionedThroughput
        {
            ReadCapacityUnits = 2,
            WriteCapacityUnits = 2
        },
        KeySchema = new List<KeySchemaElement>
        {
            new KeySchemaElement
            {
                KeyType = KeyType.HASH,
                AttributeName = UserFunctions.ID_QUERY_STRING_NAME
            }
        },
        AttributeDefinitions = new List<AttributeDefinition>
        {
            new AttributeDefinition
            {
                AttributeName = UserFunctions.ID_QUERY_STRING_NAME,
                AttributeType = ScalarAttributeType.S
            }
        }
    };

    await this.DDBClient.CreateTableAsync(request);

    var describeRequest = new DescribeTableRequest { TableName = this.TableName };
    DescribeTableResponse response = null;
    do
    {
        Thread.Sleep(1000);
        response = await this.DDBClient.DescribeTableAsync(describeRequest);
    } while (response.Table.TableStatus != TableStatus.ACTIVE);
}

此代码来自 Visual Studio 中的“带有测试的 AWS 无服务器应用程序”模板。

【问题讨论】:

标签: amazon-web-services asp.net-core amazon-dynamodb xunit serverless-framework


【解决方案1】:

类似于 Dunedan 的建议:

在这些场景中,我通常依赖 DynamoDB Local:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.html

我喜欢这个有几个原因:

  • 这还支持并行运行多个测试(如果有多个开发人员在项目上工作)。
  • 更具成本效益
  • 如果您使用 in memory 开关,它不会在您终止进程后保留数据。
  • 性能更高!
  • 允许您在 CI 环境中运行测试(无需为创建/拆除表等权限提供访问密钥)

【讨论】:

  • 但是 DynamoDB 只能在我的本地环境中工作?因为我将我的代码推送到 VSTS 并且我的测试也会运行。有办法解决吗?
  • 没用过 VSTS,但在 Travis CI 和 Team City 等其他 CI 工具中,我要么在测试启动时启动了单独的 DynamoDB Local 进程,要么使用 Docker 之类的东西来启动它(将您从已安装的 java 中拯救出来)。
【解决方案2】:

【讨论】:

    最近更新 更多