diff --git a/moto/dynamodb/responses.py b/moto/dynamodb/responses.py
--- a/moto/dynamodb/responses.py
+++ b/moto/dynamodb/responses.py
@@ -531,6 +531,7 @@ def batch_get_item(self):
                 "Too many items requested for the BatchGetItem call"
             )
 
+        result_size: int = 0
         for table_name, table_request in table_batches.items():
             keys = table_request["Keys"]
             if self._contains_duplicates(keys):
@@ -553,8 +554,16 @@ def batch_get_item(self):
                     table_name, key, projection_expression
                 )
                 if item:
-                    item_describe = item.describe_attrs(attributes_to_get)
-                    results["Responses"][table_name].append(item_describe["Item"])
+                    # A single operation can retrieve up to 16 MB of data [and] returns a partial result if the response size limit is exceeded
+                    if result_size + item.size() > (16 * 1024 * 1024):
+                        # Result is already getting too big - next results should be part of UnprocessedKeys
+                        if table_name not in results["UnprocessedKeys"]:
+                            results["UnprocessedKeys"][table_name] = {"Keys": []}
+                        results["UnprocessedKeys"][table_name]["Keys"].append(key)
+                    else:
+                        item_describe = item.describe_attrs(attributes_to_get)
+                        results["Responses"][table_name].append(item_describe["Item"])
+                        result_size += item.size()
 
             results["ConsumedCapacity"].append(
                 {"CapacityUnits": len(keys), "TableName": table_name}

Thanks for raising this @sirrus233 - will mark it as an enhancement to implement this validation.

If this is something you'd like to contribute yourself, PR's are always welcome!
diff --git a/tests/test_dynamodb/test_dynamodb.py b/tests/test_dynamodb/test_dynamodb.py
--- a/tests/test_dynamodb/test_dynamodb.py
+++ b/tests/test_dynamodb/test_dynamodb.py
@@ -2459,170 +2459,6 @@ def test_query_by_non_exists_index():
     )
 
 
-@mock_dynamodb
-def test_batch_items_returns_all():
-    dynamodb = _create_user_table()
-    returned_items = dynamodb.batch_get_item(
-        RequestItems={
-            "users": {
-                "Keys": [
-                    {"username": {"S": "user0"}},
-                    {"username": {"S": "user1"}},
-                    {"username": {"S": "user2"}},
-                    {"username": {"S": "user3"}},
-                ],
-                "ConsistentRead": True,
-            }
-        }
-    )["Responses"]["users"]
-    assert len(returned_items) == 3
-    assert [item["username"]["S"] for item in returned_items] == [
-        "user1",
-        "user2",
-        "user3",
-    ]
-
-
-@mock_dynamodb
-def test_batch_items_throws_exception_when_requesting_100_items_for_single_table():
-    dynamodb = _create_user_table()
-    with pytest.raises(ClientError) as ex:
-        dynamodb.batch_get_item(
-            RequestItems={
-                "users": {
-                    "Keys": [
-                        {"username": {"S": "user" + str(i)}} for i in range(0, 104)
-                    ],
-                    "ConsistentRead": True,
-                }
-            }
-        )
-    ex.value.response["Error"]["Code"].should.equal("ValidationException")
-    msg = ex.value.response["Error"]["Message"]
-    msg.should.contain("1 validation error detected: Value")
-    msg.should.contain(
-        "at 'requestItems.users.member.keys' failed to satisfy constraint: Member must have length less than or equal to 100"
-    )
-
-
-@mock_dynamodb
-def test_batch_items_throws_exception_when_requesting_100_items_across_all_tables():
-    dynamodb = _create_user_table()
-    with pytest.raises(ClientError) as ex:
-        dynamodb.batch_get_item(
-            RequestItems={
-                "users": {
-                    "Keys": [
-                        {"username": {"S": "user" + str(i)}} for i in range(0, 75)
-                    ],
-                    "ConsistentRead": True,
-                },
-                "users2": {
-                    "Keys": [
-                        {"username": {"S": "user" + str(i)}} for i in range(0, 75)
-                    ],
-                    "ConsistentRead": True,
-                },
-            }
-        )
-    ex.value.response["Error"]["Code"].should.equal("ValidationException")
-    ex.value.response["Error"]["Message"].should.equal(
-        "Too many items requested for the BatchGetItem call"
-    )
-
-
-@mock_dynamodb
-def test_batch_items_with_basic_projection_expression():
-    dynamodb = _create_user_table()
-    returned_items = dynamodb.batch_get_item(
-        RequestItems={
-            "users": {
-                "Keys": [
-                    {"username": {"S": "user0"}},
-                    {"username": {"S": "user1"}},
-                    {"username": {"S": "user2"}},
-                    {"username": {"S": "user3"}},
-                ],
-                "ConsistentRead": True,
-                "ProjectionExpression": "username",
-            }
-        }
-    )["Responses"]["users"]
-
-    returned_items.should.have.length_of(3)
-    [item["username"]["S"] for item in returned_items].should.be.equal(
-        ["user1", "user2", "user3"]
-    )
-    [item.get("foo") for item in returned_items].should.be.equal([None, None, None])
-
-    # The projection expression should not remove data from storage
-    returned_items = dynamodb.batch_get_item(
-        RequestItems={
-            "users": {
-                "Keys": [
-                    {"username": {"S": "user0"}},
-                    {"username": {"S": "user1"}},
-                    {"username": {"S": "user2"}},
-                    {"username": {"S": "user3"}},
-                ],
-                "ConsistentRead": True,
-            }
-        }
-    )["Responses"]["users"]
-
-    [item["username"]["S"] for item in returned_items].should.be.equal(
-        ["user1", "user2", "user3"]
-    )
-    [item["foo"]["S"] for item in returned_items].should.be.equal(["bar", "bar", "bar"])
-
-
-@mock_dynamodb
-def test_batch_items_with_basic_projection_expression_and_attr_expression_names():
-    dynamodb = _create_user_table()
-    returned_items = dynamodb.batch_get_item(
-        RequestItems={
-            "users": {
-                "Keys": [
-                    {"username": {"S": "user0"}},
-                    {"username": {"S": "user1"}},
-                    {"username": {"S": "user2"}},
-                    {"username": {"S": "user3"}},
-                ],
-                "ConsistentRead": True,
-                "ProjectionExpression": "#rl",
-                "ExpressionAttributeNames": {"#rl": "username"},
-            }
-        }
-    )["Responses"]["users"]
-
-    returned_items.should.have.length_of(3)
-    [item["username"]["S"] for item in returned_items].should.be.equal(
-        ["user1", "user2", "user3"]
-    )
-    [item.get("foo") for item in returned_items].should.be.equal([None, None, None])
-
-
-@mock_dynamodb
-def test_batch_items_should_throw_exception_for_duplicate_request():
-    client = _create_user_table()
-    with pytest.raises(ClientError) as ex:
-        client.batch_get_item(
-            RequestItems={
-                "users": {
-                    "Keys": [
-                        {"username": {"S": "user0"}},
-                        {"username": {"S": "user0"}},
-                    ],
-                    "ConsistentRead": True,
-                }
-            }
-        )
-    ex.value.response["Error"]["Code"].should.equal("ValidationException")
-    ex.value.response["Error"]["Message"].should.equal(
-        "Provided list of item keys contains duplicates"
-    )
-
-
 @mock_dynamodb
 def test_index_with_unknown_attributes_should_fail():
     dynamodb = boto3.client("dynamodb", region_name="us-east-1")
@@ -3443,26 +3279,6 @@ def test_update_supports_list_append_with_nested_if_not_exists_operation_and_pro
     )
 
 
-def _create_user_table():
-    client = boto3.client("dynamodb", region_name="us-east-1")
-    client.create_table(
-        TableName="users",
-        KeySchema=[{"AttributeName": "username", "KeyType": "HASH"}],
-        AttributeDefinitions=[{"AttributeName": "username", "AttributeType": "S"}],
-        ProvisionedThroughput={"ReadCapacityUnits": 5, "WriteCapacityUnits": 5},
-    )
-    client.put_item(
-        TableName="users", Item={"username": {"S": "user1"}, "foo": {"S": "bar"}}
-    )
-    client.put_item(
-        TableName="users", Item={"username": {"S": "user2"}, "foo": {"S": "bar"}}
-    )
-    client.put_item(
-        TableName="users", Item={"username": {"S": "user3"}, "foo": {"S": "bar"}}
-    )
-    return client
-
-
 @mock_dynamodb
 def test_update_item_if_original_value_is_none():
     dynamo = boto3.resource("dynamodb", region_name="eu-central-1")
diff --git a/tests/test_dynamodb/test_dynamodb_batch_get_item.py b/tests/test_dynamodb/test_dynamodb_batch_get_item.py
new file mode 100644
--- /dev/null
+++ b/tests/test_dynamodb/test_dynamodb_batch_get_item.py
@@ -0,0 +1,231 @@
+import boto3
+import sure  # noqa # pylint: disable=unused-import
+import pytest
+
+from moto import mock_dynamodb
+from botocore.exceptions import ClientError
+
+
+def _create_user_table():
+    client = boto3.client("dynamodb", region_name="us-east-1")
+    client.create_table(
+        TableName="users",
+        KeySchema=[{"AttributeName": "username", "KeyType": "HASH"}],
+        AttributeDefinitions=[{"AttributeName": "username", "AttributeType": "S"}],
+        ProvisionedThroughput={"ReadCapacityUnits": 5, "WriteCapacityUnits": 5},
+    )
+    client.put_item(
+        TableName="users", Item={"username": {"S": "user1"}, "foo": {"S": "bar"}}
+    )
+    client.put_item(
+        TableName="users", Item={"username": {"S": "user2"}, "foo": {"S": "bar"}}
+    )
+    client.put_item(
+        TableName="users", Item={"username": {"S": "user3"}, "foo": {"S": "bar"}}
+    )
+    return client
+
+
+@mock_dynamodb
+def test_batch_items_returns_all():
+    dynamodb = _create_user_table()
+    returned_items = dynamodb.batch_get_item(
+        RequestItems={
+            "users": {
+                "Keys": [
+                    {"username": {"S": "user0"}},
+                    {"username": {"S": "user1"}},
+                    {"username": {"S": "user2"}},
+                    {"username": {"S": "user3"}},
+                ],
+                "ConsistentRead": True,
+            }
+        }
+    )["Responses"]["users"]
+    assert len(returned_items) == 3
+    assert [item["username"]["S"] for item in returned_items] == [
+        "user1",
+        "user2",
+        "user3",
+    ]
+
+
+@mock_dynamodb
+def test_batch_items_throws_exception_when_requesting_100_items_for_single_table():
+    dynamodb = _create_user_table()
+    with pytest.raises(ClientError) as ex:
+        dynamodb.batch_get_item(
+            RequestItems={
+                "users": {
+                    "Keys": [
+                        {"username": {"S": "user" + str(i)}} for i in range(0, 104)
+                    ],
+                    "ConsistentRead": True,
+                }
+            }
+        )
+    ex.value.response["Error"]["Code"].should.equal("ValidationException")
+    msg = ex.value.response["Error"]["Message"]
+    msg.should.contain("1 validation error detected: Value")
+    msg.should.contain(
+        "at 'requestItems.users.member.keys' failed to satisfy constraint: Member must have length less than or equal to 100"
+    )
+
+
+@mock_dynamodb
+def test_batch_items_throws_exception_when_requesting_100_items_across_all_tables():
+    dynamodb = _create_user_table()
+    with pytest.raises(ClientError) as ex:
+        dynamodb.batch_get_item(
+            RequestItems={
+                "users": {
+                    "Keys": [
+                        {"username": {"S": "user" + str(i)}} for i in range(0, 75)
+                    ],
+                    "ConsistentRead": True,
+                },
+                "users2": {
+                    "Keys": [
+                        {"username": {"S": "user" + str(i)}} for i in range(0, 75)
+                    ],
+                    "ConsistentRead": True,
+                },
+            }
+        )
+    ex.value.response["Error"]["Code"].should.equal("ValidationException")
+    ex.value.response["Error"]["Message"].should.equal(
+        "Too many items requested for the BatchGetItem call"
+    )
+
+
+@mock_dynamodb
+def test_batch_items_with_basic_projection_expression():
+    dynamodb = _create_user_table()
+    returned_items = dynamodb.batch_get_item(
+        RequestItems={
+            "users": {
+                "Keys": [
+                    {"username": {"S": "user0"}},
+                    {"username": {"S": "user1"}},
+                    {"username": {"S": "user2"}},
+                    {"username": {"S": "user3"}},
+                ],
+                "ConsistentRead": True,
+                "ProjectionExpression": "username",
+            }
+        }
+    )["Responses"]["users"]
+
+    returned_items.should.have.length_of(3)
+    [item["username"]["S"] for item in returned_items].should.be.equal(
+        ["user1", "user2", "user3"]
+    )
+    [item.get("foo") for item in returned_items].should.be.equal([None, None, None])
+
+    # The projection expression should not remove data from storage
+    returned_items = dynamodb.batch_get_item(
+        RequestItems={
+            "users": {
+                "Keys": [
+                    {"username": {"S": "user0"}},
+                    {"username": {"S": "user1"}},
+                    {"username": {"S": "user2"}},
+                    {"username": {"S": "user3"}},
+                ],
+                "ConsistentRead": True,
+            }
+        }
+    )["Responses"]["users"]
+
+    [item["username"]["S"] for item in returned_items].should.be.equal(
+        ["user1", "user2", "user3"]
+    )
+    [item["foo"]["S"] for item in returned_items].should.be.equal(["bar", "bar", "bar"])
+
+
+@mock_dynamodb
+def test_batch_items_with_basic_projection_expression_and_attr_expression_names():
+    dynamodb = _create_user_table()
+    returned_items = dynamodb.batch_get_item(
+        RequestItems={
+            "users": {
+                "Keys": [
+                    {"username": {"S": "user0"}},
+                    {"username": {"S": "user1"}},
+                    {"username": {"S": "user2"}},
+                    {"username": {"S": "user3"}},
+                ],
+                "ConsistentRead": True,
+                "ProjectionExpression": "#rl",
+                "ExpressionAttributeNames": {"#rl": "username"},
+            }
+        }
+    )["Responses"]["users"]
+
+    returned_items.should.have.length_of(3)
+    [item["username"]["S"] for item in returned_items].should.be.equal(
+        ["user1", "user2", "user3"]
+    )
+    [item.get("foo") for item in returned_items].should.be.equal([None, None, None])
+
+
+@mock_dynamodb
+def test_batch_items_should_throw_exception_for_duplicate_request():
+    client = _create_user_table()
+    with pytest.raises(ClientError) as ex:
+        client.batch_get_item(
+            RequestItems={
+                "users": {
+                    "Keys": [
+                        {"username": {"S": "user0"}},
+                        {"username": {"S": "user0"}},
+                    ],
+                    "ConsistentRead": True,
+                }
+            }
+        )
+    ex.value.response["Error"]["Code"].should.equal("ValidationException")
+    ex.value.response["Error"]["Message"].should.equal(
+        "Provided list of item keys contains duplicates"
+    )
+
+
+@mock_dynamodb
+def test_batch_items_should_return_16mb_max():
+    """
+    A single operation can retrieve up to 16 MB of data [...]. BatchGetItem returns a partial result if the response size limit is exceeded [..].
+
+    For example, if you ask to retrieve 100 items, but each individual item is 300 KB in size,
+    the system returns 52 items (so as not to exceed the 16 MB limit).
+
+    It also returns an appropriate UnprocessedKeys value so you can get the next page of results.
+    If desired, your application can include its own logic to assemble the pages of results into one dataset.
+    """
+    client = _create_user_table()
+    # Fill table with all the data
+    for i in range(100):
+        client.put_item(
+            TableName="users",
+            Item={"username": {"S": f"largedata{i}"}, "foo": {"S": "x" * 300000}},
+        )
+
+    resp = client.batch_get_item(
+        RequestItems={
+            "users": {
+                "Keys": [{"username": {"S": f"largedata{i}"}} for i in range(75)],
+                "ConsistentRead": True,
+            }
+        }
+    )
+
+    resp["Responses"]["users"].should.have.length_of(55)
+    unprocessed_keys = resp["UnprocessedKeys"]["users"]["Keys"]
+    # 75 requested, 55 returned --> 20 unprocessed
+    unprocessed_keys.should.have.length_of(20)
+
+    # Keys 55-75 are unprocessed
+    unprocessed_keys.should.contain({"username": {"S": "largedata55"}})
+    unprocessed_keys.should.contain({"username": {"S": "largedata65"}})
+
+    # Keys 0-55 are processed in the regular response, so they shouldn't show up here
+    unprocessed_keys.shouldnt.contain({"username": {"S": "largedata45"}})

DynamoDB BatchGetItem should return UnprocessedKeys when response exceeds 16MB
**What I expect to happen:**
A BatchGetItem call to a moto dynamodb instance which would return > 16 MB of data should only return a partial result, with any unprocessed keys being returned under a separate key in the response.

**What is happening:**
BatchGetItem returns all results, regardless of the size of the response.

Documentation: https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchGetItem.html

Specifically:
> A single operation can retrieve up to 16 MB of data, which can contain as many as 100 items. BatchGetItem returns a partial result if the response size limit is exceeded, the table's provisioned throughput is exceeded, or an internal processing failure occurs. If a partial result is returned, the operation returns a value for UnprocessedKeys. You can use this value to retry the operation starting with the next item to get.

Today it seems that although moto does provide an `UnprocessedKeys` key in the response, the value is hard-coded to an empty list. 

moto version: 3.1.6


tests/test_dynamodb/test_dynamodb_batch_get_item.py::test_batch_items_should_return_16mb_max
tests/test_dynamodb/test_dynamodb.py::test_remove_list_index__remove_existing_nested_index tests/test_dynamodb/test_dynamodb.py::test_basic_projection_expressions_using_query_with_attr_expression_names tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_put_conditional_expressions_return_values_on_condition_check_failure_all_old tests/test_dynamodb/test_dynamodb.py::test_describe_backup_for_non_existent_backup_raises_error tests/test_dynamodb/test_dynamodb.py::test_update_item_with_list tests/test_dynamodb/test_dynamodb.py::test_describe_continuous_backups_errors tests/test_dynamodb/test_dynamodb.py::test_describe_missing_table_boto3 tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_delete tests/test_dynamodb/test_dynamodb.py::test_remove_list_index__remove_existing_index tests/test_dynamodb/test_dynamodb.py::test_dynamodb_update_item_fails_on_string_sets tests/test_dynamodb/test_dynamodb.py::test_projection_expression_execution_order tests/test_dynamodb/test_dynamodb.py::test_update_item_with_attribute_in_right_hand_side_and_operation tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_conditioncheck_passes tests/test_dynamodb/test_dynamodb.py::test_basic_projection_expression_using_get_item tests/test_dynamodb/test_dynamodb.py::test_list_table_tags_empty tests/test_dynamodb/test_dynamodb.py::test_create_backup_for_non_existent_table_raises_error tests/test_dynamodb/test_dynamodb.py::test_update_expression_with_plus_in_attribute_name tests/test_dynamodb/test_dynamodb.py::test_scan_filter2 tests/test_dynamodb/test_dynamodb.py::test_describe_backup tests/test_dynamodb/test_dynamodb.py::test_batch_write_item tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_delete_with_successful_condition_expression tests/test_dynamodb/test_dynamodb.py::test_query_invalid_table tests/test_dynamodb/test_dynamodb.py::test_delete_backup tests/test_dynamodb/test_dynamodb.py::test_nested_projection_expression_using_query tests/test_dynamodb/test_dynamodb.py::test_transact_get_items_should_return_empty_map_for_non_existent_item tests/test_dynamodb/test_dynamodb.py::test_update_supports_list_append_maps tests/test_dynamodb/test_dynamodb.py::test_update_supports_nested_update_if_nested_value_not_exists tests/test_dynamodb/test_dynamodb.py::test_index_with_unknown_attributes_should_fail tests/test_dynamodb/test_dynamodb.py::test_update_supports_nested_list_append tests/test_dynamodb/test_dynamodb.py::test_update_item_atomic_counter_from_zero tests/test_dynamodb/test_dynamodb.py::test_update_item_if_original_value_is_none tests/test_dynamodb/test_dynamodb.py::test_filter_expression_execution_order tests/test_dynamodb/test_dynamodb.py::test_delete_item tests/test_dynamodb/test_dynamodb.py::test_list_tables_paginated tests/test_dynamodb/test_dynamodb.py::test_query_gsi_with_range_key tests/test_dynamodb/test_dynamodb.py::test_valid_transact_get_items tests/test_dynamodb/test_dynamodb.py::test_describe_continuous_backups tests/test_dynamodb/test_dynamodb_batch_get_item.py::test_batch_items_throws_exception_when_requesting_100_items_for_single_table tests/test_dynamodb/test_dynamodb.py::test_remove_list_index__remove_existing_double_nested_index tests/test_dynamodb/test_dynamodb.py::test_non_existing_attribute_should_raise_exception tests/test_dynamodb/test_dynamodb.py::test_scan_by_non_exists_index tests/test_dynamodb/test_dynamodb.py::test_update_supports_list_append_with_nested_if_not_exists_operation tests/test_dynamodb/test_dynamodb.py::test_put_empty_item tests/test_dynamodb/test_dynamodb.py::test_gsi_lastevaluatedkey tests/test_dynamodb/test_dynamodb_batch_get_item.py::test_batch_items_returns_all tests/test_dynamodb/test_dynamodb.py::test_query_catches_when_no_filters tests/test_dynamodb/test_dynamodb.py::test_restore_table_to_point_in_time_raises_error_when_dest_exist tests/test_dynamodb/test_dynamodb.py::test_update_supports_complex_expression_attribute_values tests/test_dynamodb/test_dynamodb.py::test_update_expression_with_numeric_literal_instead_of_value tests/test_dynamodb/test_dynamodb.py::test_list_tables_boto3[multiple-tables] tests/test_dynamodb/test_dynamodb.py::test_update_list_index__set_nested_index_out_of_range tests/test_dynamodb/test_dynamodb.py::test_update_nested_item_if_original_value_is_none tests/test_dynamodb/test_dynamodb.py::test_update_supports_multiple_levels_nested_list_append tests/test_dynamodb/test_dynamodb.py::test_list_tables_boto3[one-table] tests/test_dynamodb/test_dynamodb_batch_get_item.py::test_batch_items_with_basic_projection_expression_and_attr_expression_names tests/test_dynamodb/test_dynamodb.py::test_put_item_nonexisting_range_key tests/test_dynamodb/test_dynamodb.py::test_list_backups tests/test_dynamodb/test_dynamodb.py::test_query_filter_overlapping_expression_prefixes tests/test_dynamodb/test_dynamodb.py::test_source_and_restored_table_items_are_not_linked tests/test_dynamodb/test_dynamodb.py::test_bad_scan_filter tests/test_dynamodb/test_dynamodb_batch_get_item.py::test_batch_items_with_basic_projection_expression tests/test_dynamodb/test_dynamodb.py::test_update_expression_with_minus_in_attribute_name tests/test_dynamodb/test_dynamodb_batch_get_item.py::test_batch_items_throws_exception_when_requesting_100_items_across_all_tables tests/test_dynamodb/test_dynamodb.py::test_restore_table_from_backup_raises_error_when_table_already_exists tests/test_dynamodb/test_dynamodb.py::test_put_item_nonexisting_hash_key tests/test_dynamodb/test_dynamodb.py::test_restore_table_to_point_in_time_raises_error_when_source_not_exist tests/test_dynamodb/test_dynamodb.py::test_basic_projection_expression_using_get_item_with_attr_expression_names tests/test_dynamodb/test_dynamodb.py::test_invalid_transact_get_items tests/test_dynamodb/test_dynamodb.py::test_update_continuous_backups tests/test_dynamodb/test_dynamodb.py::test_update_item_atomic_counter tests/test_dynamodb/test_dynamodb.py::test_nested_projection_expression_using_query_with_attr_expression_names tests/test_dynamodb/test_dynamodb.py::test_item_add_empty_string_range_key_exception tests/test_dynamodb/test_dynamodb.py::test_get_item_for_non_existent_table_raises_error tests/test_dynamodb/test_dynamodb.py::test_scan_filter tests/test_dynamodb/test_dynamodb.py::test_error_when_providing_expression_and_nonexpression_params tests/test_dynamodb/test_dynamodb.py::test_update_return_attributes tests/test_dynamodb/test_dynamodb.py::test_item_size_is_under_400KB tests/test_dynamodb/test_dynamodb.py::test_multiple_updates tests/test_dynamodb/test_dynamodb.py::test_scan_filter4 tests/test_dynamodb/test_dynamodb.py::test_nested_projection_expression_using_get_item_with_attr_expression tests/test_dynamodb/test_dynamodb.py::test_update_expression_with_space_in_attribute_name tests/test_dynamodb/test_dynamodb.py::test_create_multiple_backups_with_same_name tests/test_dynamodb/test_dynamodb.py::test_gsi_projection_type_keys_only tests/test_dynamodb/test_dynamodb.py::test_update_list_index__set_existing_nested_index tests/test_dynamodb/test_dynamodb.py::test_set_attribute_is_dropped_if_empty_after_update_expression[use tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_put_conditional_expressions tests/test_dynamodb/test_dynamodb.py::test_restore_table_from_non_existent_backup_raises_error tests/test_dynamodb/test_dynamodb.py::test_query_by_non_exists_index tests/test_dynamodb/test_dynamodb.py::test_gsi_key_cannot_be_empty tests/test_dynamodb/test_dynamodb.py::test_remove_list_index__remove_index_out_of_range tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_fails_with_transaction_canceled_exception tests/test_dynamodb/test_dynamodb.py::test_update_if_not_exists tests/test_dynamodb/test_dynamodb.py::test_remove_top_level_attribute tests/test_dynamodb/test_dynamodb.py::test_restore_table_from_backup tests/test_dynamodb/test_dynamodb.py::test_nested_projection_expression_using_scan_with_attr_expression_names tests/test_dynamodb/test_dynamodb.py::test_update_non_existing_item_raises_error_and_does_not_contain_item_afterwards tests/test_dynamodb/test_dynamodb_batch_get_item.py::test_batch_items_should_throw_exception_for_duplicate_request tests/test_dynamodb/test_dynamodb.py::test_allow_update_to_item_with_different_type tests/test_dynamodb/test_dynamodb.py::test_describe_limits tests/test_dynamodb/test_dynamodb.py::test_sorted_query_with_numerical_sort_key tests/test_dynamodb/test_dynamodb.py::test_dynamodb_max_1mb_limit tests/test_dynamodb/test_dynamodb.py::test_update_continuous_backups_errors tests/test_dynamodb/test_dynamodb.py::test_list_backups_for_non_existent_table tests/test_dynamodb/test_dynamodb.py::test_duplicate_create tests/test_dynamodb/test_dynamodb.py::test_summing_up_2_strings_raises_exception tests/test_dynamodb/test_dynamodb.py::test_update_item_atomic_counter_return_values tests/test_dynamodb/test_dynamodb.py::test_put_item_with_special_chars tests/test_dynamodb/test_dynamodb.py::test_query_missing_expr_names tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_update_with_failed_condition_expression tests/test_dynamodb/test_dynamodb.py::test_describe_endpoints[eu-central-1] tests/test_dynamodb/test_dynamodb.py::test_create_backup tests/test_dynamodb/test_dynamodb.py::test_query_filter tests/test_dynamodb/test_dynamodb.py::test_list_tables_boto3[no-table] tests/test_dynamodb/test_dynamodb.py::test_attribute_item_delete tests/test_dynamodb/test_dynamodb.py::test_invalid_projection_expressions tests/test_dynamodb/test_dynamodb.py::test_update_list_index__set_existing_index tests/test_dynamodb/test_dynamodb.py::test_nested_projection_expression_using_get_item tests/test_dynamodb/test_dynamodb.py::test_nested_projection_expression_using_scan tests/test_dynamodb/test_dynamodb.py::test_update_item_on_map tests/test_dynamodb/test_dynamodb.py::test_restore_table_to_point_in_time tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_put tests/test_dynamodb/test_dynamodb.py::test_basic_projection_expressions_using_query tests/test_dynamodb/test_dynamodb.py::test_list_not_found_table_tags tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_update tests/test_dynamodb/test_dynamodb.py::test_update_return_updated_new_attributes_when_same tests/test_dynamodb/test_dynamodb.py::test_gsi_verify_negative_number_order tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_conditioncheck_fails tests/test_dynamodb/test_dynamodb.py::test_set_ttl tests/test_dynamodb/test_dynamodb.py::test_scan_filter_should_not_return_non_existing_attributes tests/test_dynamodb/test_dynamodb.py::test_update_supports_list_append tests/test_dynamodb/test_dynamodb.py::test_put_return_attributes tests/test_dynamodb/test_dynamodb.py::test_lsi_projection_type_keys_only tests/test_dynamodb/test_dynamodb.py::test_update_list_index__set_double_nested_index tests/test_dynamodb/test_dynamodb.py::test_gsi_key_can_be_updated tests/test_dynamodb/test_dynamodb.py::test_put_item_with_streams tests/test_dynamodb/test_dynamodb.py::test_list_tables_exclusive_start_table_name_empty tests/test_dynamodb/test_dynamodb.py::test_update_item_with_no_action_passed_with_list tests/test_dynamodb/test_dynamodb.py::test_update_item_with_empty_string_attr_no_exception tests/test_dynamodb/test_dynamodb.py::test_transact_write_items_delete_with_failed_condition_expression tests/test_dynamodb/test_dynamodb.py::test_basic_projection_expressions_using_scan tests/test_dynamodb/test_dynamodb.py::test_list_table_tags tests/test_dynamodb/test_dynamodb.py::test_update_supports_nested_list_append_onto_another_list tests/test_dynamodb/test_dynamodb.py::test_update_list_index__set_index_out_of_range tests/test_dynamodb/test_dynamodb.py::test_filter_expression tests/test_dynamodb/test_dynamodb.py::test_basic_projection_expressions_using_scan_with_attr_expression_names tests/test_dynamodb/test_dynamodb.py::test_item_add_empty_string_hash_key_exception tests/test_dynamodb/test_dynamodb.py::test_item_add_empty_string_attr_no_exception tests/test_dynamodb/test_dynamodb.py::test_update_item_add_to_non_existent_set tests/test_dynamodb/test_dynamodb.py::test_gsi_projection_type_include tests/test_dynamodb/test_dynamodb.py::test_query_global_secondary_index_when_created_via_update_table_resource tests/test_dynamodb/test_dynamodb.py::test_update_item_add_to_non_existent_number_set tests/test_dynamodb/test_dynamodb.py::test_update_expression_with_multiple_set_clauses_must_be_comma_separated tests/test_dynamodb/test_dynamodb.py::test_scan_filter3 tests/test_dynamodb/test_dynamodb.py::test_update_list_index__set_index_of_a_string tests/test_dynamodb/test_dynamodb.py::test_update_supports_list_append_with_nested_if_not_exists_operation_and_property_already_exists tests/test_dynamodb/test_dynamodb.py::test_describe_endpoints[ap-south-1] tests/test_dynamodb/test_dynamodb.py::test_delete_table tests/test_dynamodb/test_dynamodb.py::test_update_item_add_to_list_using_legacy_attribute_updates tests/test_dynamodb/test_dynamodb.py::test_remove_top_level_attribute_non_existent tests/test_dynamodb/test_dynamodb.py::test_delete_non_existent_backup_raises_error tests/test_dynamodb/test_dynamodb.py::test_update_item_with_attribute_in_right_hand_side tests/test_dynamodb/test_dynamodb.py::test_list_table_tags_paginated