You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Citrus 4.0.1集成测试框架测试AWS DynamoDB批量操作?

Citrus Framework 4.0.1 测试AWS DynamoDB操作(batchGetItem/batchWriteItem)最佳实践

一、基于现有自定义Action的优化方向

你当前通过Lambda Action调用DynamoDB操作的方式可以进一步封装,提升复用性:

  • 将DynamoDB操作封装为独立的TestAction实现类,注入已有的DynamoDB连接Bean,支持batchWriteItem、batchGetItem等操作类型
  • 封装通用的DynamoDB工具类,提供批量写入、查询、结果转换等方法,减少测试代码中的重复逻辑

二、batchWriteItem操作的测试与结果验证

1. 执行批量写入

直接在自定义Action中构造BatchWriteItemRequest并执行:

$(context -> {
    DynamoDbClient dynamoDbClient = context.getBean(DynamoDbClient.class);
    
    // 构造批量写入请求(包含2条Put请求)
    BatchWriteItemRequest writeRequest = BatchWriteItemRequest.builder()
        .requestItems(Map.of("your-test-table", List.of(
            WriteRequest.builder()
                .putRequest(PutRequest.builder().item(Map.of(
                    "id", AttributeValue.builder().s("item-001").build(),
                    "status", AttributeValue.builder().s("ACTIVE").build()
                )).build())
                .build(),
            WriteRequest.builder()
                .putRequest(PutRequest.builder().item(Map.of(
                    "id", AttributeValue.builder().s("item-002").build(),
                    "status", AttributeValue.builder().s("INACTIVE").build()
                )).build())
                .build()
        )))
        .build();
    
    dynamoDbClient.batchWriteItem(writeRequest);
});

2. 验证写入结果

执行写入后,通过扫描或查询获取数据,存入Citrus上下文后用断言验证:

// 查询表中所有数据
$(context -> {
    DynamoDbClient dynamoDbClient = context.getBean(DynamoDbClient.class);
    ScanResponse scanResponse = dynamoDbClient.scan(ScanRequest.builder().tableName("your-test-table").build());
    // 将查询结果存入上下文变量
    context.setVariable("dynamodb_scan_results", scanResponse.items());
});

// 使用Citrus断言验证结果
assertThat(context.getVariable("dynamodb_scan_results"))
    .hasSize(2); // 验证总条数
assertThat(context.getVariable("dynamodb_scan_results[0].id.s"))
    .isEqualTo("item-001"); // 验证具体字段值
assertThat(context.getVariable("dynamodb_scan_results[1].status.s"))
    .isEqualTo("INACTIVE");

三、batchGetItem操作的测试与结果验证

1. 准备测试数据并执行批量查询

先通过batchWriteItem写入待查询的测试数据(或在测试前置步骤中初始化),再构造batchGetItem请求执行查询:

$(context -> {
    DynamoDbClient dynamoDbClient = context.getBean(DynamoDbClient.class);
    
    // 构造批量查询请求,指定要获取的主键
    BatchGetItemRequest getRequest = BatchGetItemRequest.builder()
        .requestItems(Map.of("your-test-table", KeysAndAttributes.builder()
            .keys(List.of(
                Map.of("id", AttributeValue.builder().s("item-001").build()),
                Map.of("id", AttributeValue.builder().s("item-002").build())
            ))
            .build()))
        .build();
    
    BatchGetItemResponse getResponse = dynamoDbClient.batchGetItem(getRequest);
    // 将批量查询结果存入上下文
    context.setVariable("batch_get_results", getResponse.responses().get("your-test-table"));
});

2. 验证查询结果

直接对上下文变量中的结果进行断言:

assertThat(context.getVariable("batch_get_results"))
    .hasSize(2);
assertThat(context.getVariable("batch_get_results[0].status.s"))
    .isEqualTo("ACTIVE");

四、通用测试最佳实践

  • 测试数据隔离:使用测试专用的DynamoDB实例(如本地DynamoDB Local),避免污染生产环境;测试前清理表数据,比如通过批量删除清空表:
    $(context -> {
        DynamoDbClient dynamoDbClient = context.getBean(DynamoDbClient.class);
        ScanResponse scanResponse = dynamoDbClient.scan(ScanRequest.builder().tableName("your-test-table").build());
        
        if (!scanResponse.items().isEmpty()) {
            List<WriteRequest> deleteRequests = scanResponse.items().stream()
                .map(item -> WriteRequest.builder()
                    .deleteRequest(DeleteRequest.builder().key(Map.of("id", item.get("id"))).build())
                    .build())
                .collect(Collectors.toList());
            
            dynamoDbClient.batchWriteItem(BatchWriteItemRequest.builder()
                .requestItems(Map.of("your-test-table", deleteRequests))
                .build());
        }
    });
    
  • 处理最终一致性:DynamoDB存在最终一致性特性,若写入后立即查询无结果,可添加短暂等待(使用Citrus的wait动作):
    wait().seconds(1);
    
  • 封装断言逻辑:将常用的DynamoDB结果断言封装为自定义方法,比如验证Item数量、字段值等,提升测试代码可读性

内容的提问来源于stack exchange,提问作者Florin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 14:41:22