【问题标题】:How to force a BatchWriteItem failure如何强制 BatchWriteItem 失败
【发布时间】:2023-02-08 20:14:01
【问题描述】:

我目前正在使用 Spock/Groovy 为我的 BatchWriteItem 逻辑编写集成测试。我正在运行一个 docker 容器,它出于同样的目的启动一个真正的 DynamoDb 表。

这是我在 Java 中针对 BatchWriteItems 的逻辑

public Promise<Boolean> createItemsInBatch(ClientKey clientKey, String accountId, List<SrItems> srItems) {
        List<Item> items = srItems.stream()
                .map(srItem -> createItemFromSrItem(clientKey, createItemRef(srItem.getId(), accountId), srItem))
                .collect(Collectors.toList());
        List<List<Item>> batchItems = Lists.partition(items, 25);

        var promises = batchItems.stream().map(itemsList -> Blocking.get(() -> {
            TableWriteItems tableWriteItems = new TableWriteItems(table.getTableName());
            tableWriteItems.withItemsToPut(itemsList);
            BatchWriteItemOutcome outcome = dynamoDB.batchWriteItem(tableWriteItems);
            return outcome.getUnprocessedItems().values().stream().flatMap(Collection::stream).collect(Collectors.toList());
        })).collect(Collectors.toList());

        return ParallelPromises.yieldAll(promises).map((List<? extends ExecResult<List<WriteRequest>>> results) -> {
            if(results.isEmpty()) {
                return true;
            } else {
                results.stream().map(Result::getValue).flatMap(Collection::stream).forEach(failure -> {
                    var failedItem = failure.getPutRequest().getItem();
                    logger.error(append("item", failedItem), "Failed to batch write item");
                });
                return false;
            }
        });
    }

这是我当前的测试实现(快乐之路)

@Unroll
    def "createItemsInBatch - #description"(description, srItemsList, createResult) {
        given:
        def dynamoItemService = new DynamoItemService(realTable, amazonDynamoDBClient1) //passing the table running in the docker image + the dynamo client associated

        when:
        def promised = ExecHarness.yieldSingle {
            dynamoItemService.createItemsInBatch(CLIENT_KEY, 'account-id', srItemsList as List<SrItem>)
        }

        then:
        promised.success == createResult

        where:
        description                                        |  srItemsList          | createResult
        "single batch req not reaching batch size limit"   |  srItems(10)          | true
        "double batch req reaching batch size limit"       |  srItems(25)          | true
        "triple batch req reaching batch size limit"       |  srItems(51)          | true
    }

对于上下文:

  • srItems() 是一个函数,它只是创建一堆不同的项目,以便为 BatchWriteItem 请求注入服务

我现在想要的是能够测试不幸的道路根据我的逻辑,即从我的结果中得到一些UnprocessedItems,测试下面的代码实际上正在完成它的工作

BatchWriteItemOutcome outcome = dynamoDB.batchWriteItem(tableWriteItems);
            return outcome.getUnprocessedItems().values().stream().flatMap(Collection::stream).collect(Collectors.toList());

任何帮助将不胜感激

【问题讨论】:

    标签: amazon-web-services groovy amazon-dynamodb integration-testing spock


    【解决方案1】:

    这实际上很容易做到,我们可以强制限制您的 DynamoDB 表,这将导致 UnprocessedItems....

    将您的表配置为具有 1WCU 并禁用自动缩放。现在,以 25 个为一组运行 BatchWriteItem 几秒钟,DynamoDB 将开始限制请求,这将在UnprocessedItems 响应中返回被限制的项目,测试您的不愉快路径。

    【讨论】:

      猜你喜欢
      • 2018-03-17
      • 2013-04-06
      • 2019-02-27
      • 2011-05-09
      • 1970-01-01
      • 2017-08-24
      • 2011-12-18
      • 1970-01-01
      • 2019-11-21
      相关资源
      最近更新 更多