NoSQL is where "test locally" gets fragmented: DynamoDB Local for AWS, the Firestore emulator for GCP, the Cosmos DB emulator for Azure — three installs, three lifecycles, three ways to wire into CI. If your app touches more than one of them, that's a lot of moving parts. Vyomi runs all three behind one endpoint, and each responds to its native SDK.
DynamoDB (boto3)
import boto3
ddb = boto3.client("dynamodb", endpoint_url="http://localhost:9000",
aws_access_key_id="test", aws_secret_access_key="test",
region_name="us-east-1")
ddb.create_table(TableName="users",
KeySchema=[{"AttributeName": "id", "KeyType": "HASH"}],
AttributeDefinitions=[{"AttributeName": "id", "AttributeType": "S"}],
BillingMode="PAY_PER_REQUEST")
ddb.put_item(TableName="users", Item={"id": {"S": "u1"}, "name": {"S": "Ada"}})
Firestore (google-cloud-firestore)
from google.cloud import firestore
db = firestore.Client(project="local",
client_options={"api_endpoint": "http://localhost:9000"})
db.collection("users").document("u1").set({"name": "Ada"})
print(db.collection("users").document("u1").get().to_dict())
Cosmos DB (azure-cosmos)
from azure.cosmos import CosmosClient
client = CosmosClient("http://localhost:9000", credential="test")
db = client.create_database_if_not_exists("app")
container = db.create_container_if_not_exists(id="users", partition_key="/id")
container.upsert_item({"id": "u1", "name": "Ada"})
Why native SDKs matter
The point isn't just that it runs — it's that you write the same code you'll
ship. No vendor-neutral wrapper, no mock client. If boto3,
google-cloud-firestore and azure-cosmos work unchanged against
your local environment, you've proven the integration, not a stand-in for it. (That's the
native-SDK conformance principle Vyomi is built around.)
One environment, one CI service
Because it's one appliance, a cross-cloud test — write a user to DynamoDB, mirror it to Firestore, read it from Cosmos — runs locally and offline. See testing cloud apps offline for the CI wiring.