Azimjon Abdurasulov

QA 14: Mobil ilovalarni testlash — iOS va Android farqlari, Simulator, ADB, TestFlight va checklist

🧪 QA Engineer — Zero to Hero

QA 14: Mobil ilovalarni testlash — iOS va Android farqlari, Simulator, ADB, TestFlight va checklist

Holat: 2026-yil oktabr. Dars Xcode 26.5 (iOS 26.5 Simulator), Android platform-tools (adb), TestFlight va Google Play testing track'lari asosida yozilgan. Barcha xcrun simctl buyruqlari Xcode 26.5'da haqiqiy simulatorda sinab ko'rilgan.

Bu darsdan keyin siz: mobil ilovani web ilovadan farqli ravishda — qurilmalar, tarmoq, uzilishlar, ruxsatlar va do'kon talablarini hisobga olib testlaysiz.

  • qurilmalar matritsasini analitika asosida tuzish;
  • simulator/emulator va real qurilmaning chegaralarini bilish;
  • 12 ta mobil yo'nalish bo'yicha checklist bilan ishlash;
  • xcrun simctl va adb bilan testni tezlashtirish (dark mode, katta shrift, deep link, push, joylashuv, SMS);
  • TestFlight va Google Play track'lari orqali beta build'larni olish;
  • mobil bug report'ni dasturchi bir urinishda qayta hosil qila oladigan qilib yozishni o'rganasiz.

Mundarija

  1. Mobil testlash nega alohida?
  2. Native, cross-platform va hybrid: testga ta'siri
  3. Qurilmalar matritsasi: qaysi qurilmalarda testlaymiz?
  4. Simulator, emulator va real qurilma
  5. Mobil test checklist: 12 yo'nalish
  6. iOS asboblari: Simulator va xcrun simctl
  7. Android asboblari: Emulator, adb va Developer options
  8. Beta tarqatish: TestFlight, Google Play va Firebase
  9. Cloud device farm'lar
  10. Do'kon talablari bilan bog'liq QA tekshiruvlari
  11. Mobil bug report
  12. Amaliy mashqlar
  13. O'zingizni tekshiring
  14. Xulosa
  15. Manbalar

1. Mobil testlash nega alohida? {#nega-alohida}

Web ilova brauzerda ishlaydi va yangi versiya serverga chiqqan zahoti hamma foydalanuvchiga yetadi. Mobil ilova esa foydalanuvchining telefoniga o'rnatiladi. U telefon resurslari, operatsion tizim qoidalari, tarmoq va hatto kiruvchi qo'ng'iroqlar bilan "birga yashaydi".

JihatWeb ilovaMobil ilova
YangilanishDeploy qilindi — hamma yangi versiyadaDo'kon review'i + foydalanuvchi yangilashi kerak; eski versiyalar oylab ishlaydi
MuhitBir nechta brauzerYuzlab model, OS versiyalari, ishlab chiqaruvchi qobiqlari (One UI, HyperOS...)
TarmoqKo'pincha barqarorWi-Fi ↔ LTE almashuvi, metro, lift, sekin 3G, butunlay offline
Hayot sikliTab ochiq yoki yopiqFon, old fon, OS xotira uchun ilovani o'ldiradi, holatni tiklash kerak
UzilishlarDeyarli yo'qQo'ng'iroq, SMS, push, past batareya ogohlantirishi
RuxsatlarKam (kamera, joylashuv)Kamera, rasm, joylashuv, bildirishnoma, kontaktlar — har birining "rad etish" holati
ApparatDeyarli yo'qKamera, GPS, biometrika (Face ID, barmoq izi), sensorlar
Debug vositalariDevToolsXcode, Android Studio, adb, Proxyman
TarqatishURLApp Store/Google Play, TestFlight, testing track'lar

Shulardan QA uchun eng muhim xulosa: mobil bug'ni "tez tuzatib qo'yib" bo'lmaydi. Agar v2.4.0 da to'lov ekrani buzilgan bo'lsa, tuzatilgan v2.4.1 do'kon review'idan o'tib, foydalanuvchi uni yangilaguncha muammo davom etadi. Shuning uchun mobil reliz oldidan testlash odatda web'dagidan chuqurroq bo'ladi.

🧠 Esda tuting: Server API o'zgarganda faqat yangi ilovani emas, eski versiyalarni ham tekshiring. DemoBozor v2.5 chiqqanda do'konda v2.3 va v2.4 foydalanuvchilari ham bor. Yangi backend ular uchun ham ishlashi yoki "Majburiy yangilash" (force update) ekranini to'g'ri ko'rsatishi kerak.


2. Native, cross-platform va hybrid: testga ta'siri {#ilova-turlari}

TurTexnologiyaQA uchun muhim jihat
NativeiOS: Swift (SwiftUI, UIKit); Android: Kotlin (Jetpack Compose, View)Har platformada alohida kod — bir xil funksiya iOS'da ishlab, Android'da buzilishi mumkin
Cross-platformFlutter, React Native, Kotlin/Compose MultiplatformUmumiy kod ko'p, lekin platforma farqlari (orqaga tugmasi, klaviatura, ruxsatlar) baribir bor
Hybrid / WebViewIlova ichida web sahifa (Capacitor, Cordova yoki native ilovadagi WebView ekranlar)Web xatolari (CSS, JS) mobil ichida; to'lov sahifasi ko'pincha WebView'da bo'ladi

Amaliy oqibatlari:

  • Identifikatorlar. Avtomatlashtirish uchun iOS'da accessibilityIdentifier, Android'da resource-id yoki Compose testTag, Flutter'da Semantics kerak bo'ladi (QA 22).
  • Proksi. Flutter ilovalar tizim proksisini ishlatmaydi, shuning uchun Proxyman bilan qo'shimcha sozlash kerak bo'ladi (QA 15).
  • WebView debug. iOS 16.4+ da WKWebView uchun isInspectable = true bo'lsa, Mac'dagi Safari'ning Develop menyusidan WebView'ni tekshirasiz. Android'da WebView.setWebContentsDebuggingEnabled(true) va Chrome'dagi chrome://inspect sahifasi ishlaydi.
  • Platforma xulqi. Android'da tizim "Orqaga" tugmasi/ishorasi bor, iOS'da chetdan surib orqaga qaytiladi (swipe-back). Ikkalasi ham alohida test qilinadi.

💡 Maslahat: "Bu Flutter, bitta kod — bitta platformada tekshirsak yetadi" degan gapga ishonmang. Ruxsat dialoglari, klaviatura, shriftlar, push va deep link har platformada OS tomonidan boshqariladi.


3. Qurilmalar matritsasi: qaysi qurilmalarda testlaymiz? {#qurilma-matritsasi}

Hamma qurilmada testlab bo'lmaydi (bu testlashning 2-printsipi — QA 2). Shuning uchun qurilmalar matritsasi tuziladi: qaysi model, qaysi OS va qaysi ekran o'lchamida qancha chuqurlikda testlash kerakligi yoziladi.

Ma'lumot qayerdan olinadi?

  1. O'z analitikangiz: App Store Connect Analytics, Google Play Console, Firebase Analytics — foydalanuvchilaringiz qaysi qurilma va OS'da ekanini ko'rsatadi. Bu eng ishonchli manba.
  2. Bozor statistikasi: yangi ilova uchun umumiy rasm.
  3. Mahsulot qarori: minimal qo'llab-quvvatlanadigan OS versiyasi (masalan, DemoBozor uchun xayoliy qaror — iOS 17+ va Android 9+).

🇺🇿 Mahalliy kontekst: StatCounter ma'lumotiga ko'ra 2026-yil sentabrda O'zbekistonda mobil OS ulushi: Android 82.28%, iOS 17.71%. Demak, mahalliy auditoriyali ilovada Android, ayniqsa byudjet va o'rta segment qurilmalari matritsada katta o'rin egallashi kerak. Global auditoriyada nisbat boshqacha bo'ladi — har doim o'z analitikangizga tayaning.

Darajali (tier) yondashuv

DarajaQaysi qurilmalarQanchalik chuqurQayerda
Tier 1Foydalanuvchilarning eng katta qismi ishlatadigan 4–6 modelTo'liq regression + yangi funksiyalarReal qurilmalar (ofisda)
Tier 2Keyingi muhim modellar, chekka ekranlar (eng kichik, eng katta, planshet)Smoke + asosiy ssenariylarSimulator/emulator, kerak bo'lsa cloud
Tier 3Eski OS, kam uchraydigan modellar, foldable'larReliz oldidan tanlabCloud device farm

DemoBozor uchun namunaviy matritsa (modellar faqat misol; o'zingiznikini analitikadan oling):

PlatformaQurilma (misol)OSNega tanlangan
iOSiPhone SE (3rd gen)iOS 17Eng kichik ekran, eng past qo'llab-quvvatlanadigan OS
iOSiPhone 13iOS 18Keng tarqalgan o'rta avlod
iOSiPhone 17 Pro MaxiOS 26Eng katta ekran, Dynamic Island, eng yangi OS
iOSiPad (A16)iPadOS 26Planshet layout, Split View
AndroidSamsung Galaxy A seriyasi (budjet)Android 14Ommaviy segment, One UI, kam RAM
AndroidXiaomi Redmi Note seriyasiAndroid 15HyperOS — fonda ilovani "agressiv" yopishi bilan mashhur
AndroidGoogle Pixel 8Android 16Toza Android, eng yangi API
AndroidEski Android 9 qurilmaAndroid 9Minimal qo'llab-quvvatlanadigan versiya

⚠️ Diqqat: Matritsani bir marta tuzib, unutib qo'ymang. Har chorakda analitikani yangilang. Yangi iPhone yoki yangi Android versiyasi chiqqanda ham ko'rib chiqing.


4. Simulator, emulator va real qurilma {#simulator-vs-real}

  • iOS Simulator — Mac'da iOS muhitini simulyatsiya qiladi. U ARM qurilmaning nusxasi emas, Mac protsessorida ishlaydi.
  • Android Emulator — virtual Android qurilma (AVD) ishga tushiradi.
ImkoniyatSimulator / EmulatorReal qurilma
UI, layout, navigatsiya, ko'p biznes mantiq✅ Tez va arzon✅
Dark mode, shrift o'lchami, til✅ (simctl ui, sozlamalar)✅
Deep link, push simulyatsiyasi, joylashuv✅ (simctl openurl/push/location, emulator console)✅
Kamera, NFC, Bluetooth❌ yoki cheklangan✅
Haqiqiy unumdorlik, isish, batareya sarfi❌ (Mac resurslari boshqacha)✅
Haqiqiy uyali tarmoq, operator, signal yo'qolishi❌ (faqat simulyatsiya)✅
Biometrika (Face ID, barmoq izi)Simulyatsiya (Enrolled / Matching / Non-matching)✅ Haqiqiy
Ishlab chiqaruvchi qobig'i (One UI, HyperOS) va batareya optimizatsiyasi❌✅
TestFlight/Play'dan o'rnatish oqimi❌✅

Qoida: kundalik ish va avtomatik testlar simulator/emulatorda, reliz oldidan esa Tier 1 real qurilmalarda asosiy ssenariylar bajariladi.


5. Mobil test checklist: 12 yo'nalish {#yonalishlar}

Mobil testlash xaritasi: 12 ta yo'nalish — o'rnatish, hayot sikli, uzilishlar, ruxsatlar, tarmoq va boshqalar

Quyidagi checklist DemoBozor misolida yozilgan. Uni o'z loyihangizga moslang va har relizda ishlating (QA 7).

5.1 O'rnatish, yangilash va o'chirish

  • Toza o'rnatish (fresh install): onboarding, ruxsat so'rovlari, birinchi kirish.
  • Yangilash (update) v2.4 → v2.5: foydalanuvchi tizimdan chiqib ketmaydi, savatcha va sozlamalar saqlanadi, lokal DB migratsiyasi xatosiz o'tadi. Fresh install va update — turli kod yo'llari, ikkalasi ham test qilinadi.
  • Majburiy yangilash: server "minimal versiya 2.5" desa, eski ilova tushunarli ekran ko'rsatadi va do'konga yo'naltiradi.
  • O'chirib qayta o'rnatish: iOS'da Keychain'dagi ma'lumot qolishi mumkin — kutilgan xulqmi?
  • Joy kam: telefon xotirasi to'la bo'lsa, o'rnatish yoki yuklab olish xabari tushunarlimi.

5.2 Hayot sikli (lifecycle)

  • Ilovani fonga o'tkazib, 1 daqiqa va 30 daqiqadan keyin qaytarish: ekran va kiritilgan ma'lumot joyidami?
  • OS xotira uchun ilovani o'ldirsa (process death): qaytganda ilova to'g'ri tiklanadimi yoki ochiq to'lov ekranida crash bo'ladimi?
  • Android'da Don't keep activities (Developer options) yoqilganda har bir ekranga kirib-chiqish.
  • Ekran qulflanib, qayta ochilganda sessiya va taymerlar (SMS kod 120 soniyasi) to'g'ri ishlaydimi.

5.3 Uzilishlar (interruptions)

DemoBozor'ning eng nozik joylari — SMS kod kiritish va to'lov ekranlari:

  • SMS kod kiritayotganda kiruvchi qo'ng'iroq — qo'ng'iroqdan keyin kod maydoni va taymer holati;
  • to'lov tasdiqlanayotganda push keladi va foydalanuvchi uni bosadi — to'lov natijasi yo'qolmaydimi;
  • past batareya ogohlantirishi, budilnik, Control Center yoki Notification Center ochilishi;
  • boshqa ilovaga o'tib (masalan, SMS kodni ko'chirish uchun) qaytish.

5.4 Ruxsatlar (permissions)

Har bir ruxsat uchun kamida 5 holat: birinchi so'rov, ruxsat berish, rad etish, bir martalik ruxsat, keyin Sozlamalardan o'zgartirish.

RuxsatDemoBozor'da qayerdaMuhim nuans
BildirishnomaBuyurtma holati push'lariAndroid 13+ da alohida runtime ruxsat (POST_NOTIFICATIONS)
JoylashuvYetkazib berish manziliiOS: "Allow Once", aniq/taxminiy joylashuv; Android 12+: taxminiy joylashuv tanlovi
KameraProfil rasmi, sharhga rasmRad etilsa, Sozlamalarga yo'naltiruvchi tushuntirish kerak
RasmlarSharhga rasm qo'shishiOS: cheklangan (tanlangan rasmlar) kirish

⚠️ Diqqat: iOS'da foydalanuvchi ilova ochiq turganda Sozlamalardan ruxsatni o'zgartirsa, tizim ilovani yopishi mumkin (simctl privacy yordamida ham shunday ogohlantirish bor). Qaytganda ilova xatosiz qayta ishga tushishi kerak.

5.5 Tarmoq

  • Ilova offline holatda ochiladi: bo'sh oq ekran emas, tushunarli xabar va "Qayta urinish" bo'lishi kerak.
  • So'rov o'rtasida aloqa uziladi: buyurtma yarim yo'lda qolsa nima bo'ladi?
  • Wi-Fi ↔ LTE almashuvi rasm yuklash paytida.
  • Sekin 3G: skeleton/loader, timeout, tugmani qayta-qayta bosish.
  • Dublikat buyurtma: foydalanuvchi sekin tarmoqda "Buyurtma berish"ni uch marta bosdi. Nechta buyurtma yaratildi?
  • Captive portal (mehmonxona yoki kafe Wi-Fi'si, login sahifasi bilan).

Sekin tarmoqni yaratish: Proxyman Network Conditions (QA 15), Apple'ning Network Link Conditioner vositasi yoki Android emulator console (network speed, network delay).

5.6 Push va deep link

  • Push ilova ochiq, fonda va butunlay yopiq holatda keladi — har birida bosilganda to'g'ri ekran ochiladimi?
  • demobozor://orders/1043 deep link: foydalanuvchi tizimga kirmagan bo'lsa, avval login, keyin aynan shu buyurtmaga o'tadimi?
  • Universal link (iOS) / App Link (Android): https://demobozor.example/product/42 havolasi brauzerda emas, ilovada ochiladimi?
  • Noto'g'ri parametrlar: demobozor://product/abc, mavjud bo'lmagan ID — crash emas, "topilmadi" ekrani.

5.7 Ekran va orientatsiya

  • Eng kichik ekran (iPhone SE): tugmalar klaviatura ostida qolmaydimi, matn kesilmaydimi?
  • Eng katta ekran va planshet: layout cho'zilib xunuk bo'lmaydimi?
  • Notch va Dynamic Island: kontent "xavfsiz hudud"dan (safe area) chiqmaydimi?
  • Gorizontal holat (agar qo'llab-quvvatlansa), iPad'da Split View, foldable'larda ochish-yopish.

5.8 Imo-ishora va klaviatura

  • iOS swipe-back, Android tizim "Orqaga" ishorasi: forma ma'lumoti yo'qolmaydimi, ogohlantirish chiqadimi?
  • Pull-to-refresh, uzoq bosish, ikki marta bosish.
  • Klaviatura turi: telefon uchun raqamli, email uchun @ bor klaviatura.
  • SMS kodni avtomatik to'ldirish: iOS'da textContentType = .oneTimeCode, Android'da SMS Retriever yoki SMS User Consent API.
  • O'zbek lotin harflari (o', g' yoki oʻ, gʻ), kirill va emoji kiritish (QA 25).

5.9 Ko'rinish va accessibility

  • Dark mode: matn va fon kontrasti, rasmlar va logotiplar ko'rinishi.
  • Eng katta shrift (iOS Dynamic Type, Android font scale — Android 14 dan 200% gacha): matn kesilmaydimi, tugmalar ishlaydimi?
  • VoiceOver/TalkBack: tugmalar nomi o'qiladimi ("tugma, Savatchaga qo'shish")?
  • Reduce Motion, Bold Text, Increase Contrast.

5.10 Til, sana va vaqt

  • O'zbek (lotin/kirill), rus, ingliz: uzun matnlar, ko'plik shakllari.
  • Narx formati: 300 000 so'm, bo'shliq bilan ajratish.
  • Vaqt zonasi: telefonni Toshkent (UTC+5) dan boshqa zonaga o'tkazing — buyurtma vaqti, promo-kod muddati, SMS taymeri to'g'ri hisoblanadimi?
  • Qurilma sanasini qo'lda o'zgartirish: muddati o'tgan promo-kod "tirilib" qolmaydimi?

5.11 Unumdorlik va resurslar

  • Sovuq ishga tushish (cold start) vaqti — Tier 1 qurilmalarda o'lchanadi.
  • Uzun katalog scroll'ida qotish (jank).
  • Xotira: 50 ta mahsulotli savatcha va ko'p rasm — crash yo'qmi? Simulator'da Debug → Simulate Memory Warning.
  • Batareya va trafik sarfi (fonda keraksiz so'rovlar).
  • Batafsil — QA 23.

5.12 Xavfsizlik asoslari

  • Logout'dan keyin token o'chadimi, orqaga tugmasi bilan himoyalangan ekranga qaytib bo'lmaydimi?
  • App switcher'dagi ilova skrinshotida karta raqami yoki SMS kod ko'rinmaydimi?
  • Token va shaxsiy ma'lumot UserDefaults/SharedPreferences da ochiq saqlanmaydimi (Keychain/Keystore kerak)?
  • Release build'da test sozlamalari, staging URL'lar va debug menyusi qolib ketmaganmi?
  • Batafsil — QA 24.

6. iOS asboblari: Simulator va xcrun simctl {#ios-asboblar}

Simulator menyusi (QA uchun eng foydalilari)

MenyuBuyruqQA'dagi foydasi
DeviceRotate Left / Rotate RightOrientatsiya
DeviceShake"Shake to report" kabi funksiyalar
DeviceHome, Lock, RestartFon/qulf holatlari
DeviceErase All Content and SettingsToza holatdan boshlash
FeaturesFace ID → Enrolled / Matching Face / Non-matching FaceBiometrik kirishning muvaffaqiyatli va muvaffaqiyatsiz holatlari
FeaturesLocation → Custom LocationYetkazib berish hududi
FeaturesToggle AppearanceLight/Dark
FeaturesIncrease / Decrease Preferred Text SizeDynamic Type
DebugSimulate Memory WarningXotira bosimi
DebugOpen System LogLoglar

xcrun simctl — terminaldan boshqarish

simctl Xcode bilan birga keladi. Quyidagi buyruqlar Xcode 26.5 da haqiqiy simulatorda sinab ko'rilgan. booted so'zi "hozir ishlab turgan simulator" degani; bir nechta simulator ochiq bo'lsa, xcrun simctl list devices dan UDID olib ishlating.

# Qurilmalar ro'yxati va simulatorni ishga tushirish
xcrun simctl list devices available
xcrun simctl boot "iPhone 17"            # nomi yoki UDID
open -a Simulator                         # oynani ko'rsatish

# Ilovani o'rnatish va test argumentlari bilan ochish
xcrun simctl install booted ~/Downloads/DemoBozor.app
xcrun simctl launch booted uz.demobozor.app -uiTesting

# Dark mode va eng katta shrift (Dynamic Type)
xcrun simctl ui booted appearance dark
xcrun simctl ui booted content_size accessibility-extra-extra-extra-large

# "Toza" status bar: 9:41, to'liq batareya (skrinshotlar uchun)
xcrun simctl status_bar booted override --time "9:41" --batteryState charged --batteryLevel 100 --cellularBars 4 --wifiBars 3
xcrun simctl status_bar booted clear      # qaytarish

# Joylashuv: Toshkent (format: kenglik,uzunlik)
xcrun simctl location booted set 41.2995,69.2401

# Deep link va universal link
xcrun simctl openurl booted "demobozor://orders/1043"
xcrun simctl openurl booted "https://demobozor.example/product/42"

# Ruxsatlar: berish, olib qo'yish, qayta so'rash
xcrun simctl privacy booted grant location uz.demobozor.app
xcrun simctl privacy booted revoke photos uz.demobozor.app
xcrun simctl privacy booted reset all uz.demobozor.app

# Skrinshot va video (video: Ctrl+C bilan to'xtatasiz)
xcrun simctl io booted screenshot ~/Desktop/DB-1043.png
xcrun simctl io booted recordVideo ~/Desktop/DB-1043.mov

# Ilova ma'lumotlari papkasi (lokal DB, UserDefaults fayllari)
xcrun simctl get_app_container booted uz.demobozor.app data

# Buferga SMS kod qo'yish (paste testi uchun)
echo "482913" | xcrun simctl pbcopy booted

⚠️ Diqqat: simctl privacy ruxsat oynasini chetlab o'tadi. Hujjat ham ogohlantiradi: bu Info.plist'dagi tavsif matnlari yo'qligi kabi xatolarni yashirib qo'yishi mumkin. Ruxsat oqimini testlayotganda qo'lda, haqiqiy dialog bilan tekshiring.

Push bildirishnomani simulyatsiya qilish

Payload JSON fayl bo'lishi, aps kalitini o'z ichiga olishi va 4096 baytdan oshmasligi kerak. Simulator Target Bundle kaliti bo'lsa, buyruqda bundle ID shart emas:

{
  "Simulator Target Bundle": "uz.demobozor.app",
  "aps": {
    "alert": {
      "title": "Buyurtma #1043 yo'lda",
      "body": "Kuryer 30 daqiqada yetib keladi"
    },
    "sound": "default",
    "badge": 1
  },
  "orderId": 1043,
  "deeplink": "demobozor://orders/1043"
}
xcrun simctl push booted push-order-shipped.json

Endi uch holatni tekshiring: ilova ochiq (banner yoki ilova ichidagi xabar), fonda (bosilganda buyurtma ekrani) va yopiq (ilova ochilib, aynan #1043 ko'rinadi).

Real iPhone bilan ishlash

  • Developer Mode (iOS 16+): Xcode'dan to'g'ridan-to'g'ri o'rnatilgan build'lar uchun Settings → Privacy & Security → Developer Mode. TestFlight build'lari uchun shart emas.
  • Loglar: qurilmani Mac'ga ulang va Console.app da qurilmani tanlang. Xcode'da esa Window → Devices and Simulators.
  • Network Link Conditioner: Developer Mode yoqilgan qurilmada Settings → Developer ichida bo'ladi. Unda 3G, "100% Loss" kabi profillar bor.
  • Accessibility Inspector: Xcode → Open Developer Tool → Accessibility Inspector — elementlarning nomi va identifikatorini ko'rsatadi.
  • Ekranni yozish: iOS Control Center'dagi Screen Recording — bug report uchun eng qisqa yo'l.

7. Android asboblari: Emulator, adb va Developer options {#android-asboblar}

Emulator

Android Studio → Device Manager orqali virtual qurilma (AVD) yaratasiz. Kerakli API darajasi va image turini (Google APIs yoki Google Play) tanlaysiz. Emulator oynasidagi Extended controls bo'limida joylashuv, uyali tarmoq, batareya, qo'ng'iroq/SMS, virtual sensorlar va barmoq izi simulyatsiyasi bor.

adb — Android Debug Bridge

adb Android SDK Platform Tools tarkibida keladi (macOS'da brew install android-platform-tools bilan ham o'rnatiladi). Quyidagi buyruqlar rasmiy hujjatga asoslangan:

# Ulangan qurilmalar (emulator ham)
adb devices -l

# Bir nechta qurilma bo'lsa: -s <serial>
adb -s emulator-5554 install -r app-staging-debug.apk   # -r: ma'lumotni saqlab qayta o'rnatish

# O'chirish
adb uninstall uz.demobozor.app

# Deep link (rasmiy sintaksis: -W kutish, -a action, -d URI, keyin paket nomi)
adb shell am start -W -a android.intent.action.VIEW -d "demobozor://orders/1043" uz.demobozor.app

# Ilovani majburan to'xtatish va fondagi jarayonni o'ldirish (process death testi)
adb shell am force-stop uz.demobozor.app
adb shell am kill uz.demobozor.app       # ilova fonda bo'lsin

# Ruxsatlarni berish va olib qo'yish (Android 6.0+)
adb shell pm grant uz.demobozor.app android.permission.CAMERA
adb shell pm revoke uz.demobozor.app android.permission.ACCESS_FINE_LOCATION

# Skrinshot: to'g'ridan-to'g'ri kompyuterga
adb exec-out screencap -p > DB-1043.png

# Video: maksimal 180 soniya (3 daqiqa); Ctrl+C bilan to'xtatiladi
adb shell screenrecord --time-limit 60 /sdcard/DB-1043.mp4
adb pull /sdcard/DB-1043.mp4 .

# Loglar: faqat ogohlantirish va xatolar
adb logcat "*:W"
adb logcat -v time > DB-1043-logcat.txt

💡 Maslahat: Logcat juda shovqinli. Bug'ni qayta hosil qilishdan oldin adb logcat -c bilan eski loglarni tozalang, keyin faqat kerakli qismini faylga yozing.

Emulator console: qo'ng'iroq, SMS, batareya, tarmoq

adb emu orqali emulatorga "tashqi dunyo" hodisalarini yuborasiz:

# Kiruvchi qo'ng'iroq (SMS kod ekranida!)
adb emu gsm call 998901234567

# SMS kelishi (OTP oqimini tekshirish)
adb emu sms send 3700 "DemoBozor kodi: 482913"

# Batareya 5% va quvvatdan uzilgan
adb emu power capacity 5
adb emu power ac off

# Sekin tarmoq va kechikish
adb emu network speed edge
adb emu network delay gprs

# Joylashuv: E'TIBOR — avval UZUNLIK (longitude), keyin KENGLIK (latitude)
adb emu geo fix 69.2401 41.2995

⚠️ Diqqat: geo fix da tartib simctl location dagidan teskari: avval uzunlik, keyin kenglik. Toshkentni teskari kiritsangiz, qurilma Hind okeani tomonga "uchib ketadi" va "yetkazib berish hududidan tashqarida" degan yolg'on bug chiqadi.

Developer options

Settings → About phone → Build number ni 7 marta bosing — "You are now a developer!" chiqadi. QA uchun eng foydali sozlamalar:

SozlamaNima uchun
Don't keep activitiesHar bir ekrandan chiqqanda activity yo'q qilinadi — holatni tiklash bug'larini topadi
Background process limitFondagi jarayonlarni cheklab, xotira bosimini simulyatsiya qiladi
Show taps, Pointer LocationEkran videosida bosilgan joylar ko'rinadi — bug report uchun qulay
Window / Transition animation scaleAnimatsiyalarni sekinlashtirib, vizual xatolarni ko'rish; avtomatik testlarda o'chirish
Force RTL layout directionO'ngdan-chapga tillar uchun layout testi
Wireless debuggingKabelsiz adb (adb pair ip:port, Android 11+)

WebView ichini tekshirish

Ilovadagi WebView debuggable bo'lsa, Chrome'da chrome://inspect ni ochib, sahifani DevTools bilan tekshirasiz. To'lov sahifasi WebView'da bo'lsa, bu ayniqsa foydali.


8. Beta tarqatish: TestFlight, Google Play va Firebase {#beta}

QA'ga build bir necha yo'l bilan yetadi. Har birining qoidalarini bilish testlarni rejalashtirishda kerak bo'ladi.

TestFlight (iOS)

ParametrQiymat (Apple hujjati)
Ichki testerlar100 tagacha (App Store Connect foydalanuvchilari)
Tashqi testerlar10 000 tagacha
Build amal qilish muddati90 kun
Tashqi test uchun reviewGuruhga qo'shilgan birinchi build App Review'dan o'tadi; keyingilari to'liq review talab qilmasligi mumkin
Bir tester qurilmalari30 tagacha qurilmada

QA uchun TestFlight odatlari:

  • build raqamini (masalan, 2.4.0 (1287)) har bir bug report'ga yozing;
  • "What to Test" maydonida testerlarga nimani tekshirish kerakligini yozing;
  • TestFlight ilovasidagi skrinshot bilan yuboriladigan fikr va crash hisobotlarini kuzatib boring;
  • muddati tugayotgan build'larda test qilmang — 90 kun o'tsa, build ochilmay qoladi.

Google Play testing track'lari

TrackKim uchunMuhim faktlar
Internal testingJamoa ichida tezkor test100 tagacha tester; yangi build daqiqalar ichida chiqadi
Closed testingTanlangan testerlar guruhiEmail ro'yxatlari yoki Google Groups orqali
Open testingHamma qo'shila oladigan betaDo'kon sahifasida ko'rinadi

🇺🇿 Mahalliy kontekst: 2023-yil 13-noyabrdan keyin ochilgan shaxsiy Google Play developer akkauntlari ilovani production'ga chiqarishdan oldin closed test o'tkazishi shart: kamida 12 tester, ketma-ket 14 kun davomida testga qo'shilgan bo'lishi kerak. Freelance yoki shaxsiy loyiha qilsangiz, bu muddatni reliz rejasiga qo'shing.

Firebase App Distribution

iOS va Android build'larini do'konsiz testerlarga tarqatish xizmati. Testerlar email orqali taklif oladi. CI (masalan, Fastlane — DevOps 2: Fastlane chuqur amaliyot) bilan bog'lash qulay.


9. Cloud device farm'lar {#cloud-farm}

Ofisda 50 ta telefon saqlash qimmat. Cloud device farm'lar internet orqali yuzlab real qurilmani ijaraga beradi:

XizmatNima beradi
BrowserStack (App Live, App Automate)Qo'lda va avtomatik test, real iOS/Android qurilmalar
Sauce Labs (Real Device Cloud)Real qurilmalar, Appium 3 qo'llab-quvvatlanadi
TestMu AI (2026-yil yanvarigacha LambdaTest nomi bilan tanilgan)Real qurilmalar va brauzerlar buluti
AWS Device FarmAWS ichida real qurilmalarda test
Firebase Test LabAndroid (va iOS) real hamda virtual qurilmalarda test

Qachon kerak:

  • muammo faqat ma'lum modelda chiqyapti, lekin u model ofisda yo'q;
  • reliz oldidan Tier 3 qurilmalarda smoke test;
  • avtomatik testlarni ko'p qurilmada parallel ishga tushirish (QA 22).

⚠️ Diqqat: Cloud qurilmalarga test hisoblarini kiritasiz, ilova esa uchinchi tomon serverida turadi. Prod ma'lumotlari va haqiqiy karta raqamlarini ishlatmang, faqat staging va test kartalardan foydalaning.


10. Do'kon talablari bilan bog'liq QA tekshiruvlari {#dokon}

Review'da rad etilish relizni bir necha kunga kechiktiradi. Ko'p rad etishlar esa QA bosqichida oldini olsa bo'ladigan xatolar. Batafsil — App Store Submission darsida.

Apple App Store uchun QA checklist:

  • Crash va chala funksiyalar yo'q: "Tez kunda" degan bo'sh ekranlar, ishlamaydigan tugmalar, placeholder matnlar qolmagan.
  • Ruxsat tavsiflari: har bir ruxsat uchun Info.plist'da tushunarli NS...UsageDescription matni bor. Tavsifsiz himoyalangan resursga murojaat qilish ilovani crash qiladi.
  • Hisobni o'chirish (Guideline 5.1.1(v)): akkaunt yaratish mumkin bo'lgan ilovada foydalanuvchi hisobini ilova ichidan o'chirishni boshlay olishi shart. Bu talab 2022-yil 30-iyundan amal qiladi. Faqat "vaqtincha o'chirish" yetarli emas. O'chirish web'da yakunlansa, ilovada aynan o'sha sahifaga to'g'ridan-to'g'ri havola bo'lishi kerak.
  • Demo akkaunt: review uchun App Store Connect'dagi App Review Information bo'limiga ishlaydigan test login (va kerak bo'lsa test SMS kod) kiritilgan. Uni QA tekshiradi.
  • Havolalar: maxfiylik siyosati, foydalanish shartlari va qo'llab-quvvatlash sahifalari ochiladi.

Google Play uchun:

  • Data safety bo'limi ilovaning haqiqiy xulqiga mos (qaysi ma'lumot yig'iladi va kimga uzatiladi);
  • shaxsiy akkaunt bo'lsa — closed test talabi (8-bo'lim);
  • release build'da debug sozlamalari yo'q (masalan, foydalanuvchi sertifikatlariga ishonish — QA 15).

11. Mobil bug report {#mobil-bug-report}

Mobil bug report'da web'dagidan ko'ra ko'proq kontekst kerak (QA 8):

MaydonMisol
QurilmaiPhone 13 (real) / Pixel 8 emulator
OSiOS 26.5 / Android 16
Ilova versiyasi va build2.4.0 (1287), TestFlight
Muhitstaging (staging-api.demobozor.example)
TarmoqWi-Fi / LTE / 3G (Network Link Conditioner), VPN bor/yo'q
Til va hududO'zbek (lotin), Asia/Tashkent
Hisob turiOddiy xaridor, Premium a'zo
Takrorlanish5 urinishdan 3 tasida
DalillarEkran videosi, Console/logcat, Proxyman HAR (maskalangan), Crashlytics/Sentry crash ID

Namuna:

Sarlavha: [iOS][To'lov] Qo'ng'iroq uzilishidan keyin to'lov ekrani oq bo'lib qoladi (2.4.0)

Muhit: iPhone 13, iOS 26.5, DemoBozor 2.4.0 (1287) TestFlight, staging, Wi-Fi
Shart: Savatchada 1 ta "Choynak (elektr)" (189 000 so'm), Humo karta tanlangan

Qadamlar:
1. Savatcha → "Buyurtma berish" → "To'lash" ni bosing.
2. To'lov sahifasi yuklanayotganda boshqa telefondan shu raqamga qo'ng'iroq qiling.
3. Qo'ng'iroqni rad eting va ilovaga qayting.

Kutilgan natija: To'lov sahifasi qayta yuklanadi yoki "To'lov holati tekshirilmoqda" ko'rinadi.
Haqiqiy natija: Oq ekran; "Orqaga" bosilsa savatcha bo'sh, buyurtma #1043 "To'lov kutilmoqda" holatida qoladi.

Takrorlanish: 5/5 (real qurilmada). Simulator'da qo'ng'iroq simulyatsiyasi yo'q.
Dalillar: DB-1043.mov (ekran videosi), DB-1043-console.log, DB-1043.masked.har
Jiddiylik: Critical | Ustuvorlik: P1

💡 Maslahat: Video — mobil bug report'ning eng kuchli dalili. 20–40 soniyalik qisqa video bitta paragraf tavsifdan ko'ra ko'proq narsani ko'rsatadi: ekranlar ketma-ketligi, bosilgan joylar (Android'da Show taps yoqing) va natija.


12. Amaliy mashqlar {#mashqlar}

Mashq 1: Qurilmalar matritsasi

DemoBozor'ning (xayoliy) oylik analitikasi: Android 81% (Samsung A-seriya 34%, Redmi 22%, boshqa 25%), iOS 19% (iPhone 11–13: 9%, iPhone 14–16: 7%, iPhone 17: 3%). Minimal versiyalar: iOS 17, Android 9. Ofisda 6 ta real qurilma olishga ruxsat bor. Qaysilarini olasiz va nega?

<details> <summary>💡 Javobni ko'rish</summary>

Namuna yechim (ulushga mutanosib, lekin chekka holatlar ham qamrab olingan):

#QurilmaSabab
1Samsung Galaxy A seriyasi (budjet), Android 14Eng katta segment (34%)
2Xiaomi Redmi Note, Android 15 (HyperOS)22%, fondagi agressiv cheklovlar
3Eski Android 9 qurilma (kam RAM)Minimal versiya va zaif apparat
4Google Pixel (eng yangi Android)Yangi API va ruxsat o'zgarishlari birinchi shu yerda chiqadi
5iPhone 12 yoki 13, iOS 17iOS'dagi eng katta guruh + minimal iOS
6iPhone 17, iOS 26Eng yangi OS va Dynamic Island

Planshet va foldable'lar Tier 3 — cloud device farm orqali. Asosiy fikr: ulush bo'yicha tanlang, lekin minimal versiya va eng yangi versiyani albatta qo'shing.

</details>

Mashq 2: SMS kod ekranidagi uzilishlar

DemoBozor'da SMS kod 120 soniya amal qiladi, qayta yuborish 60 soniyadan keyin. Kod kiritish ekrani uchun kamida 6 ta uzilish va hayot sikli test g'oyasini yozing.

<details> <summary>💡 Javobni ko'rish</summary>

  1. Kod kiritilayotganda kiruvchi qo'ng'iroq → qaytganda taymer davom etadi (pauza bo'lib qolmaydi), kiritilgan raqamlar saqlanadi.
  2. SMS'ni ko'rish uchun Messages ilovasiga o'tib qaytish → ekran qayta yuklanmaydi, avtomatik to'ldirish ishlaydi.
  3. Ilovani 3 daqiqaga fonga o'tkazish → qaytganda "Kod muddati tugadi, qayta yuboring" holati.
  4. Fonda turganda OS ilovani o'ldiradi → qaytganda telefon raqami ekraniga to'g'ri qaytish (yoki holat tiklanishi).
  5. Ekranni qulflab ochish → taymer real vaqtga mos.
  6. Kod kiritayotganda push keladi va foydalanuvchi uni bosadi → login oqimi buzilmaydi, qaytish mumkin.
  7. Qurilma vaqtini qo'lda 5 daqiqa oldinga surish → kod muddati server vaqti bo'yicha tekshiriladi (bypass qilinmaydi).
  8. Offline holatda "Kodni qayta yuborish" → tushunarli xato, 60 soniyalik cheklov buzilmaydi.

</details>

Mashq 3: Skrinshotga tayyor simulator

Bitta skript yozing: simulatorni dark mode va eng katta shriftga o'tkazsin, status bar'ni 9:41 va to'liq batareyaga o'rnatsin, deep link bilan demobozor://product/42 ni ochsin va skrinshot olsin. Oxirida sozlamalarni qaytarsin.

<details> <summary>💡 Javobni ko'rish</summary>

#!/bin/bash
set -e
DEVICE=booted

xcrun simctl ui $DEVICE appearance dark
xcrun simctl ui $DEVICE content_size accessibility-extra-extra-extra-large
xcrun simctl status_bar $DEVICE override --time "9:41" --batteryState charged --batteryLevel 100
xcrun simctl openurl $DEVICE "demobozor://product/42"
sleep 3
xcrun simctl io $DEVICE screenshot ~/Desktop/product-42-dark-xxxl.png

# Holatni qaytarish
xcrun simctl status_bar $DEVICE clear
xcrun simctl ui $DEVICE content_size large
xcrun simctl ui $DEVICE appearance light

large — iOS'dagi standart shrift o'lchami. sleep 3 ekran ochilishini kutish uchun; avtomatik testlarda buning o'rniga element paydo bo'lishini kutish yaxshiroq (QA 22).

</details>

Mashq 4: Android'da deep link va Samarqand

Emulatorda (1) demobozor://product/42 deep link'ini oching, (2) joylashuvni Samarqandga (kenglik 39.6542, uzunlik 66.9597) o'rnating, (3) kiruvchi SMS kodni simulyatsiya qiling.

<details> <summary>💡 Javobni ko'rish</summary>

adb shell am start -W -a android.intent.action.VIEW -d "demobozor://product/42" uz.demobozor.app
adb emu geo fix 66.9597 39.6542        # avval uzunlik, keyin kenglik!
adb emu sms send 3700 "DemoBozor kodi: 482913"

Eng ko'p uchraydigan xato — geo fix 39.6542 66.9597 deb yozish. Bu Samarqand emas, butunlay boshqa joy bo'ladi.

</details>

Mashq 5: Kamera ruxsati

DemoBozor'da profil rasmini kamera bilan olish mumkin. iOS va Android uchun ruxsat ssenariylari jadvalini tuzing (holat → kutilgan natija).

<details> <summary>💡 Javobni ko'rish</summary>

#HolatKutilgan natija
1Birinchi marta "Rasm olish"Tizim dialogi; undan oldin ilova nega kerakligini tushuntiradi
2Ruxsat berildiKamera ochiladi, rasm saqlanadi
3Rad etildiIlova crash bo'lmaydi; "Sozlamalarda ruxsat bering" xabari va Sozlamalarga o'tish tugmasi
4Rad etilgandan keyin yana bosishiOS qayta dialog ko'rsatmaydi — ilova Sozlamalarga yo'naltiradi; Android'da ikki marta rad etilgach ham shunday
5Sozlamalarda ruxsat yoqildi va ilovaga qaytildiKamera endi ishlaydi (iOS ilovani qayta ishga tushirgan bo'lishi mumkin — crash emas)
6Ruxsat ilova ochiq turganda olib qo'yildiIlova to'g'ri xulq qiladi, ma'lumot yo'qolmaydi
7Kamerasiz qurilma yoki simulator"Galereyadan tanlash" varianti qoladi

</details>

Mashq 6: Simulator yetadimi?

Har bir testni "Simulator/Emulator yetarli" yoki "Real qurilma shart" deb ajrating: (a) Dark mode'da savatcha, (b) NFC bilan to'lov, (c) 3G'da katalog skeleton'i, (d) metroda signal yo'qolganda buyurtma, (e) Face ID muvaffaqiyatsiz bo'lganda parol so'rash, (f) 30 daqiqalik ishlatishdan keyin qurilma isishi, (g) Xiaomi'da fondagi push.

<details> <summary>💡 Javobni ko'rish</summary>

  • (a) Simulator yetarli.
  • (b) Real qurilma (NFC).
  • (c) Simulator + Proxyman Network Conditions yetarli; reliz oldidan real qurilmada bir marta.
  • (d) Real qurilma — haqiqiy tarmoq almashuvi va signal yo'qolishi.
  • (e) Simulator'da Non-matching Face bilan tekshirsa bo'ladi; real qurilmada ham bir marta.
  • (f) Real qurilma — isish va unumdorlik.
  • (g) Real qurilma — ishlab chiqaruvchi batareya optimizatsiyasi emulatorda yo'q.

</details>

Mashq 7: Bug report yozing

Tester shunday dedi: "Android'da kartaga mahsulot qo'shib, telefonni gorizontal qilsam savatcha nolga tushadi." Mobil bug report sarlavhasi, muhit, qadamlar va natijalarni yozing (qurilma: Galaxy A seriya, Android 14, ilova 2.4.0 (1287), staging).

<details> <summary>💡 Javobni ko'rish</summary>

Sarlavha: [Android][Savatcha] Ekran gorizontal holatga burilganda savatcha bo'shab qoladi (2.4.0)

Muhit: Samsung Galaxy A seriya, Android 14, DemoBozor 2.4.0 (1287), staging, Wi-Fi, uz-Latn
Shart: Avtomatik burilish yoqilgan, foydalanuvchi tizimga kirgan

Qadamlar:
1. Katalog → "Paxta ko'ylak" → "Savatchaga qo'shish" (soni: 2).
2. Savatcha ekranini oching — 2 ta mahsulot ko'rinadi.
3. Telefonni gorizontal holatga buring.

Kutilgan natija: Savatchada 2 ta mahsulot qoladi, layout gorizontalga moslashadi.
Haqiqiy natija: Savatcha "Bo'sh" ko'rsatiladi; qayta vertikal qilinsa ham bo'sh. Server'da savatcha saqlangan
(GET /api/v1/cart → 2 ta mahsulot, Proxyman bilan tekshirildi) — muammo ilovaning holatni saqlashida.

Takrorlanish: 4/4. iOS'da takrorlanmadi.
Dalillar: video (Show taps yoqilgan), logcat, Proxyman so'rov/javob skrinshoti
Jiddiylik: Major | Ustuvorlik: P2

Muhim jihatlar: platforma va modul sarlavhada; "Don't keep activities" bilan ham takrorlanishini tekshirish foydali — sabab activity qayta yaratilganda holat yo'qolishi bo'lishi mumkin.

</details>


13. O'zingizni tekshiring {#checklist}

  • [ ] Web va mobil testlash farqini 5 ta misol bilan tushuntira olaman
  • [ ] Qurilmalar matritsasini analitika asosida tuza olaman
  • [ ] Simulator yetadigan va real qurilma shart bo'lgan testlarni ajrata olaman
  • [ ] 12 yo'nalishli mobil checklist'ni o'z loyihamga moslay olaman
  • [ ] simctl bilan dark mode, shrift, deep link, push, joylashuv va ruxsatlarni boshqara olaman
  • [ ] adb va emulator console bilan deep link, SMS, qo'ng'iroq va geo fix ni ishlata olaman
  • [ ] TestFlight va Google Play track'larining asosiy cheklovlarini bilaman
  • [ ] Mobil bug report'ga qurilma, OS, build, tarmoq va video dalilini qo'shaman

Xulosa {#xulosa}

  • Mobil ilova telefonga o'rnatiladi va eski versiyalar uzoq yashaydi, shuning uchun reliz oldidan testlash web'dagidan chuqurroq bo'ladi. Yangi backend'ni eski ilova versiyalari bilan ham tekshiring.
  • Qurilmalar matritsasi analitikadan tuziladi (O'zbekistonda 2026-yil sentabrda Android 82.28%). Tier 1 — real qurilmalar, qolganlari — simulator va cloud.
  • Simulator UI va mantiq uchun tez vosita. Kamera, NFC, isish, haqiqiy tarmoq va vendor xulqi esa faqat real qurilmada tekshiriladi.
  • 12 yo'nalish: o'rnatish/yangilash, hayot sikli, uzilishlar, ruxsatlar, tarmoq, push/deep link, ekran, imo-ishora/klaviatura, ko'rinish/a11y, til/vaqt, unumdorlik, xavfsizlik.
  • xcrun simctl va adb testni tezlashtiradi. geo fix da avval uzunlik yoziladi.
  • TestFlight: 100 ichki va 10 000 tashqi tester, build 90 kun amal qiladi. Google Play'da yangi shaxsiy akkauntlar uchun 12 tester × 14 kun closed test talabi bor.
  • Keyingi dars: QA 15: Proxyman — HTTPS trafikni ushlash, Map Local, Breakpoint, Scripting va Network Conditions

Manbalar {#manbalar}

  1. Apple — TestFlight
  2. Apple — TestFlight overview (App Store Connect Help)
  3. Apple — Offering account deletion in your app
  4. Apple — App Review Guideline 5.1.1(v): Account deletion
  5. Apple — App Store Review Guidelines
  6. Android Developers — Android Debug Bridge (adb)
  7. Android Developers — Logcat command-line tool
  8. Android Developers — Send emulator console commands
  9. Android Developers — Create deep links
  10. Android Developers — Configure on-device developer options
  11. Google Play Console Help — Set up an open, closed, or internal test
  12. Google Play Console Help — Testing requirements for new personal developer accounts
  13. Firebase App Distribution
  14. StatCounter — Mobile OS Market Share Uzbekistan
  15. TestMu AI (formerly LambdaTest) rebrand — press release, 2026-yil yanvar
  16. Proxyman Docs — iOS Simulator

Markdown manba

iOS Lessons