npmでaws-sdkをインストール
Node.jsでDynamoDBにアクセスするには、npmパッケージのaws-sdkが必要です。
テストプログラム用のプロジェクト内で以下コマンドを実行すると、プロジェクト内にaws-sdkの最新バージョンがインストールされます。
この記事を書いた時に使ってたやつは、バージョンaws-sdk@2.402.0でした。
また、aws-sdkを利用するには開発環境にAWSの認証情報を設定する必要があるので、設定してない場合は設定します。方法は以下の公式マニュアルの『ステップ 1: 認証情報を設定する』を参照してください。
Node.js での使用開始 - AWS SDK for JavaScript
なお、この記事ではDynamoDBへのアクセスに AWS.DynamoDB.DocumentClient
を使います。今のところ筆者は DocumentClient
で不足を感じたことは無いのですが、AWS.DynamoDB.getItem()
などで項目を取得する場合とは、データ型のチェック方法が異なってくると思います。あらかじめご了承ください。
テーブルにテストデータを投入する方法
項目の作成には DocumentClient.put()
を使います。put()
は、すでに同じプライマリキーの項目が存在する場合は上書きすることを留意してください。
例えば before()
で行うなら、以下のようにします。
アクセスに時間がかかった時のために、一応 this.timeout()
でタイムアウト時間を延長しています。
また、DynamoDBにアクセスする DocumentClient
の各メソッドは非同期的な関数ですが、.promise()
を使うと await
で同期的に呼び出せるようになります。
テストのときは同期的に呼び出せた方が解りやすいと思うので、この記事では基本的に await
で呼ぶようにしてます。before()
に渡してる関数を async
にしてるのは、await
を使うためです。
テーブルからテストデータを消す方法 (1件)
項目の削除には DocumentClient.delete()
を使います。delete()
は、存在しない項目に対して行ってもエラーにはなりません。
例えば after()
で行うなら、以下のようにします。
テーブルからテストデータを消す方法 (まとめて)
あるパーティションキーの範囲内で全て消したい場合は、DocumentClient.query()
で取得してから delete()
で消します。ただし query()
で一度に取得できる結果セットは1MBまでなので、確実に全件消すためには、ループ処理してやる必要があります。
例えば before()
で全て消すなら、以下のようにします。
もしパーティションキーすら不明だとか、全てのデータを消したいとかなら、query()
の代わりに DocumentClient.scan()
を使ってください。
項目が存在し、想定通りの内容であることのテスト
項目の取得には DocumentClient.get()
を使います。
ただしこの方法だと、プライマリキーがあらかじめ判っている項目でないと取得できません。もしプライマリキーが判らない項目をテストしなければならない場合は、scan()
とかを使って走査するしかないと思います。
以下のサンプルでは、テスト対象のモジュールを実行した体で適当なデータを作成し、それを改めて取得して検証しています。
ここでは DocumentClient.get()
で項目を取得するときに、ConsistentRead: true
を指定しています。これを使うとDynamoDBの読み込みコストが2倍かかりますが、確実に最新のデータを検証できるように、テストプログラムでは常に指定した方が良いと私は思っています。
読み込み整合性については、詳しくは以下の公式ドキュメントを参照してください。
読み込み整合性 - Amazon DynamoDB
また、上記のサンプルでは項目の内容を expect().to.deep.equal()
でいっぺんに検証してます。ひとつずつ細かく検証する場合は、私なら以下のようにアサーションすると思います。
配列・オブジェクト・Buffer
は、.deep.equal()
を使うのが一番楽です。型までちゃんと見てくれます。
ひとつずつ値を検証する場合、漏れなく全てのキーを検証できているか、.have.all.keys()
で最後に確認するのが良いと思います。最初に確認してしまうと、具体的な値をまったく検証していないので、ほんとに「キーに過不足があった」ことしか分からないからです。
項目が存在しないことのテスト
DocumentClient.get()
で項目を取得し、戻りに Item
キーが含まれていないことを確認するだけです。
以上
以上でAmazon DynamoDB編は終わりです。今のところ筆者は、DynamoDBを使ったアプリのテストプログラムは、この記事の内容だけでそこそこ不自由なく書けています。でも、プライマリキーが分からない項目のテストは、もうちょっとどうにかならないのかなとは思います。
次回はブラウザ用JavaScript編です。