1概要
Amazonのhttps://aws.amazon.com/dynamodb/[DynamoDB]を使用するアプリケーションを開発する場合、ローカルインスタンスを使用せずに統合テストを開発するのは難しい場合があります。
このチュートリアルでは、統合テスト用にローカルDynamoDBを設定、開始、停止する複数の方法を探ります。
このチュートリアルは、既存のリンク/spring-data-dynamodb[DynamoDBの記事]も補完するものです。
2構成
2.1. Mavenのセットアップ
DynamoDB Local はAmazonによって開発されたすべてのDynamoDB APIをサポートするツールです。本番環境で実際のDynamoDBテーブルを直接操作することはありませんが、代わりにローカルで実行します。
まず、Maven設定の依存関係のリストにDynamoDB Local依存関係を追加します。
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>DynamoDBLocal</artifactId>
<version>1.11.86</version>
<scope>test</scope>
</dependency>
次に、依存関係がMaven Centralリポジトリに存在しないため、Amazon DynamoDBリポジトリも追加する必要があります。
現在のIPアドレスの位置情報に最も近いAmazonサーバーを選択できます。
<repository>
<id>dynamodb-local</id>
<name>DynamoDB Local Release Repository</name>
<url>https://s3-us-west-2.amazonaws.com/dynamodb-local/release</url>
</repository>
2.2. SQLite4Javaの依存関係を追加
DynamoDBローカルは内部的にhttps://bitbucket.org/almworks/sqlite4java[SQLite4Java]ライブラリを使用します。そのため、テストを実行するときにライブラリファイルも含める必要があります。 SQLite4Javaライブラリファイルは、テストが実行されている環境に依存しますが、DynamoDBLocal依存関係を宣言すると、Mavenはそれらを推移的に取得できます。
次に、ネイティブライブラリを特定のフォルダにコピーするための新しいビルド手順を追加する必要があります。このフォルダは後でJVMシステムプロパティで定義します。
推移的に引っ張られたSQLite4Javaライブラリファイルを native-libs というフォルダにコピーしましょう。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy</id>
<phase>test-compile</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<includeScope>test</includeScope>
<includeTypes>so,dll,dylib</includeTypes>
<outputDirectory>${project.basedir}/native-libs</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
** 2.3. SQLite4Javaシステムプロパティを設定します.
**
ここで、 sqlite4java.library.path という名前のJVMシステムプロパティを使用して、以前に作成したフォルダ(SQLite4Javaライブラリがある場所)を参照します。
System.setProperty("sqlite4java.library.path", "native-libs");
後でテストを正常に実行するには、 sqlite4java.library.path システムプロパティで定義されたフォルダにすべてのSQLite4Javaライブラリを含めることが必須です。 ** 前提条件を満たすには、Mavenのtest-compile( mvn test-compile )を少なくとも1回実行する必要があります。
** 3テストデータベースのライフサイクルを設定する__
__ **
ローカルのDynamoDBサーバーを作成して起動するためのコードを @ BeforeClass; のアノテーション付きのsetupメソッドで定義し、対称的に @ AfterClass のアノテーション付きのメソッドでサーバーを停止できます。
次の例では、ポート8000でローカルDynamoDBサーバーを起動し、テストを実行した後に再び停止したことを確認します。
public class ProductInfoDAOIntegrationTest {
private static DynamoDBProxyServer server;
@BeforeClass
public static void setupClass() throws Exception {
System.setProperty("sqlite4java.library.path", "native-libs");
String port = "8000";
server = ServerRunner.createServerFromCommandLineArgs(
new String[]{"-inMemory", "-port", port});
server.start();
//...
}
@AfterClass
public static void teardownClass() throws Exception {
server.stop();
}
//...
}
java.net.ServerSocket を使用して、固定ポートではなく使用可能な任意のポートでローカルDynamoDBサーバーを実行することもできます。この場合、エンドポイントを正しいDynamoDBポートに設定するようにテストを設定する必要があります。
public String getAvailablePort() throws IOException {
ServerSocket serverSocket = new ServerSocket(0);
return String.valueOf(serverSocket.getLocalPort());
}
4代替アプローチ: @ ClassRule を使う
前のロジックを同じアクションを実行するJUnitルールにラップすることができます。
public class LocalDbCreationRule extends ExternalResource {
private DynamoDBProxyServer server;
public LocalDbCreationRule() {
System.setProperty("sqlite4java.library.path", "native-libs");
}
@Override
protected void before() throws Exception {
String port = "8000";
server = ServerRunner.createServerFromCommandLineArgs(
new String[]{"-inMemory", "-port", port});
server.start();
}
@Override
protected void after() {
this.stopUnchecked(server);
}
protected void stopUnchecked(DynamoDBProxyServer dynamoDbServer) {
try {
dynamoDbServer.stop();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
カスタムルールを使用するには、以下のように @ ClassRule を使用してインスタンスを作成してアノテーションを付ける必要があります。繰り返しますが、テストはテストクラスの初期化の前にローカルDynamoDBサーバーを作成して起動します。
テストを実行するには、テストルールのアクセス修飾子を public にする必要があります。
public class ProductInfoRepositoryIntegrationTest {
@ClassRule
public static LocalDbCreationRule dynamoDB = new LocalDbCreationRule();
//...
}
まとめる前に、非常に簡単なメモ - DynamoDB LocalはSQLiteデータベースを内部的に使用しているため、そのパフォーマンスは本番環境での実際のパフォーマンスを反映していません。
5結論
この記事では、統合テストを実行するためにDynamoDB Localを設定および設定する方法について説明しました。
いつものように、ソースコードと設定例はhttps://github.com/eugenp/tutorials/tree/master/aws[over Github]にあります。