---
title: "Android サブスクリプションテストの完全ガイド"
description: "Androidアプリ内サブスクリプションを正確にテストする方法"
language: "jp"
publishedAt: "2025-08-28T15:01:35Z"
updatedAt: "2025-08-28T15:01:35Z"
authors:
  - name: "Toni Rico"
    url: "https://www.revenuecat.com/jp/blog/author/toni-rico"
category: "[ エンジニアリング ]"
categoryUrl: "https://www.revenuecat.com/jp/blog/engineering"
readingTime: 2
canonical: "https://www.revenuecat.com/jp/blog/engineering/the-ultimate-guide-to-android-subscription-testing"
---

# Android サブスクリプションテストの完全ガイド

Androidアプリ内サブスクリプションを正確にテストする方法

## Table of contents

- [Androidサブスクリプションの基本](#android)
- [テスト用ユーティリティ](#section)
  - [ライセンス付きテスト](#section-2)
  - [テストトラック](#section-3)
  - [注文管理](#section-4)
  - [Google Play のサブスクリプション管理](#google-play)
- [テストの始め方](#section-5)
- [サブスクリプション機能とそのテスト方法](#section-6)
- [必須機能](#section-7)
  - [初回購入](#section-8)
  - [初回購入（エラー）](#section-9)
  - [自動更新（リニューアル）](#section-10)
  - [キャンセル](#section-11)
  - [Play ストアからの再サブスクリプション（リストア）](#play)
  - [払い戻し](#section-12)
  - [アカウント保留](#section-13)
- [オプション機能](#section-14)
  - [無料トライアル](#section-15)
  - [サブスクリプションの一時停止](#section-16)
  - [グレース期間](#section-17)
  - [アプリ内からの再サブスクライブ（Resignup）](#resignup)
  - [購入の復元（Restore purchases）](#restore-purchases)
  - [Androidサブスクリプションのアップグレードおよびダウングレードのテスト](#android-2)
  - [Android サブスクリプションのプロモコードのテスト](#android-3)
  - [サブスクリプションオファー](#section-18)
- [自動化されたサブスクリプションテスト](#section-19)
- [ローンチ前のテスト](#section-20)
- [まとめ](#section-21)
- [参考資料](#section-22)

アプリ内課金は、モバイルアプリにおける最も重要な機能のひとつです。ユーザーが購入時に問題に直面しないよう、徹底的なテストは欠かせません。特にAndroidの*サブスクリプション*は、対応すべきケースが多く、慎重な検証がより重要になります。

このガイドでは、Google Playストア上でAndroidのサブスクリプションをどのようにテストすればよいかを解説します。RevenueCatを使用している場合でも、独自のコードや他のモバイルサブスクリプションプラットフォームを使用している場合でも役立つ内容です。必要な機能や考慮すべきイレギュラーケースについてもすべて取り上げ、ユーザーがスムーズでストレスのない購入体験を得られるようサポートします。このガイドは今後の仕様変更や、より良いテスト方法が見つかった際に随時アップデートしていきますので、フィードバックがあればぜひお知らせください。

iOSアプリもありますか？[iOSサブスクリプションテストガイド](https://www.revenuecat.com/jp/blog/the-ultimate-guide-to-subscription-testing-on-ios/)もぜひご覧ください!

サブスクリプションをこれから始めたい方や、インフラをさらに強化したい方は、[RevenueCatに無料で登録](https://app.revenuecat.com/signup)してみましょう。

## Androidサブスクリプションの基本

サブスクリプションを購入したユーザーは、それまでは利用できなかったコンテンツへのアクセス権を得られると期待します。つまり、ユーザーはアクティブなサブスクリプション期間中、アプリ内コンテンツにアクセスするための「エンタイトルメント（利用権）」を一つ以上付与されることになります。

以下は、Google Playストアにおけるサブスクリプションの基本的な仕組みです：

- 購入はユーザーのGoogleアカウントに紐づけられます
- 同じGoogleアカウントで同じサブスクリプションを重複してアクティブにすることはできません
- サブスクリプションは、キャンセルされない限り更新ごとに自動で更新されます。ただし、「ライセンス済みテスター／テストアカウント」を使った購入の場合は最大6回までしか更新されません（詳細は後述の*「ライセンステスト」セクション*をご覧ください）
- ユーザーがサブスクリプションをキャンセルした場合でも、現在の契約期間が終了するまでは有効な状態が維持されます
Googleが[Google I/O 2022](https://www.revenuecat.com/blog/engineering/google-i-o-2022/)でAndroidサブスクリプションにどのような変更を加えたのか知りたい方は、当社がまとめた[Google Play Billing Library 5](https://www.revenuecat.com/blog/engineering/google-play-billing-library-5-0/)の解説記事をご覧ください。

## テスト用ユーティリティ

### ライセンス付きテスト

Google は、テスターに課金せずに購入処理をテストできる「ライセンス付きテスト」という[仕組み](https://developer.android.com/google/play/billing/test)を提供しています。これは開発中に Android の購入処理をテストするための推奨方法です。リリース後の追加テストにも、Google Play のライセンス付きテストを使えば、購入処理をテストできるサンドボックス環境が利用できます。

この機能を使用するには、自分の Google アカウントを Google Play デベロッパーアカウントのライセンス付きテスターとして追加する必要があります。この設定が反映されるまでに数時間かかることがあるため、少し時間をおいてからテストを開始するようにしてください。

![Licensed testing Android subscriptions](https://cdn.sanity.io/images/c3qnx9b0/production/bcd5820034e4dc88696a777928fc4e1c70e4cbe3-1022x714.png)

ライセンス付きテスターとして追加されたユーザーは、たとえアプリを Playストアから直接ダウンロードしていても、アプリ内のプロダクトやサブスクリプションを実際に課金されることなく購入できます。ライセンス付きテストはあくまで社内向けのテスト手段であり、外部テスターとの併用は推奨されていません。


ライセンス付きテスターのアカウントで購入を行うと、購入ダイアログ内に「テスト購入であり、課金は発生しない」ことを示すメッセージが表示されます。また、更新間隔やさまざまな機能の有効期間も[大幅に短縮](https://developer.android.com/google/play/billing/test#renewals)されており、テストしやすくなっています。

![Android subscription testing period times](https://cdn.sanity.io/images/c3qnx9b0/production/d4d2e8a379d258070de824d4069e9e404e8ba8e8-1478x642.png)

![Android subscription testing features](https://cdn.sanity.io/images/c3qnx9b0/production/7484e3509d1190440d5712cfaea74a93abff061c-1566x960.png)

さらに、ライセンス付きテスターのアカウントで購入を行う際、購入ダイアログ内で必ず決済が拒否されるテスト用の支払いカードを選択することができます。これにより、Androidのサブスクリプション購入の失敗やその他のエラーパターンをテストすることが可能です。また、Playストアから支払い方法を変更することで、グレース期間やアカウント保留状態といったシナリオのテストも行えます。

![Android subscription testing payment card](https://cdn.sanity.io/images/c3qnx9b0/production/a2f519a68ec6f455537374be74d818c9d16739db-688x487.png)

### テストトラック

Googleは、Androidサブスクリプションアプリを本番リリース前に少人数のユーザーでテストできる「テストトラック」機能を提供しています。たとえば、アルファ版やベータ版のテストグループを作成し、実際にすべてのユーザーに公開する前にアプリの動作を検証することが可能です。

テストトラックには以下の種類があります：

- **オープントラック：** 誰でもPlayストアから参加可能。参加数の上限を指定することもできます。
- **クローズドトラック：** 参加にはリンクが必要です。
- **内部トラック：** クローズドトラックと似ていますが、社内ユーザー向けであり、上限は100ユーザーです。
クローズドトラックは複数作成可能ですが、内部トラックとオープントラックはそれぞれ1つまでしか作成できません。テストトラックはGoogle Play Consoleから作成することができます。

![Closed testing Android](https://cdn.sanity.io/images/c3qnx9b0/production/27db27e4bc49716c73cbdf55c38169233e5ef813-1999x943.png)

重要な点として、オープン、クローズド、内部いずれのテスターであっても、ライセンステスターに登録されていない限り購入時に課金されるということがあります。これは、実際の課金処理が行われる環境で購入機能の実装を少人数でテストするのに有効です。一方で、Androidアプリの有料機能（サブスクリプションや単発のアプリ内課金など）をテストユーザーに体験してもらいたい場合は、ユーザー自身が支払いを行う必要があります。

この制限を回避する方法はいくつかあります：

- **テスト用のビルドで有料機能をあらかじめアンロックしておく：**この方法は機能しますが、テスターが使用するアプリが本番ユーザーと同じではないというデメリットがあります。
- **有料機能をプログラム的または手動で付与する：**RevenueCatでは、どちらの方法もサポートしています。アプリの特定の機能へのアクセス権を付与する方法については、[エンタイトルメント（Entitlements）を使ったアクセス制御に関するこちらの記事](https://www.revenuecat.com/blog/using-entitlements-for-feature-flags/)をご覧ください。
### 注文管理

Google Play Console の「注文管理」セクションでは、アプリを通じて行われたすべての購入履歴を確認できます。また、アプリの管理者としてユーザーのサブスクリプションに対して基本的な操作を実行することも可能です。これは、テスト購入が正しく Google 側に反映されているか確認するのに非常に便利です。

![Confirming test purchase Android ](https://cdn.sanity.io/images/c3qnx9b0/production/0507ee78ac1da5aefff4f8baf7cda7593923b116-1999x382.png)

その操作のひとつが 購入の払い戻し です。基本的にはライセンステスターアカウントでのテストを行うべきですが、実際の Google アカウントでも Android サブスクリプションのテストをしておくことをおすすめします。特に、初めてユーザー向けにリリースする前や、購入フローに大きな変更を加えたときには重要です。

ただし、ライセンステスターでないアカウントでサブスクリプションを購入すると、実際に課金されます。不要な課金を避けるためにも、非ライセンステスターアカウントでのテスト後は、必ず購入を払い戻すようにしましょう。

払い戻しをプログラムで実行したい場合は、Google が提供している [API](https://developers.google.com/android-publisher/api-ref/rest/v3/purchases.subscriptions/refund) を利用できます。なお、RevenueCat を使用している場合は、Play Console ではなく [RevenueCat のダッシュボードから払い戻し操作](https://www.revenuecat.com/docs/customer-history#refunding-purchases) を行ってください。そうすることで、RevenueCat ダッシュボード上のデータがより正確かつ最新の状態に保たれます。

### Google Play のサブスクリプション管理

Google Play のサブスクリプション管理ページは、Play ストアのアプリ内またはブラウザからアクセスできます。このページでは、ユーザー（あるいはテスト中の開発者）がサブスクリプションに関するさまざまな重要な情報を確認することができます。

- 現在の請求サイクル終了後にサブスクリプションが自動更新されるかどうかといった更新情報
- ユーザーの現在の請求サイクルの有効期限
- 支払い方法（変更も可能）。ライセンス付きテスターアカウントを使っている場合、承認されるテストカードと失敗するテストカードを切り替えてテストする際に特に便利です
- サブスクリプションの価格
またこのページでは、サブスクリプションのキャンセル、一時停止、再登録、アップグレード／ダウングレードといった操作も可能です。

![](https://cdn.sanity.io/images/c3qnx9b0/production/504a7399406059f4c0b9b65c6d92f45c73e9ab71-1600x1228.png)

![](https://cdn.sanity.io/images/c3qnx9b0/production/b503b7933fb1a05feecb0e50ba3b7f85cc530af7-1600x1496.png)

ユーザーがこの Play ストアのサブスクリプション管理ページに簡単にアクセスできるよう、アプリ内からの導線を用意しておくことが推奨されます。サブスクリプションが有効な場合のリンクはこちら [https://play.google.com/store/account/subscriptions?sku=your-sub-product-id&package=your-app-package](https://play.google.com/store/account/subscriptions?sku=your-sub-product-id&package=your-app-package) 有効でない場合はこちら[https://play.google.com/store/account/subscriptions](https://play.google.com/store/account/subscriptions) になります。

## テストの始め方

Android サブスクリプションのテストを始めるには、まず以下の準備が必要です：

- Google Play Console のクローズドテストトラックに署名済みのビルドをアップロードします。公式には記載されていませんが、この操作後にある程度の反映時間が発生する可能性があります。アップロード後は数時間待ってからテストを開始することをおすすめします。一度アプリが承認されれば、以降はテストトラックに毎回新しいビルドをアップロードする必要はなく、ローカルビルドでもテスト可能です。
- テストを始める前に、アプリが承認されていることを確認してください。
- Android 1.6 以降かつ Google Play ストアと Play Services がインストールされている実機またはエミュレータを用意してください。実機でのテストが望ましいですが、エミュレータを使用する場合は、下図のように Play ストアが含まれたシステムイメージを選択してください。

![Select hardware for testing Android subscriptions](https://cdn.sanity.io/images/c3qnx9b0/production/ee0cc6e43f30c4728f811c3a65a86027fe7473a3-613x444.png)

- デバイスに PIN コードなどのセキュリティ設定を行ってください。これについても公式な記載はありませんが、サブスクリプションのテストが失敗するケースが確認されています。
- テストに使用する Google アカウントでデバイスにログインします。その Google アカウントは、Google Play Console でテストトラックに追加されている必要があります。複数の Google アカウントでデバイスにログインしていると、想定外の挙動が発生する可能性があります。
- 該当するテストトラックのオプトイン URL にアクセスし、その Google アカウントでテストトラックに参加してください。ここでも反映までに時間がかかる場合があります。

![how testers join your test Android subscriptions](https://cdn.sanity.io/images/c3qnx9b0/production/b04cd119902acced27ad49a3ff7a217dd7981719-1999x628.png)

- こちらも非公式な情報ですが、Google アカウントでログインした後、テスト購入を行う前に一度 Play ストアを起動しておくことをおすすめします。
- テストに使用するビルドは、Play Console に登録された **applicationId** と一致している必要があります。
- サブスクリプションの設定を行ってください。こちらから[Google Play Console でのサブスクリプション設定ガイド](https://www.revenuecat.com/docs/android-products)をご覧ください。まだ設定したことがない場合は、必ず一読することをおすすめします。Google Play Console での多くの変更と同様に、サブスクリプション作成後も反映まで数時間待つのが無難です。
これらの準備が整えば、アプリ内でサブスクリプションを購入できるようになります。

アプリでのサブスクリプションテストに向けた第一歩、完了おめでとうございます！ 🎉

## サブスクリプション機能とそのテスト方法

Play ストアのサブスクリプションシステムには、さまざまな機能が用意されています。中にはすべての Android アプリでテストが必要な必須機能もあれば、アプリが対応している場合のみテストが必要なオプション機能もあります。ここでは、それぞれの機能を「必須」と「オプション」に分類し、それぞれのテスト方法について解説します。

まずはライセンステスターを使ってこれらの機能をテストし、その後に非ライセンステスターのアカウントで基本的な動作確認を行うことをおすすめします。また、実装内容に大きな変更を加えた場合にも、必ず再度テストを行ってください。（テスト中に購入したサブスクリプションは、Google Play Console の「注文管理」セクション、または RevenueCat のダッシュボードから払い戻しを行い、無駄な課金を避けましょう。）

## 必須機能

### 初回購入

**テスト方法：**

1. そのサブスクリプションが有効になっていない Google アカウントを使用して、サブスクリプションの購入を行います。
1. エラーが出ることなく購入が成功するか確認します。ライセンステスターかどうかにかかわらず、Google から購入確認のメールが届くはずです。
1. サブスクリプションの有効期間中、ユーザーが関連するコンテンツや権利（エンタイトルメント）にアクセスできることを確認します。
1. サブスクリプション期間が想定どおりになっているか確認します。Play ストアの「定期購入」セクションから確認できます。
### 初回購入（エラー）

**テスト方法：**

1. サブスクリプションの購入を試み、完了せずに失敗させます。ライセンステスターアカウントを使用している場合は「拒否されるテストカード」を選択するか、ネットワーク接続のない状態で購入を試みます。
1. ユーザーに対して、エラーの内容がわかる適切なメッセージが表示されることを確認します。
1. ユーザーにエンタイトルメント（アクセス権）が付与されていないことを確認します。
### 自動更新（リニューアル）

****テスト方法：****

1. サブスクリプションを購入します。
1. ユーザーが対象コンテンツへアクセスできる状態（アンロックされている）であることを確認します。
1. 最初のサブスクリプション期間が終了するまで待機します。ライセンステスターアカウントを使用している場合は、[こちら](https://developer.android.com/google/play/billing/test#renewals) に記載されているテスト用の短縮期間を確認してください。
1. サブスクリプションの更新後も、ユーザーが引き続きコンテンツへアクセスできる状態であることを確認します。
### キャンセル

**テスト方法：**

1. サブスクリプションを購入します。
1. ユーザーが対象コンテンツへアクセスできる状態（アンロックされている）であることを確認します。
1. Play ストアの「サブスクリプション」セクションから、サブスクリプションをキャンセルします。
1. 現在のサブスクリプション期間が終了するまでは、ユーザーが引き続き対象コンテンツへアクセスできる状態であることを確認します。
1. サブスクリプション期間が終了した後、ユーザーは対象コンテンツにアクセスできない（ロックされる）状態になることを確認します。
### Play ストアからの再サブスクリプション（リストア）

**テスト方法：**

1. サブスクリプションを購入します。
1. サブスクリプションをキャンセルします。
1. 現在のサブスクリプション期間が終了するまでは、ユーザーが対象コンテンツにアクセスできる状態であることを確認します。
1. サブスクリプションが終了する前に、Play ストアから再度同じサブスクリプションを購読します。
1. サブスクリプション期間終了後も、ユーザーが引き続き対象コンテンツへアクセスできる状態であることを確認します。
**補足**：

- [https://developer.android.com/google/play/billing/subscriptions#before-in-store](https://developer.android.com/google/play/billing/subscriptions#before-in-store)
### 払い戻し

**テスト方法：**

1. サブスクリプションを購入します。
1. ユーザーが該当するコンテンツやエンタイトルメントにアクセスできることを確認します。
1. **RevenueCatを利用していない場合：**Play Console の「注文管理」セクションで、注文ID（Googleアカウントに送信された領収書メールに記載）またはメールアドレスを使って注文を検索し、払い戻しを行います。
1. **RevenueCatを利用している場合：**RevenueCatのダッシュボードで、注文ID、メールアドレス、またはユーザーIDを使用して該当するサブスクリプションを検索し、払い戻しを行います。
1. ユーザーは、該当するコンテンツやエンタイトルメントにアクセスできなくなっていることを確認します。
1. サブスクリプションが自動更新されないことを確認します。
### アカウント保留

サブスクリプションの更新時に支払いが失敗すると、オプションで設定されている「猶予期間（Grace period）」が終了した後、サブスクリプションは「アカウント保留（Account hold）」状態に入ります。この状態では、ユーザーはエンタイトルメントにアクセスできませんが、請求に関する問題について通知され、修正して復旧する機会が提供されます。この状態は最大30日間続きます（内部テストでは最大10分）。

**テスト方法：**

1. サブスクリプションを購入します。
1. 更新前に、失敗する支払い方法へ変更します。これは内部テストで、Playストアの更新用に失敗するテストカードを選ぶことで簡単に行えます。
1. 現在のサブスクリプション期間が終了するまでは、ユーザーが該当するコンテンツにアクセスできることを確認します。
1. サブスクリプション期間が終了した後、ユーザーがコンテンツにアクセスできなくなっていることを確認します。
1. 支払い方法を有効なものに変更します。
1. サブスクリプションが再開されます。
1. ユーザーが再び該当するコンテンツにアクセスできることを確認します。
**補足：**

- 支払い方法が修正されずにアカウント保留期間が終了すると、サブスクリプションはキャンセルされます。
- サブスクリプションに猶予期間が設定されている場合、まず猶予期間状態に入り、その後アカウント保留状態に移行します。
## オプション機能

### 無料トライアル

Androidサブスクリプションの無料トライアルをテストするには、Google Play Console で「新規顧客獲得（New customer acquisition）」オファーとして「無料トライアル（Free trial）」フェーズを設定した [サブスクリプションを作成](https://www.revenuecat.com/docs/android-products#optional-create-an-offer) する必要があります。

**適格性の条件：**

- 無料トライアルオファーを Play Console で作成する際、どのユーザーが対象となるかを選択できます。選べる条件は以下の2つです：
  - **その特定のサブスクリプションを一度も購入したことがないユーザー** この場合、同じGoogleアカウントでその特定のサブスクリプションを購入したことがあるユーザーは、無料トライアルを受けられません。
  - **そのアプリでサブスクリプションを一度も購入したことがないユーザー** この場合、同じGoogleアカウントで同一または別のサブスクリプションを購入したことがあるユーザーは、無料トライアルの対象外となります。

![Entitlement eligibility criteria Android](https://cdn.sanity.io/images/c3qnx9b0/production/5b243244a6bcade9231d58ae38ede9c5b8a56838-866x248.png)

- RevenueCat を使用している場合、ユーザーが無料トライアルの対象かどうかを検出する現在の方法については、 [こちらのQ&A](https://community.revenuecat.com/sdks-51/how-do-i-check-the-user-s-eligibility-for-intro-pricing-and-free-trials-on-android-163) をご覧ください。
- 無料トライアルの対象でないユーザーに対して、そのプロモーションを表示しないように注意しましょう。対象外のユーザーに誤って案内してしまうと、非常に悪いユーザー体験につながります。
- なお、無料トライアルの適格性はアプリ側のユーザーアカウントではなく、Googleアカウントに基づいて判断されます。
**テスト方法：**

1. 無料トライアル付きのサブスクリプションを、トライアル対象となるユーザーで購入します。Play ストアの購入ダイアログには、無料トライアルが提供されること（課金なし）、および通常の価格とサブスクリプション期間が表示されるはずです。
1. 無料トライアル期間中は、ユーザーが該当する権利（エンタイトルメント）にアクセスできることを確認します。
1. 無料トライアル期間が終了した後（内部テストでは3分後）、通常価格でサブスクリプションが更新されることを確認します。
1. トライアルが終了しても（キャンセルされていない限り）、ユーザーが引き続き該当する権利にアクセスできることを確認します。
### サブスクリプションの一時停止

Google Play Console の「マネタイズ設定（Monetization setup）」タブから、アプリに対して[サブスクリプションの一時停止機能](https://developer.android.com/google/play/billing/subscriptions#pause)を有効にできます。この機能を有効にすると、ユーザーはサブスクリプションを一定期間一時停止できるようになり、その間は自動更新が行われなくなります。例えば、休暇などで一時的にアプリの利用を中断したいが、今後も使い続けるつもりがあるユーザーにとって便利な機能です。

**テスト方法：**

1. サブスクリプションを購入する
1. サブスクリプションを一時停止する
1. 一時停止後も、現在のサブスクリプション期間が終了するまでは、関連コンテンツにアクセスできる状態が続くことを確認する
1. サブスクリプション期間終了後は、関連コンテンツにアクセスできなくなることを確認する
1. サブスクリプション期間終了後、Playストアからサブスクリプションを再開する
1. 再開後、関連コンテンツへのアクセスが回復することを確認する
1. 以降、通常通りサブスクリプションが更新されることを確認する
**補足：**

- 年間サブスクリプションでは一時停止機能は使用できません。
- 一時停止期間が終了すると、Google によって自動的にサブスクリプションが再開されます。再開時に支払い方法に問題がある場合は、「アカウント保留」ステータスになります。
- ユーザーは最大3ヶ月間サブスクリプションを一時停止できます（ライセンス付きテスターでは15分）。
### グレース期間

サブスクリプションの更新時に支払いが失敗した場合、ユーザーに一定の猶予期間を設けて、支払い方法を修正してもらうことができます。この間、関連コンテンツへのアクセスは中断されません。グレース期間は、各サブスクリプションごとに個別に設定できます。

**テスト方法：**

1. グレース期間が設定されているサブスクリプションを購入します。
1. 次回更新前に、支払いが失敗するような決済方法に変更します。前述のとおり、内部テスト環境では失敗するテストカードを選択できるため、この操作が簡単に行えます。
1. 現在のサブスクリプション期間が終了するまでは、ユーザーが関連コンテンツにアクセスできることを確認します。
1. 現在のサブスクリプション期間が終了した後も、グレース期間が終了するまでは（ライセンステストでは5分間）、ユーザーが引き続き関連コンテンツにアクセスできることを確認します。
1. この後、以下の2通りのシナリオが考えられます：
  1. ユーザーが支払い方法を修正した場合： 
    - グレース期間が終了する前に、有効な支払い方法に変更します。
    - グレース期間終了後も、ユーザーが関連コンテンツにアクセスできることを確認します。
    - サブスクリプションは通常通り更新されるはずです。
  1. ユーザーが支払い方法を*修正しなかった場合*：
    - グレース期間が終了すると、ユーザーは関連コンテンツへのアクセスを失い、「アカウント保留（account hold）」状態に入ります。
    - サブスクリプションはそれ以降、更新されなくなります。
### アプリ内からの再サブスクライブ（Resignup）

ユーザーがサブスクリプションを解約した後も有効期限が切れる前であれば、アプリ内からの [再サクライブを許可する](https://developer.android.com/google/play/billing/subscriptions#before-in-app) ことができます。この場合、ユーザーが解約したのと同じサブスクリプションを再度提供することもできますし（再アクティベート）、別のサブスクリプションを提供して残り期間を日割りで計算することも可能です。後者は「アップグレード／ダウングレード」に該当し、後述します。

**Androidサブスクリプションの再サブスクライブをテストする方法：**

1. サブスクリプションを購入します。
1. そのサブスクリプションを解約します。
1. アプリ内から、有効期限が切れる前に同じサブスクリプションを再アクティベートします。
1. ユーザーは、サブスクリプション期間終了後も関連コンテンツへのアクセスを維持できるはずです。あたかも一度も解約していなかったかのように機能します。
**補足：**

- この方法で再サブスクライブが行われた場合、Google Play側では新しいサブスクリプションとして内部的に処理され、前のサブスクリプションの残り時間が日割りで調整されます。この挙動は、購入データの追跡やGoogle Play Console上での購入確認の際に重要なポイントとなる可能性があります。
### 購入の復元（Restore purchases）

ここでは、アプリに独自のアカウントシステムがあるかどうかに応じて、2つの主要なケースをテストする必要があります。

#### アプリにアカウントシステムがない場合：

ユーザーがアプリをアンインストールして再インストールした場合や、複数のデバイスでアプリを利用している場合でも、アプリはサブスクリプションへのアクセスを提供しなければなりません。

**アプリのアンインストールと再インストール時のテスト手順**：

1. サブスクリプションを購入します。
1. 同じGoogleアカウントでアプリをアンインストールし、再インストールします。
1. アプリを再インストールした後でも、ユーザーは対象のコンテンツに引き続きアクセスできる必要があります。
**複数のAndroidデバイスでのインストール時のテスト手順**：

1. 同じGoogleアカウントで、複数のデバイスにアプリをインストールします。
1. 1台のデバイスでサブスクリプションを購入します。
1. 両方のデバイスで、ユーザーが対象のコンテンツにアクセスできることを確認します。
#### アプリにアカウントシステムがある場合：

このケースに対するGoogleからの明確なサポートはありませんが、開発者として選択できる挙動はいくつか存在します。主なポイントは、ユーザーは1つのGoogleアカウントにつき同じサブスクリプションを一度しかアクティブにできないということです。つまり、すでにあるアプリアカウントでサブスクリプションをアクティブにしている場合、別のアプリアカウントで同じGoogleアカウントを使って再度サブスクリプションを購入することはできない可能性があります。開発者としては、同じGoogleアカウントを使用しているすべてのアカウントにエンタイトルメントを付与する、特定のアカウントにアクセスを移行できる仕組みを提供する、あるいは別の技術を用いるといった選択肢があります。いずれの方法を選ぶにしても、これは最も複雑なフローの1つであるため、慎重なテストが必要です。RevenueCatでは、独自のアカウントシステムで購入を復元しようとする際の[挙動を柔軟に設定](https://www.revenuecat.com/docs/restoring-purchases#restore-behavior)することができます。

さらに、サブスクリプションがすでに期限切れとなっている場合に、復元操作によってアクセスが再び許可されないことを確認する必要があります。これは、アカウントシステムの有無に関係なく確認すべき事項です。

### Androidサブスクリプションのアップグレードおよびダウングレードのテスト

ユーザーがアクティブなサブスクリプションを持っている間（キャンセル済みかどうかは問わず）、アプリ内から異なる価格、更新期間、またはオファーを持つ別のサブスクリプションを提供することが可能です。これが [アップグレードまたはダウングレード](https://developer.android.com/google/play/billing/subscriptions#change)と呼ばれるものです。変更の内容に応じて、いくつかの異なる「比例按分（proration）モード」が用意されており、それぞれに応じたテスト基準があります。

![](https://cdn.sanity.io/images/c3qnx9b0/production/96061c287df0eb3757f435016400c0bdd4f32e8f-1720x926.png)

アップグレードやダウングレードを行った際に、サブスクリプションの期間と価格が選択した比例按分モードに応じて期待通りになることを、十分にテストして確認してください。

### Android サブスクリプションのプロモコードのテスト

Play ストアでは、サブスクリプションに対して[プロモーションコード](https://support.google.com/googleplay/android-developer/answer/6321495)を作成し、コードを引き換えたユーザーに無料トライアルを付与する機能が提供されています。これらのコードは、Google の購入ダイアログまたは Play ストアから引き換えることができます。プロモコードには「1 回限りのコード」と「カスタムコード」の 2 種類があり、カスタムコードはアプリ内購入ダイアログでのみ引き換え可能で、かつ過去にサブスクリプションを購入していないユーザーのみが使用できます。この条件をユーザーにきちんと伝えるようにしてください。 プロモコードのテストには、まず[テストしたいタイプのプロモコード](https://developer.android.com/google/play/billing/test#promo)を作成し、次にさまざまなシナリオで動作を確認する必要があります。

テスト方法は多岐にわたるため、すべてをここで紹介することはできませんが、Google では以下のテストを少なくとも実施するよう推奨しています：

- **アプリをインストールする前にプロモコードを引き換える** このケースは特に重要です。次のような手順で検証します： 
  1. アプリをインストールする前に、Play ストアでプロモコードを引き換える
  1. Play ストアからアプリをインストールする
  1. アプリを起動するとすぐに、プロモーションが適用され、対象のコンテンツにアクセスできるようになる
- **アプリがフォアグラウンドで動作している間に引き換える** このテストでは、もう1台別のデバイスを使用して Play ストアアプリからプロモコードを引き換える必要があります。アプリ内のさまざまな画面からの引き換えもテストするようにしてください。
- **マルチウィンドウモードでの引き換え** これは、あなたのアプリと Google Play ストアアプリが同時に表示されている状態でプロモコードを引き換えるケースです。
### サブスクリプションオファー

Google は Google I/O 2022 にて、サブスクリプションオファーのサポートを追加しました。これにより、無料トライアルや割引期間など、さまざまな価格設定期間を組み合わせて、新規ユーザーおよび既存ユーザーに対して柔軟なサブスクリプションオファーを提供できるようになりました。RevenueCat では、これらすべてのオファーに対するサポートを積極的に進めており、より網羅的なテスト手順が整い次第、このセクションを更新する予定です。

## 自動化されたサブスクリプションテスト

ここまで紹介してきたテスト手順はすべて手動によるものですが、開発者であれば誰しも繰り返し作業やテストは自動化したくなるものです。自動化することで、より信頼性が高く網羅的なテストが可能になり、なにより大幅な時間の節約になります。 — しかし残念ながら、現時点で Google は、ユニットテスト内で購入環境をシミュレートする公式な仕組みを提供していません。

その代替として、UI テストを使って購入テストを自動化する方法があります。ただし、ユニットテストと比べて実行速度が遅く壊れやすい上に、いくつかの厄介な課題が存在します：

- サブスクリプションは Google アカウントに紐づいているため、同じアカウントで並列にテストを実行したり、短時間で連続して実行すると問題が発生する可能性があります。また、テストアカウントはライセンス付きテスターとして追加されている必要があります。
- 一部の機能はテストが非常に難しいです。たとえば更新処理をテストするには、少なくとも数分間はテストを待機させる必要があります。また、プロモコードには利用回数の上限があるため、制限に引っかかる可能性もあります。
Google が将来的に購入テストの自動化サポートを改善してくれることを期待していますが、それまでは実現可能であるとはいえ、非常に困難かつ制約の多い領域です。

## ローンチ前のテスト

アプリを一般公開する前にサブスクリプション機能を検証するには、社内ユーザー向けのクローズドトラックを作成し、そのトラックにビルドをアップロードして、テスト用にアプリの承認を取得する必要があります。アプリの承認が下りたら、まずライセンス付きアカウントを使って、対応しているすべての機能をテストしてください。問題なく動作していることが確認できたら、今度はライセンスのないアカウントでもいくつかのテストを実施することをおすすめします。ライセンスなしのアカウントで最低限テストすべき項目は次のとおりです：

- 初回購入
- 更新（より短期間でテストできるよう、週次サブスクリプションを用意するのが理想です）
- キャンセル
- 無料トライアル
- 購入の復元
## まとめ

アプリ内課金、特にサブスクリプションの実装と運用は非常に複雑です。しかし、Play ストアが提供するすべての機能に対応することは、開発者にとってもユーザーにとっても非常に重要です。そのため、あらゆる機能について徹底的にテストする必要があります。

もしアプリ内サブスクリプションの実装に課題を感じているなら、RevenueCat の[オープンソース SDK](https://www.revenuecat.com/docs)をぜひチェックしてみてください。面倒な実装やエッジケースの処理を代わりに担ってくれるので、アプリ開発そのものに集中できます。

## 参考資料

- [https://developer.android.com/google/play/billing/subscriptions](https://developer.android.com/google/play/billing/subscriptions)
- [https://developer.android.com/google/play/billing/test](https://developer.android.com/google/play/billing/test)
- [https://developer.android.com/google/play/billing/integrate](https://developer.android.com/google/play/billing/integrate)
- [https://support.google.com/googleplay/android-developer/answer/6321495](https://support.google.com/googleplay/android-developer/answer/6321495)
- [https://support.google.com/googleplay/android-developer/answer/6062777?visit_id=637985918526134599-958427837&rd=1](https://support.google.com/googleplay/android-developer/answer/6062777?visit_id=637985918526134599-958427837&rd=1)
- [https://support.google.com/googleplay/android-developer/answer/9845334?visit_id=637985918522966640-2836964984&rd=1#zippy=%2Cinternal-test-manage-up-to-testers](https://support.google.com/googleplay/android-developer/answer/9845334?visit_id=637985918522966640-2836964984&rd=1#zippy=%2Cinternal-test-manage-up-to-testers)
- [https://www.revenuecat.com/docs/android-products](https://www.revenuecat.com/docs/android-products)
- [https://www.revenuecat.com/docs/google-play-store](https://www.revenuecat.com/docs/google-play-store)
- [https://www.revenuecat.com/docs/restoring-purchases](https://www.revenuecat.com/docs/restoring-purchases)
