2017-05-06 2 views
0

Ich möchte Integrationstests für meine API-Gateway schreiben, die DynamoDB als Backend verwendet. Ich habe mich gefragt, ob es eine Methode/framework/libraries gibt, die Flexibilität bietet, um den DynamoDB-Zustand vor den Tests aufzuzeichnen und ihn nach den Tests wieder in den ursprünglichen Zustand zurückzusetzen?Record/Revert DynamoDB Zustand für Integrationstest

Idealerweise möchte ich etwas, das Änderungen in DynamoDB seit Beginn der Tests nachverfolgen kann, und alle diese Änderungen rückgängig machen, sobald der Test abgeschlossen ist.

Antwort

0

Ich verwende DynamoDB Local in meiner Testumgebung, anstatt Tests direkt mit DynamoDB auszuführen. Dies spart Kosten und Zeit. Ich benutze ein Test-Framework (RSpec), wo ich alles, was in der Datenbank gespeichert ist, löschen kann, nachdem ein Test ausgeführt wurde. http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.html

Wenn Sie Tests mit einer echten DynamoDB-Tabelle ausführen müssen, sehen Sie sich DynamoDB-Streams + AWS Lambda an. Sie können eine Lambda-Funktion schreiben, die bei Elementänderungen aus Ihrer Tabelle ausgelöst wird. Diese Funktion kann beispielsweise eine Aufzeichnung der Änderung in einer anderen Tabelle speichern. Sobald der Test abgeschlossen ist, kann eine zweite Lambda-Funktion gestartet werden, die die Änderungstabelle durchläuft und jede Änderung in der ursprünglichen Tabelle zurücksetzt. http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.Lambda.html

+0

lokalen db Hinzufügen würde mir meine APIGatway Endpunkte nicht helfen zu testen. Also diese Option ist nicht gültig für mich. Wenn ich nur die Geschäftslogik testen müsste, wäre es eine gute Option, aber nicht Ende-zu-Ende. –

+0

Dann könnte DynamoDB-Streams + AWS Lambda der beste Ansatz für Sie sein, um Änderungen an Ihrer Tabelle leicht zu verfolgen. Ich benutze diese Tech-Kombination viel für verschiedene Dinge (nicht für Tests) und es ist ziemlich einfach einzurichten. – readyornot

0

Als readyornot empfohlen, ich verwende auch DynamoDBLocal für Integrationstest. Ich setzte es wie mit folgendem Konzept: -

  1. DynamoDBLocal Abhängigkeit in dem Abhängigkeitsmanagement hinzufügen (in meinem Fall gradle: testCompile 'com.amazonaws: DynamoDBLocal: 1.11.86).
  2. DynamoDBLocal Server benötigt einige native Dateien fügen Sie sie zu den Testressourcen, finden Sie sie in den extrahierten Dateien der lib (sqlite4java-win32-x86.dll, libsqlite4java-linux-i386.so ... usw.)
  3. im @Before Aufbau der JUnit-Klasse festgelegt Java-Bibliothek Pfad mit der Lage der nativen Bibliotheken in Schritt platziert 2. SQLite.setLibraryPath("src/test/resources/location/of/native");

  4. im Setup-Verfahren beginnen auch die DynamoDB lokalen Server mit inMemory Modus, Sie müssen also keine Datensätze nach dem Test löschen.

    final String[] localArgs = { "-inMemory" }; DynamoDBProxyServer server=ServerRunner.createServerFromCommandLineArgs(localArgs); server.start(); ddb = AmazonDynamoDBClientBuilder .standard() .withEndpointConfiguration(new EndpointConfiguration("http://localhost:8000", "local")) .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("test", "password"))) .build(); table = createTable(ddb, TABLE_NAME, HASH_KEY_NAME, SORT_KEY_NAME); erstellen Tabelle wie die

private CreateTableResult createTable(AmazonDynamoDB ddb, String tableName, String hashKeyName, String sortKeyName) { List<AttributeDefinition> attributeDefinitions = new ArrayList<AttributeDefinition>(); attributeDefinitions.add(new AttributeDefinition(hashKeyName, ScalarAttributeType.S)); attributeDefinitions.add(new AttributeDefinition(sortKeyName, ScalarAttributeType.S)); List<KeySchemaElement> ks = new ArrayList<KeySchemaElement>(); ks.add(new KeySchemaElement(hashKeyName, KeyType.HASH)); ks.add(new KeySchemaElement(sortKeyName, KeyType.RANGE)); ProvisionedThroughput provisionedthroughput = new ProvisionedThroughput(1000L, 1000L); CreateTableRequest request = new CreateTableRequest() .withTableName(tableName) .withAttributeDefinitions(attributeDefinitions) .withKeySchema(ks) .withProvisionedThroughput(provisionedthroughput); return ddb.createTable(request); }

  1. Und hier ist ein Beispiel für ein Testverfahren, das die Tabelle Metadaten @Test public void createTableTest() { TableDescription tableDesc = table.getTableDescription(); assertEquals(TABLE_NAME, tableDesc.getTableName()); assertEquals("[{AttributeName: " + HASH_KEY_NAME + ",KeyType: HASH}, {AttributeName: " + SORT_KEY_NAME + ",KeyType: RANGE}]", tableDesc.getKeySchema().toString()); assertEquals("[{AttributeName: " + HASH_KEY_NAME + ",AttributeType: S}, {AttributeName: " + SORT_KEY_NAME + ",AttributeType: S}]", tableDesc.getAttributeDefinitions().toString()); assertEquals(Long.valueOf(1000L), tableDesc.getProvisionedThroughput().getReadCapacityUnits()); assertEquals(Long.valueOf(1000L), tableDesc.getProvisionedThroughput().getWriteCapacityUnits()); assertEquals("ACTIVE", tableDesc.getTableStatus()); assertEquals("arn:aws:dynamodb:ddblocal:000000000000:table/" + TABLE_NAME, tableDesc.getTableArn()); ListTablesResult tables = ddb.listTables(); assertEquals(1, tables.getTableNames().size()); }

    testet
    1. implementieren @ After-Methode, so löscht es die Tabelle und das Herunterfahren der
    2. Server

    @After public void tearDown() { ddb.deleteTable(TABLE_NAME); ddb.shutdown(); }