单元测试 AWS DynamoDB 需要很多时间
Unit test AWS DynamoDB take a lot of time
我 运行 针对 AWS Dynamo DB 进行了一些测试。我进行了一些集成测试,我需要加快它们的速度。 SetupTableAsync 大约需要 10 秒,代码在我的构造函数中,因此它在每个 instance/test 上 运行s。
是否可以在每个测试中使用相同的 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 Serverless Application with tests' 模板。
类似于 Dunedan 的建议:
在这些场景中,我通常依赖 DynamoDB Local:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.html
我喜欢这个有几个原因:
- 这也支持多个测试 运行 并行(在多个开发人员处理项目的情况下)。
- 更具成本效益
- 如果您使用内存开关,它不会在您终止进程后保留数据。
- 性能更高!
- 允许您 运行 在 CI 环境中进行测试(无需为创建/拆除表等权限提供访问密钥)
使用 Xunit,您可以 share the IAmazonDynamoDB
instance across tests
我 运行 针对 AWS Dynamo DB 进行了一些测试。我进行了一些集成测试,我需要加快它们的速度。 SetupTableAsync 大约需要 10 秒,代码在我的构造函数中,因此它在每个 instance/test 上 运行s。 是否可以在每个测试中使用相同的 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 Serverless Application with tests' 模板。
类似于 Dunedan 的建议:
在这些场景中,我通常依赖 DynamoDB Local:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.html
我喜欢这个有几个原因:
- 这也支持多个测试 运行 并行(在多个开发人员处理项目的情况下)。
- 更具成本效益
- 如果您使用内存开关,它不会在您终止进程后保留数据。
- 性能更高!
- 允许您 运行 在 CI 环境中进行测试(无需为创建/拆除表等权限提供访问密钥)
使用 Xunit,您可以 share the IAmazonDynamoDB
instance across tests