Реалізація Debug Menu (прихованого меню) для тестувальників мобільного додатку
Тестувальник хоче скинути онбординг без переінсталяції додатку. Переключитися на staging. Примусово викликати push-повідомлення. Подивитися поточний стан feature flag. Симулювати помилку мережі. Все це — завдання для Debug Menu: прихованого екрана, доступного лише у потрібних збірках.
Архітектура Debug Menu
Debug Menu — окремий екран (або набір екранів), доступний через прихований жест або спеціальну точку входу. Виклик: shake gesture, довге натискання на версію в Settings, секретний tap pattern на логотипі (5 тапів).
Принципово важливо: Debug Menu повинен бути повністю виключений з release-збірки. Не прихований, не за флагом — саме виключений з компіляції.
iOS — умовна компіляція:
#if DEBUG || BETA
import UIKit
final class DebugMenuViewController: UIViewController {
// весь код debug menu
}
#endif
Android — окремий build flavor:
app/
src/
main/
debug/
kotlin/com/example/debug/DebugMenuActivity.kt
release/
// DebugMenuActivity відсутня
Зареєструйте DebugMenuActivity у debug/AndroidManifest.xml. Її немає в release-маніфесті. Gradle автоматично включить потрібні джерела за flavor.
Корисні функції Debug Menu
Environment switcher. Найпотрібніша функція: переключення між Dev/Staging/Production без пересборки. Реалізація — UserDefaults/SharedPreferences з поточним середовищем, URLSessionConfiguration.default.protocolClasses або OkHttp interceptor читає його при кожному запиті. Після переключення — примусовий logout і перезапуск сесії.
Управління feature flags. Якщо використовується Firebase Remote Config або користувацька система флагів, Debug Menu дозволяє локально перевизначити значення флага. На Firebase це remoteConfig.setDefaults([key: value]) — локальні defaults перекривають віддалені значення.
Скидання стану. Кнопки: «Скинути онбординг», «Очистити кеш», «Скинути UserDefaults», «Видалити Keychain». Це прискорює тестування first-run потоків в 10 разів.
Інструменти для QA. Відображення поточного userId, device token (для push), версії API, environment-змінних. Кнопка «Скопіювати device token» — тестувальник одразу може відправити тестовий push через Firebase Console.
Симуляція помилок. Checkbox «Network error mode» — OkHttp/URLSession interceptor починає повертати помилки для всіх запитів. Перевіряємо, як додаток обробляє offline-стан без вимкнення Wi-Fi.
Приклад структури
DebugMenuScreen
├── Environment
│ ├── ● Dev (https://api-dev.example.com)
│ ○ Staging
│ ○ Production
├── Feature Flags
│ ├── new_checkout: [Remote] ON [Override] OFF ↺
│ └── ai_search: [Remote] OFF [Override] ON ↺
├── User
│ ├── User ID: abc-123 [Copy]
│ ├── Push Token: def-456 [Copy]
│ └── [Clear session]
├── Cache
│ ├── [Clear image cache] 482 MB
│ └── [Clear all caches]
└── Simulate
├── [Trigger push notification]
├── [Force network error]
└── [Crash app] ← для тестування Crashlytics
Доступ і безпека
Якщо Debug Menu потрібен у beta-збірках (TestFlight/Firebase App Distribution), але не у release — використовуйте окремий build configuration: Debug, Beta, Release. У конфігурації Beta компілюйте Debug Menu, але включайте pinning та інші production security заходи. Так тестувальник працює з майже-production конфігурацією, але з удобствами налагодження.
Ніколи не залишайте Debug Menu доступним через runtime-флаг у release (наприклад, if BuildConfig.VERSION_NAME.contains("beta")). Це обходиться елементарно.
Терміни
Базовий Debug Menu з environment switcher, управлінням флагів і скиданням стану — 2–3 дні. Розширений з симуляцією помилок і custom tools — близько 4 днів.







