アプリ内課金(IAP)のテストケースを設計・実行する方法
Amazonでは、アプリを申請する前にユニットテストを実行できるように、App Testerというツールを提供しています。効果的なテストを行うために、一連のテストケースを作成して、アプリの使用中にユーザーが直面するさまざまなシナリオを幅広くカバーすることをお勧めします。
アプリとAmazonアプリストアとのやり取りはAPIライブラリに切り離されているため、対話先がアプリストアではなくApp Testerになっても、その違いがアプリに認識されることはありません。App Testerから返されるレスポンスは開発者が制御します。これにより、あらゆるレスポンス状態についてアプリの動作をテストできます。
このページでは、アプリ内課金(IAP)の実装に関する大部分のユーザーシナリオをカバーする一連のテストケースを紹介し、App Testerを使用してそれらのテストケースを実行する方法について説明します。詳細については、以下の各セクションを参照してください。
テストケースの概要
アプリのIAP実装をテストするときは、できるだけ多くのコードパスをカバーするようにテストケースを計画してください。次のトランザクションタイプの一覧は、アプリのユーザーが経験する可能性のあるさまざまなシナリオをカバーしています。
- ユーザーデータの取得(成功/失敗)
- 商品データの取得(成功/失敗)
- 購入リクエスト(成功/失敗/購入済み/無効なSKU)
- 購入の更新リクエスト(成功/失敗)
- アイテム付与完了の通知(成功/利用不可能)
- 定期購入型アイテムの確認(有効/期限切れ)
- レシートの検証(RVS)
ユーザーデータの取得
AmazonアプリストアとApp Testerツールは、どちらもユーザーIDによってトランザクションをトラッキングします。アプリは複数のユーザーを同時に処理できなければならないので、ユーザーが区別される機能では、適切なタイミング(AndroidライフサイクルメソッドのonResume()
など)で、現在ログインしているユーザーIDを確認する必要があります。ユーザーデータを取得すると、SUCCESSFULまたはFAILEDのレスポンスが返されます。
ユーザーデータの取得について、それぞれのレスポンスをテストするには、次の手順に従います。
- App Testerの [User Account Settings] タブで、ユーザーIDが設定されていることを確認します。
- GetUserData APIの設定を行います。
- SUCCESSFULレスポンスに対するテストを行うには、[DEFAULT] または [SUCCESSFUL] に設定します。
- FAILEDレスポンスに対するテストを行うには、[FAILED] に設定します。
getUserData
を呼び出します。onGetUserDataResponse
を使用してレスポンスを処理します。
商品データの取得
App Testerで商品データの取得のテストを実行する場合、DEFAULTモードでは、JSONファイルから商品データが返されます。商品データを取得すると、SUCCESSFULまたはFAILEDのレスポンスが返されます。
商品データの取得をテストするには、次の手順に従います。
- App Tester用のJSONファイルに、テストするSKUと商品定義が格納されていることを確認します。
- GetProductData APIの設定を行います。
- SUCCESSFULレスポンスに対するテストを行うには、[DEFAULT] または [SUCCESSFUL] に設定します。
- FAILEDレスポンスに対するテストを行うには、[FAILED] に設定します。
getProductData
を呼び出します。onGetProductDataResponse
を使用してレスポンスを処理します。
購入
実装とテストを簡略化するために、Purchase APIは、3つのどのタイプのIAPアイテムでも同じように機能します。
- 定期購入型アイテム: 1人のユーザーにつき1回限りの購入
- 非消費型アイテム: 1人のユーザーにつき1回限りの購入
- 消費型アイテム: 同じユーザーによる複数回の購入が可能
Purchase APIをテストするには、次の手順に従います。
- App Tester用のJSONファイルに、テストするSKUと商品定義が格納されていることを確認します。
- Purchase APIの設定を行います。次の4つの状態をそれぞれテストします。
- SUCCESSFULレスポンスに対するテストを行うには、[DEFAULT] または [SUCCESSFUL] に設定します。
- FAILEDレスポンスに対するテストを行うには、[FAILED] に設定します。
- ALREADY_PURCHASEDリクエストに対するテストを行うには、[ALREADY_PURCHASED] に設定します。
- INVALID_SKUに対するテストを行うには、[INVALID_SKU] に設定します。
purchase
を呼び出します。onPurchaseResponse
を使用してレスポンスを処理します。
購入が成功したコンテンツは、App Testerの [Manage Transactions] タブに表示されます。
「購入済み」状態は、一般的な購入ワークフローを実行することでもテストできます。
- App Tester用のJSONファイルに、テストするSKUと商品定義が格納されていることを確認します。
- Purchase APIの設定を [DEFAULT] にします。
- 定期購入型アイテムまたは非消費型アイテムのSKUの購入を成功させます(消費型アイテムは複数回購入できるため、このテストには適しません)。
- 同じSKUを使用して、
purchase
を再度呼び出します。 onPurchaseResponse
を使用してレスポンスを処理します。
購入が成功したコンテンツは、App Testerの [Manage Transactions] タブに表示されます。
購入の更新リクエスト
ユーザーが正しいコンテンツに確実にアクセスできるように、アプリでは、ユーザーとの対話を開始するときに、(AndroidライフサイクルのonResume()
メソッドで)購入の更新リクエストAPIを呼び出します。SUCCESSFULレスポンスには、以前のトランザクションのレシートが含まれています。このレシートの数は、App Testerの [Manage Transactions] タブの内容に応じて、0個の場合もあれば、複数の場合もあります。
レシート検証サービス(RVS)を使用すると、レシート内のトークンを検証できます。
購入の更新リクエストをテストするには、次の手順に従います。
- App Tester用のJSONファイルに、テストするSKUと商品定義が格納されていることを確認します。
-
構成したSKUの購入を成功させます。
- GetPurchaseUpdates APIの設定を行います。
- SUCCESSFULレスポンスに対するテストを行うには、[DEFAULT] または [SUCCESSFUL] に設定します。
- FAILEDレスポンスに対するテストを行うには、[FAILED] に設定します。
getPurchaseUpdates
を呼び出します。onPurchaseUpdatesResponse
を使用してレスポンスを処理します。
空のSUCCESSFULレスポンスを生成する場合は、次の手順を実行します。
- App Tester用のJSONファイルに、テストするSKUと商品定義が格納されていることを確認します。
- 構成したSKUの購入を成功させます。
- getPurchaseUpdates APIの設定を [DEFAULT] にします。
- [Manage Transactions] タブで、すべてのトランザクションを削除します。
getPurchaseUpdates
を呼び出します。onPurchaseUpdatesResponse
を使用してレスポンスを処理します。
アイテム付与完了の通知
アイテム付与完了の通知APIを呼び出して、アイテム付与を検証し、IAPで定義されているレシート状態をテストします。次のワークフローを使用すると、消費型アイテムと非消費型アイテムの付与をテストできます。
アイテム付与完了の通知をテストするには、次の手順に従います。
- 消費型アイテムに対して
purchase
を呼び出します。 - 購入されたアイテムのレシートに注目します。
getPurchaseUpdate
を呼び出します。- 返された消費型アイテムのレシートに注目します。
- App Testerの [Manage Transactions] タブで、消費型アイテムが配信済みに設定されていることを確認します。
notifyFullfilment
を呼び出します。- 「アイテム付与完了」の状態をテストするには、
notifyFulfillment
を [SUCCESSFUL] に設定します。 - 「利用不可能」の状態をテストするには、
notifyFulfillment
を [UNAVAILABLE] に設定します。
- 「アイテム付与完了」の状態をテストするには、
- App Testerの [Manage Transactions] タブで、購入情報を確認します。
- 「購入完了」状態をテストしている場合、消費型アイテムは [Fulfilled] と表示されます。
- 「利用不可能」状態をテストしている場合、消費型アイテムは [Unavailable] と表示されます。
定期購入型アイテムの確認
App Testerを使用して、有効な定期購入型アイテムと期限切れの定期購入型アイテムの両方を検証できます。[Manage Transactions] タブからアクティブな定期購入型アイテムのトランザクションをキャンセルすると、App Testerは、そのトランザクションを期限切れの定期購入型アイテムとして扱います。
有効な定期購入型アイテムを想定したテストを行うには、次の手順に従います。
- 定期購入型アイテムのSKUを正常に購入します。
- [Manage Transactions] タブに移動して、トランザクションが表示されていることを確認します。
getPurchaseUpdates
を呼び出します。onPurchaseUpdatesResponse
を使用してレスポンスを処理します。- 返されたレシートから、購入したSKUの最新のレシート(開始日付で判断)を検証します。
- 終了日の値がnullであることを確認します。
期限切れの定期購入型アイテムを想定したテストを行うには、次の手順に従います。
- 定期購入型アイテムのSKUを正常に購入します。
- [Manage Transactions] タブに移動して、トランザクションが表示されていることを確認します。
-
[Manage Transactions] タブで、トランザクションをキャンセルします。
getPurchaseUpdates
を呼び出します。onPurchaseUpdatesResponse
を使用してレスポンスを処理します。- 返されたレシートから、購入したSKUの最新のレシート(開始日付で判断)を検証します。
- 終了日の値がnullでないことを確認します。
レシートの検証
Amazonが提供しているレシート検証サービス(RVS)を使用すると、バックエンドサーバーから購入を検証できます。このサービスの詳細については、レシート検証サービスの概要を参照してください。
IAPレスポンスの対応関係表
IAP APIの各レスポンスと、App Testerのプロパティやその他のテスト条件との対応関係を次の表に示します。
IAP APIレスポンス | 非同期呼び出し | AppTesterのプロパティセット | JSONの使用 | 備考 |
---|---|---|---|---|
PurchaseRequestStatus.SUCCESSFUL | purchase | Purchase API、DEFAULTまたはSUCCESSFUL | あり | JSONファイル内の有効なSKUに対する購入であれば、SUCCESSFULレスポンスが返されます。 |
PurchaseRequestStatus.FAILED | purchase | Purchase API、FAILED | あり(アイテム情報を表示するため) | App Testerの設定ページでこのプロパティが [FAILED] に設定されている場合、または購入確認画面が閉じられた場合、強制的にFAILEDレスポンスが返されます。 |
PurchaseRequestStatus.INVALID_SKU | purchase | Purchase API、INVALID_SKU | なし | App Testerの設定ページでこのプロパティが設定されている場合、購入リクエストに対して強制的にINVALID_SKUが返されます。 |
PurchaseRequestStatus.ALREADY_PURCHASED | purchase | Purchase API、ALREADY_PURCHASED | あり | App Testerの [API Response Settings] タブでこのプロパティが [ALREADY_PURCHASED] に設定されている場合、またはSKUが以前に購入されていた場合、購入リクエストに対して強制的にALREADY_PURCHASEDが返されます。 |
GetProductDataStatus.SUCCESSFUL | getProductData | GetProductData API、DEFAULTまたはSUCCESSFUL | あり | JSONファイル内の有効なSKUに対するリクエストであれば、SUCCESSFULレスポンスが返されます。 |
GetProductDataStatus.FAILED | getProductData | GetProductData API、FAILED | なし | App Testerでこのプロパティが設定されている場合、商品データリクエストに対して強制的にFAILEDが返されます。 |
GetUserDataStatus.SUCCESS | getUserData | GetUserData API、DEFAULTまたはSUCCESSFUL | なし | App Testerの [API Response Settings] タブでこのプロパティが設定されている場合、App Testerに保存されているユーザーIDが返されます。 |
GetUserIdRequestStatus.FAILED | getUserData | GetUserData API、FAILED | なし | App Testerの [API Response Settings] タブでこのプロパティが設定されている場合、強制的にFAILEDレスポンスが返されます。 |
PurchaseUpdatesResponseStatus.SUCCESS | getPurchaseUpdates | GetPurchaseUpdates API、SUCCESSFUL | なし | App Testerの [API Response Settings] タブでこのプロパティが設定されている場合、トランザクションログの内容が返されます。 |
PurchaseUpdatesResponseStatus.FAILED | getPurchaseUpdates | GetPurchaseUpdates API、FAILED | なし | App Testerの [API Response Settings] タブでこのプロパティが設定されている場合、強制的にFAILEDレスポンスが返されます。 |
Last updated: 2024年5月22日