मोबाइल ऐप टेस्ट सिनेरियो

ज़्यादातर मोबाइल defect तब सामने नहीं आते जब टेस्टर ऑफ़िस Wi-Fi पर पूरी चार्ज फ़ोन में happy path चलाता है। वे तब आते हैं जब पेमेंट के बीच कॉल आती है, ट्रेन सुरंग में जाती है, यूज़र कैमरा permission से इनकार करता है, OS बैकग्राउंड में ऐप को kill कर देता है, या कोई अपडेट पिछले वर्ज़न के लिखे डेटा से मिलता है। यह गाइड उन्हीं स्थितियों का कैटलॉग है — हर स्थिति में क्या देखना है और उसे emulator, simulator या डिवाइस पर कैसे पैदा करना है।

किसी मोबाइल फ़ीचर के टेस्ट डिज़ाइन करते समय इसे checklist की तरह इस्तेमाल करें। पूरे क्षेत्र का अवलोकन — ऐप के प्रकार, डिवाइस स्ट्रैटेजी, सुरक्षा और ऑटोमेशन — मोबाइल टेस्टिंग पिलर गाइड में है; यह पेज सिनेरियो में गहराई तक जाता है।

इस कैटलॉग का इस्तेमाल कैसे करें

हर सिनेरियो एक स्थिति और एक observation है: ऐप को किसी स्थिति में रखें, मोबाइल-विशेष गड़बड़ी लागू करें, और देखें कि यूज़र क्या देखता है और उसके बाद डेटा कैसा है। जो लागू हों उन्हें preconditions, steps और expected results वाले test case में बदलें (test case लिखने वाली गाइड फ़ॉर्मेट कवर करती है)। जोखिम के आधार पर चुनें: बिना सेव इनपुट वाली स्क्रीन, नेटवर्क पर निर्भर फ़ीचर, permissions इस्तेमाल करने वाले या ऐप से बाहर जाने वाले flows (पेमेंट, दूसरे ऐप से साइन-इन), और लोकल डेटा स्टोर करने वाली हर चीज़।

ऐप के lifecycle को state machine के रूप में मॉडल किया जा सकता है, और कई मोबाइल defect ग़लत transitions हैं। टेस्टिंग के लिए पाँच states वाला एक सरल cross-platform मॉडल काफ़ी है: not running, foreground, background, suspended और killed। कोई भी प्लेटफ़ॉर्म ठीक यही सेट परिभाषित नहीं करता: suspended iOS की शब्दावली है, और killed का मतलब process death है — OS बैकग्राउंड में पड़े ऐप का process ख़त्म कर देता है, और यूज़र बाद में Recents से लौटकर अपनी पिछली स्थिति वापस मिलने की उम्मीद करता है। critical स्क्रीन को states और events (कॉल आना, ऐप का बैकग्राउंड में जाना, process kill होना, Recents से दोबारा खुलना) के रूप में मॉडल करने से transition table मिलती है और साफ़ सूची बनती है कि कौन से transition टेस्ट हुए और कौन से नहीं।

कई मोबाइल defect lifecycle के ग़लत transitions हैं; सबसे ख़तरनाक वाला दिखता नहीं: OS बैकग्राउंड में process kill करता है, और Recents से दोबारा खुलने पर स्थिति वापस आनी चाहिए। वैचारिक मॉडल
ट्रांज़िशन
#सेतकEvent → क्या जाँचें
1Not runningशुरुआतForegroundऐप लॉन्च
2ForegroundForegroundConfiguration बदलाव (Android): rotation, भाषा, dark mode या font size डिफ़ॉल्ट रूप से स्क्रीन दोबारा बनाते हैं → टाइप किया टेक्स्ट, चयन, scroll position और खुले डायलॉग बने रहें
3ForegroundBackgroundऐप बैकग्राउंड में: यूज़र दूसरे ऐप पर जाता है, स्क्रीन लॉक करता है, या बैंक ऐप या ब्राउज़र तक जाता है
4BackgroundForegroundयूज़र कुछ सेकंड, मिनट या घंटों बाद लौटता है → session expiry ठीक से सँभले; सही स्क्रीन, सही स्थिति
5BackgroundSuspended (iOS)सिस्टम ऐप को suspend करता है
6Suspended (iOS)Foregroundयूज़र लौटता है → वही जाँचें जो बैकग्राउंड से लौटने पर
7BackgroundKilledOS मेमोरी वापस लेने के लिए process kill करता है; adb shell am kill से यह स्थिति ख़ुद बनाएँ
8Suspended (iOS)KilledOS मेमोरी वापस लेने के लिए process kill करता है
9KilledForegroundRecents से दोबारा खोला गया → स्क्रीन दोबारा बने और यूज़र का टाइप किया हुआ वापस आए

टेस्टिंग के लिए एक सरल cross-platform मॉडल: कोई भी प्लेटफ़ॉर्म ठीक ये पाँच states परिभाषित नहीं करता, और suspended iOS की शब्दावली है। Android पर "Don’t keep activities" state restoration की कमी पकड़ने का सस्ता तरीक़ा है।

ID:        MOB-NET-04
Area:      Network — connection lost mid-request
Screen:    Checkout › Place order
Setup:     Signed-in customer, 2 items in cart, Wi-Fi on, mobile data off
Trigger:   Tap "Place order", then disable Wi-Fi within one second
Observe:   - A clear "no connection" state; no endless spinner
           - After reconnecting: exactly one order exists (order list and API)
           - Retrying does not charge the card twice
Devices:   Tier 1 Android and iOS

आज़माएँ: स्टेट ट्रांज़िशन जनरेटर आज़माएँ: टेस्ट केस जनरेटर

इंस्टॉल, अपडेट, अनइंस्टॉल और दोबारा इंस्टॉल

अपडेट वह जगह है जहाँ data migration के defect छिपते हैं: लोकल डेटाबेस का schema बदला, किसी preference key का नाम बदला, स्टोर किए token का फ़ॉर्मेट बदला, कोई cached फ़ाइल हट गई। हर उस पुराने वर्ज़न से अपडेट टेस्ट करें जिसे आप अब भी सपोर्ट करते हैं — पुराने builds को artefact के रूप में रखें ताकि उन्हें इंस्टॉल कर सकें — और यह डिवाइस पर असली जैसे डेटा के साथ करें, नए इंस्टॉल पर नहीं।

  • सबसे पुराने और सबसे नए सपोर्टेड OS वर्ज़न पर साफ़ इंस्टॉल; बिना नेटवर्क के पहला लॉन्च।
  • जिस डिवाइस पर लगभग कोई ख़ाली storage न बची हो, उस पर इंस्टॉल और पहला लॉन्च।
  • पिछले वर्ज़न से और सबसे पुराने सपोर्टेड वर्ज़न से अपडेट, साइन-इन session, drafts, ऑफ़लाइन queue में रुकी actions, settings और डाउनलोड की गई फ़ाइलों के साथ — सब बचा रहे और यूज़र साइन-इन रहे।
  • डाउनलोड या बैकग्राउंड sync चलते समय अपडेट।
  • Forced update: न्यूनतम सपोर्टेड वर्ज़न से नीचे का वर्ज़न API कॉल फ़ेल होने के बजाय साफ़ update prompt दिखाए।
  • अनइंस्टॉल और दोबारा इंस्टॉल: लोकल डेटा चला जाए, सर्वर डेटा लौट आए, backup और restore डिज़ाइन के अनुसार चलें। iOS पर कुछ Keychain डेटा ऐप हटने के बाद भी बचा रह सकता है, इसलिए तय करें और टेस्ट करें कि दोबारा इंस्टॉल को नया यूज़र माना जाए या नहीं।
  • ऐप डेटा clear करें (Android) या ऐप offload करें (iOS, जो documents और डेटा रखता है) और फिर लॉन्च करें।
# Android (adb) — examples
adb install shop-3.8.0.apk                # old version; now sign in, create drafts, change settings
adb install -r shop-4.0.0.apk             # update, keeping app data
adb shell pm clear com.example.shop       # clear app data
adb uninstall com.example.shop

# iOS Simulator (xcrun simctl) — examples
xcrun simctl install booted Shop-3.8.app
xcrun simctl install booted Shop-4.0.app  # install the new build, then check what data survived
xcrun simctl uninstall booted com.example.shop

Runtime permissions: देना, मना करना, वापस लेना

Android ख़तरनाक permissions runtime पर माँगता है, और iOS तब पूछता है जब ऐप पहली बार किसी संरक्षित resource का इस्तेमाल करता है, ऐप का purpose text दिखाते हुए। दोनों प्लेटफ़ॉर्म पर यूज़र बाद में Settings से जवाब बदल सकता है, और नए वर्ज़न सिर्फ़ एक बार अनुमति देने या सटीक के बजाय अनुमानित लोकेशन साझा करने जैसे विकल्प जोड़ते हैं; Android ने notifications को भी runtime permission बना दिया है। ऐप को हर जवाब के साथ काम करना चाहिए — या साफ़ तरीक़े से सीमित होना चाहिए।

  • पहले अनुरोध पर अनुमति: फ़ीचर ऐप को restart किए बिना तुरंत काम करे।
  • इनकार: ऐप बताए कि क्या उपलब्ध नहीं है और दूसरा रास्ता दे (लोकेशन के बजाय पता टाइप करना)।
  • दोबारा इनकार या "Don’t ask again": ऐप prompt को loop में न दोहराए; बताए कि Settings में permission कैसे चालू करें।
  • Allow once / सिर्फ़ इस बार: अगला session फिर से पूछे, और फ़ीचर इसे सँभाले।
  • अनुमानित लोकेशन या सीमित photo access: जिन फ़ीचर को ज़्यादा चाहिए वे चुपचाप फ़ेल होने के बजाय यह बताएँ।
  • ऐप बैकग्राउंड में हो तब Settings से revoke करें। Android पर permission revoke होते ही ऐप का process kill हो जाता है; लौटने पर ऐप को किसी समझदार स्क्रीन पर साफ़ तरीक़े से restart होना चाहिए।
  • Permission संदर्भ में माँगी जाए, जब फ़ीचर इस्तेमाल हो — पहले लॉन्च पर सब एक साथ नहीं — और purpose text सही हो।
# Android
adb shell pm grant  com.example.shop android.permission.CAMERA
adb shell pm revoke com.example.shop android.permission.CAMERA

# iOS Simulator
xcrun simctl privacy booted grant  photos com.example.shop
xcrun simctl privacy booted revoke photos com.example.shop
xcrun simctl privacy booted reset  all    com.example.shop

इंटरप्शन और ऐप lifecycle

इंटरप्शन वह सब है जो ऐप को foreground से हटाए या उसे ढक दे। सबसे ख़तरनाक वाला दिखता नहीं: ऐप बैकग्राउंड में हो तब OS मेमोरी वापस लेने के लिए उसका process kill कर सकता है, और यूज़र के लौटने पर ऐप को स्क्रीन दोबारा बनानी और टाइप किया हुआ वापस लाना होता है। Android पर developer option "Don’t keep activities" यूज़र के स्क्रीन छोड़ते ही उसे नष्ट कर देता है — state restoration की कमी पकड़ने का सस्ता तरीक़ा। rotation, भाषा, dark mode या font size जैसे configuration बदलाव भी Android पर डिफ़ॉल्ट रूप से स्क्रीन दोबारा बनाते हैं।

  • फ़ॉर्म भरते, वीडियो चलते, रिकॉर्डिंग और पेमेंट के दौरान आने वाली कॉल — उठाई और काटी गई।
  • दूसरे ऐप के notification; flow के बीच notification shade या Control Center खींचना।
  • दूसरे ऐप पर जाएँ और कुछ सेकंड, कुछ मिनट और कई घंटे बाद लौटें (session expiry)।
  • OTP का इंतज़ार करते या timer चलते समय स्क्रीन लॉक और अनलॉक करें।
  • अलार्म बजे, या कम बैटरी की चेतावनी आए; battery saver या Low Power Mode चालू हो।
  • ऑडियो चलते समय Bluetooth headphones डिस्कनेक्ट हों — playback रुकना चाहिए।
  • Process death: ऐप को बैकग्राउंड में भेजें, process kill करें, Recents से दोबारा खोलें।
  • दूसरे ऐप तक जाना और लौटना — बैंक ऐप, साइन-इन या 3-D Secure के लिए ब्राउज़र — सही स्क्रीन और सही स्थिति पर वापस लाए।
  • Split screen, picture-in-picture, और flow के बीच foldable को मोड़ना या खोलना।
# Android — force the conditions
adb shell am kill com.example.shop          # kill the background process, then reopen from Recents
adb shell dumpsys battery unplug
adb shell dumpsys battery set level 5       # simulate a low battery
adb shell dumpsys battery reset
adb shell dumpsys deviceidle force-idle     # put the device into Doze
adb shell dumpsys deviceidle unforce

# Android emulator — incoming call and SMS
adb emu gsm call 5551234
adb emu sms send 5551234 "Your code is 482913"

आज़माएँ: स्टेट ट्रांज़िशन जनरेटर

नेटवर्क बदलाव, ऑफ़लाइन मोड और sync

मोबाइल पर नेटवर्क स्थिर नहीं, एक चर है। सिर्फ़ "online" और "offline" नहीं, बल्कि transitions और कनेक्शन की गुणवत्ता टेस्ट करें। ऑफ़लाइन काम करने वाले ऐप में sync सबसे बड़ा जोखिम है: queue में रुके बदलाव दो बार या ग़लत क्रम में भेजे जाना, डिवाइसों के बीच conflicts का चुपचाप सुलझ जाना, और ऐसे session में queue हुई actions जो इस बीच expire हो गया।

  • Upload, download और streaming के दौरान Wi-Fi से cellular और वापस।
  • Request के बीच airplane mode चालू और बंद।
  • ऑफ़लाइन लॉन्च: साफ़ offline संकेत के साथ cached कंटेंट; actions queue में या कारण बताकर बंद।
  • धीमा नेटवर्क (ज़्यादा latency, कम bandwidth): loading states, समझदार timeouts, और बेचैन टैप से दोहरा submission नहीं।
  • रुक-रुक कर चलने वाला नेटवर्क (drops और packet loss): back-off के साथ retries, कोई duplicate record नहीं; ऑर्डर और पेमेंट request idempotent हों।
  • Captive portal (होटल या एयरपोर्ट Wi-Fi): कनेक्टेड पर इंटरनेट नहीं — ऐप को JSON के बजाय HTML लॉगिन पेज मिलता है और उसे parsing error नहीं, नेटवर्क संदेश दिखाना चाहिए।
  • ऑफ़लाइन conflict: डिवाइस A पर ऑफ़लाइन रिकॉर्ड बदलें, डिवाइस B पर वही रिकॉर्ड ऑनलाइन बदलें, A को दोबारा जोड़ें — तय conflict नियम लागू हो और दिखे।
  • ऑफ़लाइन रहते session expire होने के बाद भेजी गई queued actions; ऑफ़लाइन रहते डिवाइस की घड़ी या timezone बदलना।
  • Data saver या restricted background data चालू।
# Android
adb shell svc wifi disable     # and: enable
adb shell svc data disable     # and: enable

# Android emulator — start with a throttled network
emulator -avd Pixel_Test -netspeed edge -netdelay gprs

# iOS — Network Link Conditioner (device Developer settings, or Xcode additional tools for the Mac)

# Server side — point the app at an endpoint that answers slowly or with an error code

आज़माएँ: API स्टेटस कोड सिम्युलेटर आज़माएँ: Mock एरर रिस्पॉन्स जनरेटर

स्क्रीन, orientation, gestures और इनपुट

  • इनपुट वाली हर स्क्रीन पर rotate करें: टाइप किया टेक्स्ट, चयन, scroll position और खुले डायलॉग बने रहें।
  • ऐप खुले रहते dark mode बदलें; दोनों mode में contrast और इमेज जाँचें।
  • सबसे बड़ा font size या Dynamic Type साइज़: कोई कटा या overlap होता टेक्स्ट नहीं, और लंबी स्क्रीन scroll हों।
  • Android का display size बदलें; अपने मैट्रिक्स की सबसे छोटी और सबसे बड़ी स्क्रीन टेस्ट करें।
  • कीबोर्ड: हर फ़ील्ड के लिए सही प्रकार (OTP और फ़ोन के लिए numeric, ईमेल के लिए email), focused फ़ील्ड और submit बटन दिखते रहें, "Next" focus आगे बढ़ाए, और जहाँ प्लेटफ़ॉर्म सपोर्ट करे वहाँ OTP autofill काम करे।
  • Gestures: tap, double tap, long press, swipe, pinch, drag और pull-to-refresh; कस्टम edge swipe सिस्टम के back gesture से न टकराए।
  • Submit बटन पर तेज़ बार-बार टैप से duplicates न बनें।
  • Right-to-left: अरबी में layout mirror हो, swipe दिशाएँ और back तीर तर्कसंगत हों, मिला-जुला अरबी और लैटिन टेक्स्ट सही दिखे, और जहाँ ऐप अनुमति दे वहाँ इनपुट Arabic-Indic अंक स्वीकार करे।
# Android
adb shell settings put system font_scale 2.0     # large text (reset with 1.0)
adb shell wm size 1080x2400                      # emulate another screen (reset: wm size reset)
adb shell wm density 480                         # (reset: wm density reset)
adb shell cmd uimode night yes                   # dark mode on (no = off)

# iOS Simulator
xcrun simctl ui booted appearance dark
# larger text: raise the text size in the simulator’s Settings app

आज़माएँ: अरबी टेस्ट डेटा जनरेटर आज़माएँ: बहुभाषी टेस्ट डेटा जनरेटर आज़माएँ: फ़ेक फ़ोन नंबर जनरेटर

बैटरी, CPU, मेमोरी, storage और डेटा

Resource defect शायद ही कभी फ़ंक्शनल टेस्ट फ़ेल करते हैं। वे बाद में बैटरी की शिकायतों, "App not responding" डायलॉग, सुस्त scrolling और OS के ऐप kill करने के रूप में दिखते हैं। असली डिवाइस पर प्लेटफ़ॉर्म profilers (Android Studio के profilers, Xcode Instruments) से मापें, और हर रिलीज़ की तुलना किसी निरपेक्ष संख्या के बजाय पिछली रिलीज़ से करें।

  • बैटरी: असली डिवाइस पर 30 मिनट का सामान्य session, पिछली रिलीज़ से तुलना; यूज़र के स्क्रीन छोड़ने पर location updates, sensors और wake locks रुकें; बैकग्राउंड काम Doze और Low Power Mode का सम्मान करे।
  • CPU और rendering: सबसे कमज़ोर सपोर्टेड डिवाइस पर लंबी सूचियाँ smooth scroll हों; बिना वजह बैकग्राउंड में कुछ चलता न रहे।
  • मेमोरी: मुख्य flow बीस बार दोहराएँ और जाँचें कि मेमोरी baseline पर लौटती है; बड़ी इमेज खोलें; कम RAM वाले डिवाइस पर टेस्ट करें।
  • Storage: लगभग भरे डिवाइस पर writes शालीनता से फ़ेल हों; cache की सीमा हो और साफ़ हो; एक हफ़्ते इस्तेमाल के बाद ऐप का साइज़ उचित हो।
  • डेटा: सामान्य session में खर्च हुआ cellular डेटा; स्क्रीन के हिसाब से साइज़ की गई इमेज; cellular पर बड़े डाउनलोड सिर्फ़ यूज़र की सहमति से।
  • Start-up: सबसे कमज़ोर डिवाइस पर cold और warm start समय; कैमरा, वीडियो या मैप के लंबे session में गर्मी।
# Android — quick measurements
adb shell dumpsys meminfo com.example.shop
adb shell dumpsys gfxinfo com.example.shop       # frame rendering stats
adb shell dumpsys batterystats --reset
# ...run the session on battery...
adb shell dumpsys batterystats com.example.shop

आज़माएँ: रिस्पॉन्स साइज़ एनालाइज़र

Push notification

Push notification कई सिस्टम पार करता है: ऐप प्लेटफ़ॉर्म सेवा (Android पर Firebase Cloud Messaging, iOS पर APNs) के साथ रजिस्टर होता है, device token पाता है, उसे आपके बैक एंड को भेजता है, और बैक एंड प्लेटफ़ॉर्म सेवा के ज़रिए संदेश भेजता है। कहीं भी विफलता यूज़र को एक जैसी दिखती है — कुछ नहीं आता, या ग़लत चीज़ खुलती है — इसलिए chain और ऐप की स्थितियाँ अलग-अलग टेस्ट करें।

  • Notification permission से इनकार: ऐप फिर भी काम करे और ऐप के अंदर विकल्प दे; ऐप की अपनी notification settings का सम्मान हो।
  • ऐप foreground में (डिज़ाइन के अनुसार in-app banner या silent update), background में और killed स्थिति में डिलीवरी।
  • टैप करने पर सही रिकॉर्ड के साथ सही स्क्रीन खुले — यूज़र साइन-आउट हो तब भी, और उस स्थिति में साइन-इन के बाद लक्ष्य खुले।
  • साइन-आउट करें, फिर दूसरे यूज़र से साइन-इन करें: पहले यूज़र के notification अब न आएँ (token unregister या दोबारा assign हुआ)।
  • दोबारा इंस्टॉल या restore: बैक एंड को नया token मिले और वह पुराने का इस्तेमाल बंद करे।
  • कंटेंट: localized टेक्स्ट, right-to-left अरबी, लंबा टेक्स्ट, emoji और इमेज; लॉक स्क्रीन पर कोई संवेदनशील डेटा न दिखे।
  • Badges साफ़ हों, notifications group हों, और Android notification channels की importance वही हो जो तय की गई।
  • Scheduled notifications अलग-अलग timezones में सही लोकल समय पर पहुँचें।
# iOS Simulator — deliver a test notification without a server
xcrun simctl push booted com.example.shop order-shipped.apns

# order-shipped.apns
{
  "Simulator Target Bundle": "com.example.shop",
  "aps": { "alert": { "title": "تم شحن طلبك", "body": "Order A-1042 is on its way" }, "badge": 1 },
  "orderId": "A-1042"
}

आज़माएँ: अरबी टेस्ट डेटा जनरेटर

Defect के उदाहरण और मोबाइल बग रिपोर्ट में क्या लिखें

मोबाइल बग रिपोर्ट को वेब से ज़्यादा environment जानकारी चाहिए: डिवाइस मॉडल, OS वर्ज़न, ऐप वर्ज़न और build, नेटवर्क प्रकार, orientation, भाषा, font size, permission की स्थिति, और ऐप उस स्थिति तक कैसे पहुँचा (नया इंस्टॉल या किस वर्ज़न से अपडेट)। screen recording और डिवाइस log लगाएँ — Android पर logcat, iOS पर device console। बाक़ी फ़ॉर्मेट बग रिपोर्ट गाइड कवर करती है। नीचे के शीर्षक उन defects के उदाहरण मात्र हैं जिन्हें यह कैटलॉग पकड़ता है।

[Android, Pixel] Checkout crashes on resume after process death on the payment step
[iOS] Draft message lost when a phone call arrives while typing
Offline queue sends "Add to cart" twice after switching from Wi-Fi to 4G
Update 4.1 → 4.2: saved addresses missing (local database migration skipped)
"Order shipped" notification opens Home instead of order A-1042 when the app was killed
Location permanently denied: map screen shows an endless spinner and no link to Settings
Font size 200%: "Confirm" button off-screen on the OTP screen and not scrollable
Captive-portal Wi-Fi: app shows "Unexpected token <" instead of a network message

अक्सर पूछे जाने वाले सवाल

सबसे ज़रूरी मोबाइल टेस्ट सिनेरियो कौन से हैं?

फ़ीचर के अलावा: data migration के साथ अपडेट, permission से इनकार और revoke, इंटरप्शन और process death, नेटवर्क का जाना और transitions, ऑफ़लाइन sync, बड़ा टेक्स्ट और rotation, और foreground, background व killed स्थिति में push notification।

ऐप अपडेट कैसे टेस्ट करें?

पुराना सपोर्टेड build इंस्टॉल करें, असली जैसा डेटा बनाएँ (session, drafts, settings, ऑफ़लाइन queue), उसके ऊपर नया build इंस्टॉल करें और जाँचें कि सब बचा है और यूज़र साइन-इन है। सबसे पुराने सपोर्टेड वर्ज़न से दोहराएँ।

ख़राब नेटवर्क कैसे simulate करें?

Android emulator की speed और latency throttle करें, iOS पर Network Link Conditioner इस्तेमाल करें, request के दौरान Wi-Fi और mobile data टॉगल करें, और ऐप को ऐसे endpoint पर भेजें जो धीरे या error code के साथ जवाब दे।

OS के ऐप kill करने पर क्या होता है, यह कैसे टेस्ट करें?

काम के बीच ऐप को बैकग्राउंड में भेजें, उसका process kill करें (Android पर adb shell am kill; "Don’t keep activities" एक हल्की जाँच है जो हर स्क्रीन नष्ट करती है पर process को kill नहीं करती), फिर Recents से खोलें। स्क्रीन और यूज़र का इनपुट वापस आना चाहिए।

Push notification में क्या जाँचें?

हर ऐप स्थिति में डिलीवरी, टैप पर खुलने वाली स्क्रीन, notification से इनकार पर व्यवहार, साइन-आउट और दोबारा इंस्टॉल के बाद token बदलाव, localized और right-to-left कंटेंट, और यह कि लॉक स्क्रीन पर संवेदनशील डेटा न दिखे।

Runtime permissions कैसे टेस्ट करें?

हर permission के लिए grant, deny, स्थायी deny, एक बार की अनुमति और ऐप चलते समय Settings से revoke टेस्ट करें। ऐप को काम करते रहना चाहिए या साफ़ बताना चाहिए कि क्या उपलब्ध नहीं है और उसे कैसे चालू करें।

संदर्भ

  • Certified Tester Mobile Application Testing (CT-MAT)ISTQB · 2019मोबाइल टेस्टिंग पर ISTQB का specialist पाठ्यक्रम: ऐप के प्रकार, डिवाइस व प्लेटफ़ॉर्म की चुनौतियाँ, टेस्ट प्रकार और टूल।
  • Core app quality guidelinesAndroid Developers (Google)Android ऐप के लिए Google के बुनियादी गुणवत्ता मानदंड — विज़ुअल अनुभव, कार्यक्षमता, परफ़ॉर्मेंस, प्राइवेसी और सुरक्षा — उन्हें जाँचने वाले टेस्ट के साथ।
  • Test apps on AndroidAndroid Developers (Google)Android की आधिकारिक टेस्टिंग गाइडेंस: टेस्ट के प्रकार और दायरा, local बनाम instrumented टेस्ट, और बेहतरीन तरीके।
  • XCTestAppleiOS और अन्य Apple प्लेटफ़ॉर्म पर Xcode प्रोजेक्ट के unit, performance और UI टेस्ट के लिए Apple का फ़्रेमवर्क।
  • OWASP Mobile Application Security Verification Standard (MASVS)OWASP Foundationमोबाइल ऐप के लिए OWASP की सुरक्षा आवश्यकताएँ, storage, cryptography, authentication, network और platform interaction जैसे नियंत्रण समूहों में।
  • Test your app's accessibilityAndroid Developers (Google)Android ऐप की एक्सेसिबिलिटी को TalkBack जैसी सेवाओं से मैन्युअली और प्लेटफ़ॉर्म के टेस्टिंग टूल से ऑटोमेटेड तरीके से कैसे जाँचें।
  • Accessibility — Human Interface GuidelinesAppleiOS और अन्य प्लेटफ़ॉर्म के लिए Apple की एक्सेसिबिलिटी डिज़ाइन गाइडेंस: VoiceOver, Dynamic Type, कंट्रास्ट, टच टारगेट और मोशन।

अभ्यास

Proof of delivery के लिए मोबाइल टेस्ट सिनेरियो डिज़ाइन करें

आपका काम

आप एक delivery कंपनी (काल्पनिक) के courier ऐप के टेस्टर हैं, जो Android और iOS पर चलता है। Release 5.0 में proof of delivery (POD) जुड़ता है: दरवाज़े पर courier पार्सल की फ़ोटो लेता है, ग्राहक delivery code टाइप करता है, और ऐप दोनों को upload करता है — signal न हो तो बाद में। नीचे का material वह है जो product owner, courier team lead और developers ने आपको बताया है।

गाइड के कैटलॉग से POD flow के मोबाइल-विशेष टेस्ट काग़ज़ पर डिज़ाइन करें: हर सिनेरियो एक ऐसी स्थिति है जिसे आप पैदा कर सकें, साथ में एक observation जिसे आप स्क्रीन पर और डेटा में जाँच सकें। रिस्क-बेस्ड टेस्ट जनरेटर कैटलॉग के क्षेत्रों को likelihood और impact के आधार पर स्कोर करने में मदद कर सकता है। इसके लिए 25–30 मिनट रखें।

सामग्री
Courier app "Wasel Driver" (काल्पनिक) - Android और iOS, Arabic और English UI
Package / bundle id: com.example.courier
आज stores में version: 4.9। सबसे पुराना supported version: 4.6
(उससे पुराने versions को forced-update prompt मिलता है)।
Release 5.0 में "Proof of delivery" (POD) जुड़ता है।

किसी order की delivery स्क्रीन पर POD flow, जैसे D-5531
  1. Courier "Delivered" पर टैप करता है; ऐप GPS position पढ़ता है
     (location permission)।
  2. Courier नए in-app camera से दरवाज़े पर पार्सल की फ़ोटो लेता है
     (camera permission)।
  3. ग्राहक SMS में मिला 4 अंकों का delivery code courier के फ़ोन पर
     टाइप करता है।
  4. Courier "Confirm delivery" पर टैप करता है: ऐप फ़ोटो, code और position
     POST /api/orders/D-5531/pod में भेजता है, और order "Delivered" हो जाता है।

Rules
  R1  नेटवर्क न हो तो POD फ़ोन पर सेव होता है और बाद में upload होता है,
      सबसे पुराना पहले। Server एक ही order को कभी दो बार delivered दर्ज नहीं करता।
  R2  Location उपलब्ध न हो तो भी courier confirm कर सकता है; dispatcher के लिए
      POD पर "no location" का flag लगता है।
  R3  Courier का session 12 घंटे चलता है; फिर courier को दोबारा sign in करना
      होता है।
  R4  जब dispatcher किसी order को reassign करता है, courier को push notification
      "Order D-5531 was reassigned" मिलता है; उस पर टैप करने से order list खुलती है।

5.0 में क्या बदलता है
  - Offline queue: 4.x confirmations (सिर्फ़ status) को लोकल table pending_uploads
    में रखता है। पहले launch पर 5.0 उन्हें नई table pod_queue (status, photo,
    code, position) में ले जाता है।
  - Camera: system camera app खोलने की जगह ऐप के अंदर की camera स्क्रीन।

Courier team lead से
  Couriers अपने निजी फ़ोन इस्तेमाल करते हैं, 12 घंटे तक की shift करते हैं, अक्सर
  बिना signal वाले basements और lift lobbies में delivery करते हैं, और shift के
  दौरान updates इंस्टॉल करते हैं।

Developers से
  "पूरा flow office Wi-Fi पर 5.0 के fresh install के साथ pass होता है।"

Devices: Tier 1 Android और iOS फ़ोन; Android emulator और iOS Simulator।
चरण
  1. जोखिम के आधार पर चुनें: बताएँ कि गाइड के चुनाव वाले संकेतों में से कौन-से POD flow में हैं (बिना सेव इनपुट, नेटवर्क, permissions या ऐप से बाहर जाना, लोकल डेटा), फिर कैटलॉग के क्षेत्रों को क्रम दें और वे तीन क्षेत्र बताएँ जिन्हें आप सबसे पहले टेस्ट करेंगे, हर एक के कारण के साथ।
  2. दस सिनेरियो लिखें, हर एक एक पंक्ति में, स्थिति और observation के रूप में। कैटलॉग के कम से कम पाँच क्षेत्र कवर करें, और जहाँ लागू हो, हर सिनेरियो को किसी rule (R1–R4) या 5.0 के किसी बदलाव से जोड़ें।
  3. इनमें से दो को कैटलॉग के फ़ॉर्मेट (ID, Area, Screen, Setup, Trigger, Observe, Devices) में पूरा लिखें: 4.x से अपडेट जब confirmations अभी upload न हुए हों, और POD स्क्रीन पर process death। Android emulator पर हर स्थिति पैदा करने वाले commands भी लिखें।
  4. वे सवाल लिखें जो material खुले छोड़ता है, product owner के लिए।
  5. आपका process death सिनेरियो fail होता है। बग रिपोर्ट का शीर्षक और रिपोर्ट के लिए ज़रूरी environment की जानकारी लिखें, जितनी material से भरी जा सके।
मॉडल उत्तर दिखाएँ
मॉडल उत्तर

जोखिम के आधार पर चुनाव। POD flow में वे सारे संकेत हैं जिनसे गाइड सिनेरियो चुनती है: बिना सेव इनपुट (फ़ोटो और टाइप किया code "Confirm delivery" तक सिर्फ़ फ़ोन पर हैं), नेटवर्क पर निर्भर फ़ीचर (upload), permissions (location और camera), और लोकल स्टोर होने वाला डेटा (offline queue, जो 5.0 में नई table में जाती है)। सिर्फ़ "ऐप से बाहर जाना" कम होता है, क्योंकि in-app camera, system camera app तक जाने-लौटने की जगह लेता है; बदले में नई camera स्क्रीन को rotation, इंटरप्शन और permission से इनकार झेलना होगा। सबसे पहले टेस्ट करें: (1) नेटवर्क, ऑफ़लाइन मोड और sync, क्योंकि R1 वह वादा है जिस पर फ़ीचर टिका है और couriers रोज़ बिना signal के delivery करते हैं — जोखिम हैं POD का दो बार जाना, ग़लत क्रम में जाना, या upload से पहले session expire होने पर अटक जाना; (2) 4.x से अपडेट, क्योंकि पहले launch पर queue migrate होती है और couriers shift के दौरान अपडेट करते हैं, इसलिए अपडेट के समय असली फ़ोनों में upload न हुए confirmations होंगे; (3) POD स्क्रीन पर इंटरप्शन और process death, क्योंकि दरवाज़े पर कॉल आना और ऐप बदलना आम है, और फ़ोटो व code खोने का मतलब है ग्राहक के इंतज़ार करते हुए steps दोहराना। इसके बाद runtime permissions (R2 और camera), push notification (R4), और स्क्रीन व इनपुट (code फ़ील्ड, अरबी, rotation, बड़ा टेक्स्ट)। बैटरी, डेटा और storage पहली प्राथमिकता के बजाय release की जाँच रहते हैं — cellular पर फ़ोटो upload के साथ पूरी shift, लगभग भरा फ़ोन। ध्यान दें कि developers का सबूत, यानी office Wi-Fi पर fresh install, पहले तीन में से किसी को नहीं छूता।

दस सिनेरियो, भाग 1। POD-01 (नेटवर्क, R1): "Confirm delivery" पर टैप करें और एक सेकंड के अंदर कनेक्शन काट दें। Expected: साफ़ "waiting to upload" स्थिति, कोई अंतहीन spinner नहीं; कनेक्शन लौटने के बाद D-5531 के लिए ठीक एक POD हो और order एक ही बार "Delivered" हो (order list और API में)। POD-02 (sync, R1): airplane mode में तीन orders confirm करें, फिर कनेक्ट करें। Expected: वे सबसे पुराने से शुरू होकर upload हों, हर एक ठीक एक बार, फ़ोटो और code सही-सलामत, और courier को दिखने वाली waiting गिनती शून्य हो जाए। POD-03 (sync और session, R1 और R3): ऑफ़लाइन एक delivery confirm करें और कनेक्ट होने से पहले session expire होने दें; 12 घंटे इंतज़ार करने के बजाय छोटे session वाला test environment माँगें। Expected: courier से sign in करने को कहा जाए, और queue में रुका POD बचा रहे — server के expired session ठुकराने पर हटे नहीं — और sign in के बाद upload हो। POD-04 (अपडेट, 5.0 का बदलाव): 4.9 में ऑफ़लाइन दो confirmations queue करें, फिर 5.0 पर अपडेट करें। Expected: courier साइन-इन रहे, और दोनों pod_queue में जाएँ और ठीक एक-एक बार upload हों; 4.6 से दोहराएँ। POD-05 (lifecycle, process death): फ़ोटो लें, दो अंक टाइप करें, ऐप को बैकग्राउंड में भेजें, process kill करें और Recents से ऐप दोबारा खोलें। Expected: D-5531 की POD स्क्रीन फ़ोटो और दोनों अंकों के साथ लौटे।

दस सिनेरियो, भाग 2। POD-06 (इंटरप्शन): ग्राहक के code टाइप करते समय आने वाली कॉल, उठाई और काटी गई; साथ ही स्क्रीन लॉक और अनलॉक। Expected: POD स्क्रीन पर वापसी, इनपुट सही-सलामत, और अपने-आप कुछ नहीं भेजा जाता। POD-07 (permissions, R2): location से इनकार करें, फिर दोबारा इनकार करें ताकि सिस्टम पूछना बंद कर दे (iOS पर पहला इनकार ही ऐसा कर देता है)। Expected: confirm करना फिर भी काम करे, POD पर "no location" flag लगे, prompt loop में न दोहराया जाए, और ऐप बताए कि Settings में location की अनुमति कैसे दें। POD-08 (permissions, in-app camera): पहले इस्तेमाल पर camera से इनकार करें; अलग से, अनुमति दें और फिर जब ऐप POD स्क्रीन पर बैकग्राउंड में हो तब Settings से revoke करें। Expected: इनकार पर ऐप बताए कि क्या उपलब्ध नहीं है और Settings में camera की अनुमति कैसे दें, prompt को loop में न दोहराए, और confirm करना बिना फ़ोटो वाली delivery पर product owner के जवाब के अनुसार चले; revoke के बाद, जो Android पर process kill करता है, ऐप किसी समझदार स्क्रीन पर, जैसे order D-5531, बिना crash के साफ़ तरीक़े से restart हो। POD-09 (push, R4): reassignment notification, जब ऐप foreground में, background में और killed स्थिति में हो, और एक बार session expire होने के बाद। Expected: टैप करने पर order list खुले, ज़रूरत हो तो sign in के बाद; D-5531 उसमें न हो, और उसका POD confirm न हो सके। POD-10 (स्क्रीन और इनपुट): code फ़ील्ड, Arabic-Indic अंकों के साथ अरबी UI, camera और POD स्क्रीन का rotation, और सबसे बड़ा font size। Expected: numeric कीबोर्ड; अंक तय नियम के अनुसार स्वीकार हों, या साफ़ संदेश के साथ अस्वीकार; फ़ोटो और अंक rotation के बाद बने रहें; "Confirm delivery" दिखता रहे या scroll करके उस तक पहुँचा जा सके। ये भी अच्छे हैं: "Confirm delivery" पर तेज़ double tap (एक ही POD), बड़ी फ़ोटो के साथ धीमा नेटवर्क (progress, समझदार timeout, कोई duplicate नहीं), फ़ोटो सेव होते समय लगभग भरा फ़ोन, बिल्डिंग की lobby में captive-portal Wi-Fi, Doze या Low Power Mode में upload, और version 4.5 पर forced-update prompt।

पूरा सिनेरियो 1 (POD-04 पूरा लिखा गया)। ID: POD-UPD-01। Area: इंस्टॉल और अपडेट — offline queue का migration। Screen: order list में "Waiting to upload"। Setup: Android emulator जिस पर 4.9 इंस्टॉल है (adb install courier-4.9.0.apk), courier साइन-इन, नेटवर्क बंद (adb shell svc wifi disable और adb shell svc data disable), D-5531 और फिर D-5532 "Delivered" किए गए, इसलिए दोनों pending_uploads में इंतज़ार कर रहे हैं। Trigger: adb install -r courier-5.0.0.apk से अपडेट, जो ऐप डेटा रखता है, फिर 5.0 लॉन्च करके queue देखें, फिर नेटवर्क वापस चालू करें (adb shell svc wifi enable और adb shell svc data enable)। Observe: courier अब भी साइन-इन है; अपडेट के बाद दोनों confirmations waiting दिखते हैं; कनेक्शन लौटने पर हर एक ठीक एक बार जाता है, पहले D-5531, और दोनों orders "Delivered" होते हैं (order list और API में); ऐप दोबारा लॉन्च करने पर कुछ फिर से नहीं जाता, यानी पुरानी table का कंटेंट दूसरी बार नहीं भेजा जाता। Devices: Android emulator और Tier 1 Android फ़ोन, फिर रखे गए 4.9 build और airplane mode के साथ Tier 1 iPhone। साफ़ emulator पर 4.6 से दोहराएँ: पहले अनइंस्टॉल करें, क्योंकि 4.6 को 4.9 के ऊपर सीधे इंस्टॉल नहीं किया जा सकता।

पूरा सिनेरियो 2 (POD-05 पूरा लिखा गया)। ID: POD-LIFE-01। Area: इंटरप्शन — process death। Screen: Order D-5531 › Proof of delivery। Setup: courier साइन-इन, नेटवर्क चालू, location और camera की अनुमति, फ़ोटो ली जा चुकी, ग्राहक code के दो अंक टाइप कर चुका। Trigger: Home दबाएँ, adb shell am kill com.example.courier से process kill करें, फिर Recents से ऐप दोबारा खोलें। Observe: D-5531 की POD स्क्रीन खुले, home स्क्रीन या कोई दूसरा order नहीं; फ़ोटो और दोनों अंक वापस आएँ; कुछ upload नहीं हुआ; कोई crash नहीं। Devices: Android emulator और Tier 1 Android फ़ोन; command सिर्फ़ Android का है, इसलिए iOS developers के साथ तय करें कि iPhone पर यही स्थिति कैसे पैदा करें। गाइड के lifecycle मॉडल में यह foreground से background, फिर killed और वापस foreground का रास्ता कवर करता है, जिससे developers की जाँच कभी नहीं गुज़री। Developer option "Don’t keep activities" इसी restoration की सस्ती पहली जाँच है, लेकिन process death सिर्फ़ process kill करके ही टेस्ट होती है। ISTQB की भाषा में, एक पंक्ति वाला हर सिनेरियो एक test condition बताता है, और उसे पूरा लिखने से वह test case बन जाता है: Setup में preconditions, Trigger में steps, और Observe में expected results हैं।

Product owner के लिए खुले सवाल। Camera से इनकार: क्या courier बिना फ़ोटो confirm कर सकता है, जैसे R2 बिना location के करने देता है, या delivery रुक जाती है, और dispatcher क्या देखता है? अनुमानित location (precise location बंद): क्या इसे location माना जाएगा या "no location"? 4.x से migrate हुए confirmations में न फ़ोटो है न code: क्या server उन्हें स्वीकार करता है, और क्या dispatcher के लिए उन्हें चिह्नित किया जाता है? Code कहाँ जाँचा जाता है? अगर server जाँचता है, तो ऑफ़लाइन POD दरवाज़े पर जाँचा नहीं जा सकता: queue में रुका POD ग़लत code के साथ पहुँचे तो क्या होता है, और कितनी कोशिशों की अनुमति है? ऑफ़लाइन काम के दौरान reassignment: अगर courier ऑफ़लाइन कोई order confirm करे और upload से पहले dispatcher उसे reassign कर दे, तो किसकी बात मानी जाएगी, और दोनों क्या देखते हैं? POD कौन-सा समय दर्ज करता है, फ़ोन पर confirm का या upload का, और ऑफ़लाइन रहते फ़ोन की घड़ी या timezone बदल जाए तो? क्या code फ़ील्ड में Arabic-Indic अंक स्वीकार होते हैं?

POD-LIFE-01 fail होने पर बग रिपोर्ट। शीर्षक: "[Android] POD screen reopens empty after process death: photo and typed code lost (order D-5531)"। Environment: डिवाइस मॉडल और OS वर्ज़न; ऐप वर्ज़न और build (5.0 और उसका build number); ऐप उस स्थिति तक कैसे पहुँचा (5.0 का fresh install या 4.9 से अपडेट — यहाँ यह मायने रखता है क्योंकि अपडेट लोकल डेटा migrate करता है); नेटवर्क प्रकार; orientation; UI भाषा; font size; permission की स्थिति (location और camera की अनुमति); test courier account और order। Steps में exact command लिखें और बताएँ कि ऐप Recents से दोबारा खोला गया। Screen recording और kill से दोबारा खुलने तक का logcat output लगाएँ।

अपना काम जाँचें। हर सिनेरियो में ऐसी स्थिति हो जिसे आप पैदा कर सकें और ऐसा observation जिसे आप स्क्रीन पर और डेटा में जाँच सकें: "offline mode टेस्ट करें" में कोई observation नहीं है, और "POD काम करना चाहिए" में कोई स्थिति नहीं। अगर आपके कारण material से आते हैं तो आपका क्रम अलग हो सकता है, लेकिन जिस plan में नेटवर्क, अपडेट और process death का सिनेरियो नहीं है, उसने इस release के तीन सबसे बड़े जोखिम छोड़ दिए हैं। IDs, शब्दों और दस सिनेरियो के क्रम से फ़र्क़ नहीं पड़ता; कैटलॉग के क्षेत्रों का coverage, R1–R4 से जुड़ाव और खुले सवाल मायने रखते हैं।

इस topic में आपकी प्रगति

QA रोडमैप का हिस्सा

इस गाइड में बताए गए टूल्स

states और events परिभाषित करें, फिर transition तालिका, वैध/अमान्य transition टेस्ट और 0-switch/1-switch coverage जनरेट करें।

टेस्ट डिज़ाइन

ऐसा सार्वजनिक endpoint पाएँ जो कोई भी HTTP स्टेटस कोड लौटाए, वैकल्पिक देरी और कस्टम JSON बॉडी के साथ, ताकि क्लाइंट की error हैंडलिंग टेस्ट हो सके।

API टेस्टिंग

लोकलाइज़ेशन टेस्टिंग के लिए अरबी नाम, पते, वाक्य, संख्याएँ (अरबी-हिंदसी अंक) और RTL edge case जनरेट करें।

टेस्ट डेटा

i18n और RTL/LTR मिश्रण जाँचने के लिए एक ही रिकॉर्ड कई भाषाओं (अंग्रेज़ी, अरबी, हिंदी और अन्य) में जनरेट करें।

टेस्ट डेटा

सऊदी अरब, जॉर्डन, UAE, भारत, US, UK और अन्य देशों के लिए सही फ़ॉर्मेट वाले टेस्ट फ़ोन नंबर जनरेट करें।

टेस्ट डेटा

रिस्पॉन्स साइज़ का विश्लेषण: कच्चे बनाम compressed बाइट, हेडर का साइज़, JSON ढाँचे का भार और सबसे बड़े फ़ील्ड।

परफ़ॉर्मेंस

फ़ीचर के विवरण और फ़ील्ड सूची से संरचित टेस्ट केस (id, शीर्षक, पूर्व-शर्तें, स्टेप, अपेक्षित परिणाम, प्राथमिकता) जनरेट करें।

टेस्ट डिज़ाइन

Mutqan Soft कैसे मदद कर सकता है

और गाइड

और गाइड
टेस्ट डिज़ाइन

मोबाइल टेस्टिंग: एक व्यावहारिक गाइड

मोबाइल ऐप कैसे टेस्ट करें: ऐप के प्रकार, डिवाइस fragmentation, डिवाइस मैट्रिक्स, इंटरप्शन, नेटवर्क, permissions, सुरक्षा, एक्सेसिबिलिटी और ऑटोमेशन।

17 मिनट पढ़ने का समय
टेस्ट डेटा

लोकलाइज़ेशन टेस्टिंग

लोकलाइज़ेशन टेस्टिंग गाइड: i18n बनाम l10n, अनुवाद गुणवत्ता, plural रूप, pseudo-localization, हिजरी तारीख़, अंक, मुद्रा, Unicode और ऑटोमेशन।

16 मिनट पढ़ने का समय
टेस्ट डिज़ाइन

टेस्ट केस कैसे लिखें

भरोसेमंद टेस्ट केस कैसे लिखें: हर केस के ज़रूरी फ़ील्ड, कॉपी-रेडी टेम्पलेट, लॉगिन का उदाहरण, और वे तकनीकें जो असली बग पकड़ती हैं।

5 मिनट पढ़ने का समय
टेस्ट डिज़ाइन

विज़ुअल एक्सेसिबिलिटी टेस्टिंग

WCAG 2.2 के अनुसार contrast, रंग का उपयोग, alt text, resize और reflow, text spacing, target size, motion और dark mode कैसे टेस्ट करें, checklists सहित।

11 मिनट पढ़ने का समय
ऑटोमेशन

मोबाइल टेस्ट ऑटोमेशन की व्याख्या

मोबाइल टेस्ट ऑटोमेशन कैसे काम करता है: Appium, Espresso और XCUITest की तुलना, accessibility-id locators, flakiness के स्रोत, device farm और CI pipeline।

12 मिनट पढ़ने का समय
बग विश्लेषण

बग रिपोर्ट कैसे लिखें

ऐसी बग रिपोर्ट कैसे लिखें जिस पर डेवलपर काम कर सकें: अहम फ़ील्ड, कॉपी-रेडी टेम्पलेट, पूरा उदाहरण, severity बनाम priority, और बचने लायक गलतियाँ।

5 मिनट पढ़ने का समय