К основному содержанию
скилл CX Codex

rc-testing — скилл для Claude Code: что делает и как установить

Скилл помогает настроить быстрое тестирование покупок RevenueCat в Android через Test Store, изолировать SDK интерфейсом для MockK и запустить проверки в GitHub Actions.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add RevenueCat/ai-toolkit --skill rc-testing -a claude-code
Открыть на GitHub

Что делает rc-testing

Инструмент выстраивает процесс проверки платежей на Android без постоянного ожидания ответа от Google Play sandbox. Для повседневных тестов используется Test Store с префиксом ключа test_. При вызове метода awaitPurchase() на экране появляется диалоговое окно с вариантами Success, Fail и Cancel, что позволяет сразу разобрать все ветки обработки ошибок в интерфейсе.

Синглтон Purchases невозможно протестировать напрямую. Скилл закрывает вызовы SDK тонким интерфейсом BillingService. Такой подход позволяет легко подменять логику через MockK и библиотеку kotlinx-coroutines-test в тестах для ViewModel. Дополнительно создаётся лёгкий сценарий для GitHub Actions, запускающий команду ./gradlew testDebugUnitTest на раннере Ubuntu без эмулятора.

Test Store не моделирует циклы автоматического продления подписок, сценарии ожидания родительского одобрения и сквозные транзакции. Эти сценарии по-прежнему требуют обязательной ручной проверки в Google Play Sandbox перед выпуском релиза в продакшен.

Какие задачи решает

  • протестировать ветки успеха, ошибки и отмены покупки без Google Play sandbox
  • изолировать синглтон Purchases интерфейсом для юнит-тестов с MockK
  • настроить запуск тестов биллинга в GitHub Actions через ./gradlew testDebugUnitTest
  • разделить тестовый ключ test_ и релизный goog_ через конфигурацию сборки

Примеры запросов агенту

  • Помоги настроить Test Store для RevenueCat и вынести ключ в build.gradle.kts
  • Оберни Purchases в интерфейс BillingService и напиши тест с MockK
  • Добавь воркфлоу GitHub Actions для запуска тестов RevenueCat без эмулятора

Как установить rc-testing

1Через Skills CLI (Vercel)

npx skills add RevenueCat/ai-toolkit --skill rc-testing -a claude-code

2Вручную: положить файлы

~/.claude/skills/rc-testing/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/rc-testing/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о rc-testing

Как установить rc-testing в Claude Code?

Выполните в терминале команду npx skills add RevenueCat/ai-toolkit --skill rc-testing -a claude-code.

Что делает скилл rc-testing?

Он предоставляет инструкции и шаблоны кода для быстрого тестирования покупок RevenueCat в Android через Test Store, изоляции SDK интерфейсом и настройки CI.

Когда Test Store недостаточно и нужен Google Play Sandbox?

Google Play Sandbox остаётся обязательным для проверки продления подписок, отложенных платежей с родительским одобрением и финальной сквозной оплаты.

Исходный текст

SKILL.md · MIT
---
name: rc-testing
description: Use this skill when testing a RevenueCat Android integration. Covers the RevenueCat Test Store (test_ API key prefix, in dialog Success/Fail/Cancel choice), mockk based unit testing with an interface wrapper around Purchases, and a GitHub Actions CI pattern. Avoids Google Play sandbox for day to day test iteration.
license: Apache-2.0; see LICENSE
metadata:
  author: RevenueCat
  source: revenuecat-handbook chapter 16
  keywords:
  - android
  - revenuecat
  - testing
  - test-store
  - mockk
  - github-actions
---

# Testing RevenueCat on Android

Use this skill to stand up a fast test loop for a RevenueCat Android integration. The Test Store replaces the Google Play sandbox for most work, a `BillingService` interface makes `Purchases` mockable, and a small GitHub Actions job runs unit tests on every push.

Full source: see the [full chapter on revenuecat.com](https://www.revenuecat.com/guides/revenuecat-android-sdk/testing).

---

## Phase 1: Discovery

Before changing anything, learn what already exists. Answer each question with a file or a "no".

| Check | Where to look | What you want |
|---|---|---|
| Test API key configured? | `app/build.gradle.kts`, `local.properties`, env | A `test_...` value bound to `BuildConfig.RC_API_KEY` in debug |
| Release key separate? | `build.gradle.kts` release block | A `goog_...` key, never `test_...` |
| Purchases wrapped? | `app/src/main/java/**/*Billing*.kt` | An interface that hides `Purchases.sharedInstance` |
| CI present? | `.github/workflows/*.yml` | A job running `./gradlew testDebugUnitTest` |
| Secret wired? | GitHub repo settings, workflow `env:` | `RC_TEST_STORE_KEY` referenced from `secrets` |
| Test library? | `app/build.gradle.kts` dependencies | `io.mockk:mockk` and `kotlinx-coroutines-test` |

If the project has none of these, start from scratch in Phase 3. If some exist, only fill the gaps.

---

## Phase 2: Plan

Pick the test path per scenario. The Test Store is the default; fall back to Google Play sandbox only when you need store behavior the Test Store does not simulate.

| Scenario | Use |
|---|---|
| Success, failure, cancel paths | Test Store |
| Unit tests of ViewModels | mockk against `BillingService` |
| CI on every push | Test Store + unit tests |
| Subscription renewal cycles | Google Play Sandbox |
| Pending purchase (parental approval) | Google Play Sandbox |
| Full end-to-end payment | Google Play Sandbox |

Write the plan as a short checklist in `tasks/todo.md` before coding. If the app ships subscriptions, keep one Sandbox pass in the pre-ship checklist even if the Test Store covers daily iteration.

---

## Phase 3: Execute

### Step 1: Generate the test API key

In the RevenueCat dashboard, open your app, go to **Apps & providers**, then **Create Test Store**. Copy the `test_...` key. Do not commit it. Put it in `local.properties` or a CI secret.

### Step 2: Wire the key into debug builds

```kotlin
// build.gradle.kts
android {
    buildTypes {
        debug {
            buildConfigField("String", "RC_API_KEY", "\"test_YOUR_KEY\"")
        }
        release {
            buildConfigField("String", "RC_API_KEY", "\"goog_YOUR_KEY\"")
        }
    }
}
```

For CI, read from env so the key never lands in git:

```kotlin
// build.gradle.kts
val testKey = System.getenv("RC_TEST_STORE_KEY") ?: "test_placeholder"
buildConfigField("String", "RC_API_KEY", "\"$testKey\"")
```

### Step 3: Configure Purchases with the build config key

```kotlin
class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        if (BuildConfig.DEBUG) Purchases.logLevel = LogLevel.DEBUG
        Purchases.configure(
            PurchasesConfiguration.Builder(this, BuildConfig.RC_API_KEY).build()
        )
    }
}
```

### Step 4: Trigger the Test Store dialog

Run the app in debug and call `awaitPurchase()` from your paywall. A dialog appears with Success, Fail, and Cancel options. Each choice resolves the same way production would: Success returns a `PurchaseResult` with active entitlements, Fail throws `PurchasesTransactionException` with a payment error, Cancel throws with `userCancelled = true`. Walk every branch of your error handling to verify UI states.

### Step 5: Wrap Purchases in a BillingService

The `Purchases` singleton is not mockable. A thin interface lets you inject a fake in tests and keeps ViewModels free of SDK types.

```kotlin
interface BillingService {
    suspend fun getOfferings(): Offerings
    suspend fun purchase(activity: Activity, pkg: Package): CustomerInfo
    suspend fun getCustomerInfo(): CustomerInfo
}
```

```kotlin
class RevenueCatBillingService : BillingService {
    override suspend fun getOfferings() =
        Purchases.sharedInstance.awaitOfferings()

    override suspend fun purchase(activity: Activity, pkg: Package): CustomerInfo =
        Purchases.sharedInstance.awaitPurchase(
            PurchaseParams.Builder(activity, pkg).build()
        ).customerInfo

    override suspend fun getCustomerInfo() =
        Purchases.sharedInstance.awaitCustomerInfo()
}
```

### Step 6: Write mockk unit tests

```kotlin
class PaywallViewModelTest {
    private val billing = mockk<BillingService>()
    private val viewModel = PaywallViewModel(billing)

    @Test
    fun `purchase success grants access`() = runTest {
        val info = mockk<CustomerInfo> {
            every { entitlements["pro_access"]?.isActive } returns true
        }
        coEvery { billing.purchase(any(), any()) } returns info
        viewModel.purchase(mockActivity, mockPackage)
        assertTrue(viewModel.state.value is PaywallState.Success)
    }
}
```

Add one test per branch: success grants access, failure shows error, cancel stays idle.

### Step 7: Add a minimal GitHub Actions job

```yaml
# .github/workflows/test.yml
name: test
on: [push, pull_request]
jobs:
  unit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: 17
      - name: Run tests
        env:
          RC_TEST_STORE_KEY: ${{ secrets.RC_TEST_STORE_KEY }}
        run: ./gradlew testDebugUnitTest
```

Store the `test_...` key as the `RC_TEST_STORE_KEY` repository secret. The job runs without a device or a Google account.

---

## Verification

After each purchase, open the RevenueCat dashboard, go to **Customers**, pick the user, and confirm the purchase, the entitlement, and the `CustomerInfo` JSON. The **Events** tab shows webhooks fired for the test purchase.

## Pre-Ship Checklist

- [ ] `Purchases.logLevel = LogLevel.DEBUG` gated on `BuildConfig.DEBUG`
- [ ] Release build uses the `goog_` key, not the `test_` key
- [ ] `test_` key is not committed (env var or `local.properties`)
- [ ] Success, failure, and cancel paths exercised through the Test Store dialog
- [ ] At least one end-to-end flow verified in Google Play Sandbox
- [ ] Webhook endpoint receives events for sandbox purchases

## References

- [Full chapter](https://www.revenuecat.com/guides/revenuecat-android-sdk/testing)

© RevenueCat · MIT · RevenueCat/ai-toolkit

Похожие скиллы

Все скиллы по теме «Тесты и QA» →
improve-codebase-architecture Matt Pocock Скилл ищет архитектурные узкие места в кодовой базе и показывает варианты углубления модулей в HTML-отчёте. Подойдёт для ревью перед рефакторингом. 1 163 035установок design-taste-frontend Leonxlnx Скилл задаёт арт-дирекцию для публичных страниц и рабочих экранов, а затем проверяет результат в браузере по скриншотам. Нужен, когда интерфейс выглядит шаблонным или недоработанным. CX Codex +1 678 700установок tdd Matt Pocock Скилл управляет циклом красный-зелёный в TDD: проверяет, что тесты пишутся до кода, держит их на уровне публичных интерфейсов и не завязывает на внутреннюю структуру. 1 141 062установок skill-creator официальный anthropics Помогает создать новый скилл, доработать существующий и проверить результат через тестовые промпты и оценки. 414 180установок agent-browser vercel-labs Скилл управляет браузером через CLI: открывает страницы, заполняет формы, нажимает кнопки и проверяет веб-приложения. Подходит для задач, где агенту нужно действовать в интерфейсе. CX Codex +1 1 200 000установок prototype Matt Pocock Создаёт временный прототип, чтобы проверить логику, модель состояния или вид интерфейса до работы над основным кодом. 986 201установок

Из того же набора33

rc-subscriptions Скилл учит ИИ-агента связывать трёхуровневую модель подписок Google Play с объектами RevenueCat на Android. Помогает собирать пейволлы и оформлять покупки. CX Codex +1 637установок rc-backend Скилл для работы с состоянием RevenueCat на сервере: чтение подписчиков, выдача и отзыв entitlements, атрибуты через REST API. CX Codex +1 635установок rc-setup Проведёт по дашборду RevenueCat и подключению Google Play: приложение, сервисный аккаунт, entitlements, offerings и публичный API-ключ. CX Codex +1 638установок rc-configuring-the-sdk Скилл проводит агента через подключение RevenueCat к Android-приложению: Gradle-зависимость, Purchases.configure, стратегия app user id и уровень логов. CX Codex +1 636установок rc-catalog-management Ведёт каталог Android-товаров между Play Console и панелью RevenueCat: импорт продуктов, привязка к entitlement, сборка офферов. CX Codex +1 627установок rc-subscription-states Скилл для Android-проектов на RevenueCat: подсказывает агенту, как проверять доступ к платному контенту через CustomerInfo и EntitlementInfo. CX Codex +1 623установок rc-error-handling Разбирает ошибки RevenueCat Android SDK: какой код что значит и что показать пользователю. Пригодится, когда платёжный флоу ломается на проде. CX Codex +1 627установок rc-plan-changes Скилл помогает настроить смену тарифных планов Google Play через RevenueCat на Android, выбирая верный режим перерасчёта стоимости. CX Codex +1 621установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой