टेस्टर के लिए Android और iOS

Android और iOS वे दो operating systems हैं जिन पर लगभग हर mobile app ship होता है। Android को Google एक open-source core पर बनाता है और कई manufacturers इसे अपनी-अपनी system layer के साथ ship करते हैं; iOS को Apple बनाता है और यह सिर्फ़ Apple के devices पर चलता है। "User भुगतान के लिए QR code scan करता है" जैसा requirement दोनों पर एक ही है, लेकिन operating system तय करता है कि camera permission कैसे माँगी जाएगी, back gesture क्या करेगा, build testers और users तक कैसे पहुँचेगा, और कौन से OS versions अभी भी इस्तेमाल में हैं।

यह lesson उन चार platform differences को सिखाता है जो test design को सबसे ज़्यादा बदलते हैं: permissions, back navigation, stores और OS versions, और फिर वह toolkit जिससे आप हर platform पर test builds install करते हैं, device logs पढ़ते हैं और जो देखा उसे record करते हैं। हर platform को एक अलग product मानें जिसके requirements साझा हैं, और जहाँ भी व्यवहार आपकी team नहीं बल्कि platform तय करता है, वहाँ expected result हर platform के लिए अलग लिखें।

यह क्यों ज़रूरी है

सिर्फ़ एक platform पर दिखने वाले defects शायद ही कभी उस business logic में होते हैं जो दोनों platforms साझा करते हैं। वे वहाँ दिखते हैं जहाँ app operating system से मिलता है: iOS पर deny की गई permission जिसे app बार-बार माँगता रहता है, Android का back press जो confirmation step छोड़ देता है, ऐसा build जो उस OS version पर अलग व्यवहार करता है जिसे team ने कभी install ही नहीं किया, या launch से एक दिन पहले store review में अटकी release।

Tester के लिए platform के नियम जानना अस्पष्ट scenarios को सटीक expected results में बदल देता है। "Permissions test करो" हर platform पर हर permission state के लिए एक ठोस case बन जाता है; "back navigation check करो" screens और gestures की ऐसी सूची बन जाता है जिसमें हर एक की expected destination लिखी है। यह आपको यह भी बताता है कि test device से आप क्या control कर सकते हैं और क्या सिर्फ़ platform तय करता है, ताकि आप defect सही जगह report करें।

टेस्टर की नज़र से Android और iOS

Android (Google) कई manufacturers के devices पर चलता है। System का core open source है, manufacturers अपनी layers जोड़ते हैं, और apps Google Play से, दूसरे stores से या सीधे APK file से install हो सकते हैं — इसीलिए testers को debug builds आम तौर पर files के रूप में मिलते हैं। Platform एक system-wide back action, runtime permission model, और OS versions व hardware का बहुत बड़ा फैलाव देता है।

iOS (Apple) सिर्फ़ iPhone पर चलता है, iPad पर iPadOS के साथ। Apple hardware, OS, build tools (Xcode, जिसके लिए Mac चाहिए) और मुख्य distribution channel, App Store, सबको control करता है (alternative app marketplaces सिर्फ़ कुछ regions में, जैसे EU में, allowed हैं)। Apps testers तक TestFlight या registered devices से जुड़े provisioning profiles के ज़रिए पहुँचते हैं। System back button नहीं है, camera या location जैसे protected resources के लिए घोषित purpose चाहिए, और नया iOS version सभी supported devices के लिए एक ही दिन release होता है।

जो एक जैसा रहता है वह सब कुछ जो आपने पहले सीखा: requirements, test design techniques, bug reports। जो बदलता है वह platform behaviour का oracle है। नीचे के चार differences ज़्यादातर platform-specific test cases cover करते हैं, और आख़िरी section आपको हर platform पर install, inspect और record करने के tools देता है; device sizes और device matrix अगले lesson का विषय हैं।

  • Permissions: system कैसे और कितनी बार पूछता है, और deny के बाद क्या होता है।
  • Back navigation: "back" का मालिक system है या app, और हर gesture का क्या मतलब है।
  • Stores: build testers तक कैसे पहुँचता है, users तक कैसे, और store क्या जाँचता है।
  • OS versions: एक साथ कितने version चलन में हैं, और उनके बीच व्यवहार क्या बदलता है।
  • Toolkit: build device पर कैसे पहुँचता है, कौन सी developer settings मदद करती हैं, और logs व crash reports कहाँ हैं।
एक ही requirement, नियमों की दो किताबें: Android system back action जोड़ता है और deny के बाद दूसरा permission prompt दिखाने देता है; iOS हर resource के लिए एक बार पूछता है, back navigation app पर छोड़ता है और मुख्य रूप से App Store से वितरण करता है।

Android

Open-source core, कई device makers, Google Play और उसके बाहर से apps

कौन ship करता है:
Google और कई manufacturers, हर एक की अपनी system layer
Permissions:
Runtime dialog; एक deny के बाद फिर पूछ सकता है, दो के बाद चुप; "Only this time" grants
Back navigation:
हर screen पर system back button या gesture; root पर back app छोड़ देता है
Testers और users तक पहुँच:
APK सीधे install; Play के internal, closed और open tracks; staged rollout
OS versions:
कई versions सालों तक चलन में; व्यवहार OS और target API level पर निर्भर
Developer settings:
Developer options: USB debugging, “Don’t keep activities”, “Show taps”, download rate limit; emulator में network controls
Logs और crash reports:
adb logcat और ANR traces वाला adb bugreport; Android vitals में crash और ANR rates

iOS

Hardware, OS, build tools और store सबका एक ही vendor

कौन ship करता है:
सिर्फ़ Apple: उसके devices, उसके tools (Mac पर Xcode), उसका store
Permissions:
हर resource के लिए एक system dialog, फिर सिर्फ़ Settings; purpose string ज़रूरी
Back navigation:
System back नहीं: app का back button, edge swipe और swipe-down sheets
Testers और users तक पहुँच:
Expire होने वाले TestFlight builds; App Review; सात दिनों की phased release
OS versions:
एक version एक ही दिन सभी supported devices पर; कुछ बदलाव नए SDK से rebuild का इंतज़ार करते हैं
Developer settings:
Development builds चलाने के लिए Developer Mode; धीमे या lossy network के लिए Network Link Conditioner
Logs और crash reports:
Mac पर Console app और Xcode; device और Xcode Organizer में crash logs; ANR की जगह watchdog

नियम platform के मौजूदा versions के अनुसार; हर नए OS release के behaviour changes पढ़ें।

आज़माएँ: टेस्ट सिनेरियो जनरेटर

Permissions: एक dialog, नियमों के दो सेट

दोनों platforms पर protected resource (camera, location, microphone, contacts, photos, notifications) के लिए user की सहमति एक system dialog से चाहिए जिसे app न style कर सकता है न skip। अंतर sequence में है। Android पर permissions Android 6.0 से runtime पर माँगी जाती हैं; पहली deny के बाद app दोबारा पूछ सकता है, लेकिन Android 11 से दूसरी deny के बाद system dialog दिखाना बंद कर देता है, इसलिए app को Settings तक का रास्ता देना होता है। Android 11 ने location, microphone और camera के लिए "Only this time" grant भी जोड़ी, Android 12 ने approximate location जोड़ी, और Android 13 ने notifications post करने को runtime permission बना दिया। Android महीनों से इस्तेमाल न हुए app की permissions reset भी कर सकता है।

iOS पर system हर permission का dialog एक ही बार दिखाता है। Deny के बाद app उसे कभी दोबारा नहीं दिखा सकता; user को Settings app में setting बदलनी होती है, और app को यह समझाना होता है। camera, microphone, location, photos और contacts जैसे resources के लिए app की configuration में purpose string चाहिए (जैसे NSCameraUsageDescription); वह न हो तो access fail होता है और app crash हो सकता है, और App Review build reject करता है। Location में "Allow Once" जुड़ता है, जो app का इस्तेमाल रुकते ही expire हो जाता है ताकि app बाद में फिर पूछ सके, और precise-location switch भी; photos को चुने हुए items तक सीमित किया जा सकता है, notifications के लिए हमेशा से permission चाहिए, और apps के पार tracking के लिए अलग App Tracking Transparency prompt चाहिए।

App background में हो और Settings में permission बदली जाए तो app process खत्म हो सकता है: Android permission revoke होने पर उसे खत्म करता है, और iOS camera जैसी कई privacy settings के किसी भी दिशा में बदलने पर। तब app पर लौटना एक cold start है (app नए process में फिर से launch होता है), जिसे user की जगह restore करनी होती है। Mobile app test scenarios की companion guide generic permission scenarios सूचीबद्ध करती है; ऊपर के platform नियम हर एक का expected result बताते हैं।

  • Context में माँगें: dialog feature इस्तेमाल करते समय, छोटे explanation के बाद दिखे, पहले launch पर नहीं।
  • Denied: feature साफ़ message और काम करने वाले "Open Settings" action के साथ gracefully degrade हो; dialogs का loop न बने।
  • बाद में Settings से granted: लौटने पर feature reinstall के बिना काम करे।
  • Store compliance: हर permission के लिए app जो कारण बताता है वह वही कहे जो feature करता है (iOS पर purpose string; Google Play पर background location जैसी sensitive permissions के लिए ज़रूरी declaration); दोनों stores के reviewers अस्पष्ट या missing explanation reject करते हैं।

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

Worked example: QR payment flow में camera permission

Requirement: "Pay screen पर user Scan tap करता है और camera को merchant के QR code की ओर करता है। Camera उपलब्ध न हो तो user merchant code manually दर्ज कर सकता है।" Team यही feature Android और iOS दोनों पर ship करती है। नीचे वह permission behaviour है जिसकी tester हर platform से उम्मीद करता है, और यही test cases का expected-result column बनता है।

  • TC-1 (दोनों): fresh install, Scan tap करें: explanation sheet, फिर system dialog; grant करें: camera उसी flow में खुलता है।
  • TC-2 (Android 11 और बाद): एक बार deny करें, Scan फिर tap करें: system dialog दोबारा दिखता है; फिर deny करें, तीसरी बार Scan tap करें: कोई dialog नहीं, app manual entry का विकल्प और "Open Settings" button दिखाता है जो app के permission page पर पहुँचाता है।
  • TC-3 (iOS): एक बार deny करें, Scan फिर tap करें: कोई system dialog नहीं; app manual entry और "Open Settings" दिखाता है; Settings में grant करके लौटें: app restart हो चुका है और Scan camera खोलता है।
  • TC-4 (Android 11 और बाद): "Only this time" चुनें, भुगतान करें, कुछ देर app से बाहर रहें, लौटकर Scan tap करें: silent failure के बजाय dialog दोबारा दिखता है।
  • TC-5 (दोनों): Pay screen खुली रहते Settings में camera permission revoke करें, लौटें: app बिना crash के साफ़ restart होता है, और pending payment state या तो restore होती है या साफ़ तौर पर cancel।
  • TC-6 (दोनों): permission denied रहते manual code entry से भुगतान पूरा होता है, यानी deny कभी business goal नहीं रोकती।
Camera permission for "Scan a QR code to pay"

Permission state               Android 11+                   iOS
--------------------------------------------------------------------------------------
Never asked                    system dialog on request      system dialog on request
Denied once, asked again       dialog shown again            no dialog: route to Settings
Denied twice, asked again      no dialog: route to Settings  no dialog: route to Settings
"Only this time" granted       expires soon after leaving    not offered for the camera
Revoked in Settings while open process ends, relaunch        process ends, relaunch
Purpose text                   explain before the dialog     NSCameraUsageDescription

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

Back navigation: system back बनाम app का अपना back

Android में system-wide back action है: three-button navigation में button, और Android 10 से gesture navigation में edge-swipe gesture। यह जो भी screen पर है उसे मिलता है, और app तय करता है इसका मतलब: dialog बंद करना, पिछली screen पर लौटना, WebView के अंदर एक page पीछे जाना, या app की पहली screen पर app छोड़ देना। Android Up (app bar का arrow, जो app की hierarchy में ऊपर जाता है) और Back (जो user के कदम उल्टे दोहराता है) में भी फ़र्क़ करता है; deep link (ऐसा link जो app के अंदर कोई ख़ास screen खोलता है) के बाद दोनों अलग जगह ले जा सकते हैं। जो apps इसे support करते हैं, उनके लिए नए Android versions gesture पूरा होने से पहले यह preview भी दिखा सकते हैं कि back कहाँ ले जाएगा (predictive back), जिससे गलत destination तुरंत दिख जाती है।

iOS में system back नहीं है। पीछे जाना app का काम है: navigation bar के ऊपर-बाएँ back button, navigation stack के अंदर बाएँ किनारे से interactive swipe (अरबी जैसी right-to-left भाषाओं में दोनों दाईं ओर चले जाते हैं), sheet को नीचे swipe करके dismiss करना, और tabs जिनमें हर एक अपनी history रखता है। App किसी दूसरे app से खुला हो तो status bar उस app पर "Back to" link देता है। ऐसा custom navigation bar जो चुपचाप edge swipe बंद कर देता है, या ऐसी sheet जो unsaved form data के साथ dismiss हो जाती है, iOS-only defects के typical उदाहरण हैं।

  • हर screen के लिए लिखें कि हर platform पर back को क्या करना चाहिए, फिर करके देखें: destination, और unsaved data का क्या होता है।
  • Root screen पर back: Android app छोड़ देता है (या "press back again to exit" दिखाता है); iOS पर इसका समकक्ष home gesture है, जो app को सिर्फ़ background में भेजता है।
  • Request चलते समय back (Pay, Submit): action दो बार न भेजा जाए और result खोए नहीं।
  • Rotation के बाद, permission dialog के बाद, background से लौटने के बाद और deep link के बाद back: stack अब भी ठीक रहे।
  • Android पर WebView screens: back पहले page history में पीछे जाए, फिर WebView छोड़े।

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

Stores, releases और OS versions

Google Play app को Android App Bundle से publish करता है, और production से पहले internal, closed और open testing tracks, users के एक percentage तक staged rollout जिसे रोका जा सकता है, और pre-launch report देता है जो build को devices के एक set पर चलाकर crashes report करती है। Play के बाहर APK सीधे install हो सकता है, और कुछ devices Google services के बिना ही ship होते हैं। App Store Xcode से upload किया build लेता है; TestFlight उसे 100 internal और 10,000 external testers तक पहुँचाता है (builds 90 दिन में expire होते हैं, और external testers को भेजा गया पहला build beta review से गुज़रता है), App Review production build जाँचता है, और phased release update को सात दिनों में फैलाती है और pause हो सकती है। कोई भी store update कर चुके users को पिछले build पर वापस नहीं ले जाता: आप rollout रोकते या pause करते हैं और ऊँचे version number वाला fixed build ship करते हैं।

दोनों stores listing को app से मिलाते हैं: privacy declarations (Play का Data safety section, App Store के App Privacy labels), permissions के लिए बताए गए कारण, screenshots, और वे features जहाँ reviewer सच में पहुँच सकता है। Review rejection release defect है, इसलिए submission से पहले listing और app में reviewer का रास्ता test करें, उस test account समेत जो reviewer इस्तेमाल करेगा।

OS versions दोनों platforms पर अलग व्यवहार करते हैं। Android releases को API level से पहचानता है (Android 15 यानी API 35); updates manufacturers के ज़रिए devices तक पहुँचते हैं, इसलिए कई versions सालों तक चलन में रहते हैं। आपका app सबसे निचला version जिस पर वह install होगा (minSdkVersion) और वह version जिसके behaviour को वह अपनाता है (targetSdkVersion) घोषित करता है; Google Play हालिया target माँगता है, और उसे बढ़ाने से आपके app के लिए behaviour changes चालू हो जाते हैं — इसलिए target bump एक test event है। iOS एक version सभी supported devices को एक ही दिन भेजता है, बीच में कोई manufacturer नहीं होता, और हर गर्मियों में public beta आता है; apps deployment target घोषित करते हैं, और कुछ behaviour changes तभी लागू होते हैं जब app नए SDK से rebuild हो, इसलिए नया Xcode भी test event है।

  • Install path: वह build test करें जो users को मिलेगा (store track या TestFlight), सिर्फ़ developer का debug build नहीं।
  • Update path: पिछला production version install करें, इस्तेमाल करें, फिर update करें; data और sessions बचे रहने चाहिए।
  • OS set: newest version और उसका beta, oldest supported version, और वे manufacturer layers जो आपके ज़्यादातर traffic ले जाती हैं; analytics, store consoles और crash reports बताते हैं कि असल में कौन से OS versions आते हैं, जबकि web traffic की User-Agent strings कम मदद करती हैं, क्योंकि Android पर Chrome और iOS 26 से Safari frozen OS version बताते हैं (अगला lesson इसे matrix बनाता है)।
  • Forced update: back end जब पुराना version बंद करे, app यह बताए और store का link दे; Android in-app updates भी देता है।

आज़माएँ: पेयरवाइज़ टेस्टिंग जनरेटर आज़माएँ: User-Agent पार्सर

हर platform पर टेस्टर की toolkit

Emulator, simulator या असली device: यह device-strategy का फ़ैसला है जिसे mobile testing guide cover करती है; यह section मानता है कि आपके पास build और हर platform के लिए कम से कम एक device या emulator है। Android पर toolkit adb है (Android Debug Bridge, SDK platform tools में), जो USB पर तब काम करता है जब Settings में build number सात बार tap करके Developer options चालू हों और USB debugging on हो। APK adb install से install होता है; Android App Bundle (AAB) सीधे install नहीं हो सकता, इसलिए universal APK माँगें, bundletool से bundle के device APKs बनाएँ, या उसे Play की internal app sharing पर upload करें जो install link देती है। Play के testing tracks ऐसे release candidates ले जाते हैं जो बिल्कुल production की तरह signed होते हैं।

iOS पर build असली device तक TestFlight (invitation या public link) से पहुँचता है, या development या ad hoc build के रूप में जिसके provisioning profile में device का UDID (unique device identifier) हो और जो Xcode की Devices and Simulators window से install होता है; iOS 16 से development-signed build चलाने के लिए Privacy & Security में Developer Mode चालू करना होता है। iOS Simulator को Mac से xcrun simctl चलाता है: app install करना, deep link खोलना, permission reset करना, screen record करना। दो तरह की developer settings हर test plan में जगह पाने लायक हैं। पहली है Android का "Don’t keep activities", जो हर screen को छोड़ते ही नष्ट कर देता है, जिससे खोई हुई form state और लौटने पर crash सामने आते हैं। दूसरी है network throttling: iOS का Network Link Conditioner (Settings > Developer, जो device को Xcode के साथ इस्तेमाल करने पर दिखता है) धीमे, packet खोने वाले या failing network की नक़ल करता है, Android emulator के network controls धीमा network type, कमज़ोर signal या बंद data connection set करते हैं, और हाल के Android versions असली device पर Developer options में network download rate limit भी देते हैं।

Logs आपका सबूत हैं। Android सब कुछ logcat में लिखता है: हर line में time, process id, V (verbose) से F (fatal) तक priority और एक tag होता है; adb logcat उसे stream करता है, --pid उसे आपके app तक सीमित करता है, और adb bugreport पूरे logs को ANR traces के साथ developer के लिए एक zip में पैक करता है। ANR (Application Not Responding) वह "isn’t responding" dialog है जो Android तब दिखाता है जब app का main thread (जो screen बनाता है और taps handle करता है) blocked रहता है, जैसे लगभग पाँच सेकंड तक input handle न करना। Play crash और ANR rates को Android vitals में track करता है, जहाँ user-perceived crash rate 1.09% से ऊपर या ANR rate 0.47% से ऊपर bad behaviour गिना जाता है और Google Play पर app की visibility घटा सकता है। iOS एक unified log रखता है जिसे आप device जोड़कर Mac पर Console app में live पढ़ते हैं, या Xcode के console में जब app Xcode से launch हुआ हो। Crash logs (.ips files) device पर Settings > Privacy & Security > Analytics & Improvements > Analytics Data में रहते हैं, और Xcode का Organizer उन TestFlight और App Store users के symbolicated crashes (memory addresses की जगह function names के साथ) इकट्ठा करता है जो उन्हें share करते हैं। iOS में ANR dialog नहीं है: watchdog उस app को terminate कर देता है जो main thread block करता है या बहुत धीरे launch होता है, और crash log में यह exception code 0x8badf00d के रूप में दिखता है।

  • एक command में permission states: Android पर adb shell pm grant और pm revoke (revoke app process खत्म करता है, Settings की तरह), iOS Simulator पर simctl privacy grant, revoke या reset; simctl privacy में camera service नहीं है, इसलिए worked example जैसे camera cases के लिए असली iPhone चाहिए; असली device पर "never asked" का मतलब है uninstall और reinstall।
  • Screen recording: Android पर adb shell screenrecord या Quick Settings का built-in recorder (Android 11 और बाद), Developer options में "Show taps" चालू करके ताकि हर tap दिखे; iOS पर Control Center का recorder, cable से Mac पर QuickTime, या Simulator पर simctl io recordVideo।
  • हर platform bug के साथ जोड़ें: Android पर logcat का excerpt या bug report, iOS पर crash log या Console का excerpt, और gesture या dialog की recording। TestFlight testers beta app के अंदर से screenshot और comment भी भेज सकते हैं।
  • Logcat की capture लंबी होती है, और उसकी lines में आपके package का नाम नहीं बल्कि process id होती है; ऐसा regular expression जो सिर्फ़ आपके app की process id और W, E, F priorities की lines रखे, उसे पढ़ने लायक attachment बना देता है।
# Android (adb from the SDK platform tools; USB debugging on)
adb devices                                  # the phone is listed as "device"
adb install -r app-debug.apk                 # install or update the build
adb shell pm grant com.example.pay android.permission.CAMERA
adb shell pm revoke com.example.pay android.permission.CAMERA
adb logcat --pid=$(adb shell pidof -s com.example.pay)   # your running app only
adb bugreport bugreport.zip                  # full logs and ANR traces
adb shell screenrecord /sdcard/scan.mp4      # Ctrl+C stops it; then:
adb pull /sdcard/scan.mp4

# iOS Simulator (xcrun simctl, from Xcode on a Mac)
xcrun simctl install booted Pay.app
xcrun simctl privacy booted reset location com.example.pay   # back to "never asked"
xcrun simctl openurl booted "pay://scan"
xcrun simctl io booted recordVideo scan.mp4

आज़माएँ: Regex टेस्टर

आम गलतियाँ

  • जहाँ platform व्यवहार तय करता है वहाँ दोनों platforms के लिए एक ही expected result लिखना, जिससे iOS का "deny, फिर दोबारा पूछो" case failed mark हो जाता है क्योंकि dialog नहीं दिखा।
  • Permissions सिर्फ़ happy path (पहली बार में granted) पर test करना, और deny, दूसरी deny, "Only this time" और Settings से revoke कभी न करना।
  • Android पर back navigation सिर्फ़ on-screen back button से जाँचना, gesture से कभी नहीं, या iOS पर कभी किनारे से swipe न करना।
  • सिर्फ़ developer का debug build उन devices पर test करना जो उसी OS पर हैं जिसके साथ आए थे, जिससे users को मिलने वाला store या TestFlight build, newest OS, उसका beta और oldest supported version कभी exercise नहीं होते।
  • Platform के नियम को app defect बताकर report करना, जैसे कि iOS permission dialog दो बार नहीं दिखाता, बजाय Settings तक के missing route को report करने के।
  • Crash या freeze को device log के बिना report करना, जिससे developer को अंदाज़ा लगाना पड़ता है: Android पर logcat lines या ANR traces वाला bug report, iOS पर device या Xcode से crash log जोड़ें।

QA का नज़रिया

असली team में tester दोनों platforms cover करता है, तब भी जब developers Android और iOS groups में बँटे हों। Refinement के दौरान हर उस feature के लिए पूछें जो protected resource, navigation या release को छूता है: हर platform पर expected behaviour क्या है, और किसने तय किया। जवाबों को platform-specific expected results के रूप में record करें, और एक छोटी platform checklist (permission states, हर screen पर back, install और update paths, OS versions) रखें जिससे हर release गुज़रे।

कम से कम एक Android और एक iOS device newest OS पर और एक oldest supported version पर रखें, और हर नया OS beta जारी होते ही एक spare device पर install करें। Bug report में platform, OS version, device, build type (debug, internal track, TestFlight, production) और exact permission state या gesture लिखें, और logcat excerpt या crash log और एक छोटी screen recording जोड़ें: यही developer को platform-specific defect मिनटों में reproduce करने देता है।

अभ्यास

Location-based store finder के लिए platform-specific test cases लिखें

आपका काम

एक retail app "Stores near me" जोड़ता है: Nearby tab location permission माँगता है और stores को दूरी के क्रम में दिखाता है। Location उपलब्ध न हो तो user शहर का नाम type कर सकता है। Android और iOS के लिए permission test cases हर platform के expected result के साथ लिखें, फिर Nearby tab और store detail screen के back-navigation checks जोड़ें।

अंत में दो release सवाल लिखें जो आप build के stores पर जाने से पहले पूछेंगे।

चरण
  1. हर platform पर permission states सूचीबद्ध करें: never asked, granted, एक बार denied, दो बार denied (Android), "Only this time" (Android) या "Allow Once" (iOS), precise या approximate (iOS, और Android 12 व बाद), Settings से revoked।
  2. हर state के लिए Nearby tab का expected behaviour लिखें, शहर type करने वाले fallback समेत।
  3. लिखें कि back (Android gesture और button, iOS edge swipe और back button) Nearby tab पर और उससे खुली store detail screen पर क्या करे।
  4. दो release सवाल note करें।
  5. वे commands लिखें जो Settings में tap किए बिना Android device और iOS Simulator पर app को हर permission state में डालती हैं।
मॉडल उत्तर दिखाएँ
मॉडल उत्तर

Permissions, Android: Nearby पर पहला tap: छोटा explanation, फिर precise और approximate विकल्पों और "Only this time" वाला system dialog; approximate: list दूरी से sort होती है, साथ में note कि precision कम है; एक बार deny: अगली visit फिर पूछती है; दो बार deny: कोई dialog नहीं, tab शहर का field और "Open Settings" button दिखाता है; "Only this time": अभी काम करता है, बाद की visit पर फिर पूछता है; tab पर रहते Settings से revoke: app restart होता है, tab बिना crash के शहर के field पर खुलता है।

Permissions, iOS: पहला tap: explanation, फिर "Allow Once", "Allow While Using App", "Don’t Allow" और precise switch वाला system dialog; "Allow Once": इस session में काम करता है और अगले launch पर फिर पूछता है; "Don’t Allow": tab शहर का field और "Open Settings" दिखाता है, और system dialog कभी नहीं लौटता; precise switch off: list दूरी से sort होती है, साथ में note कि precision कम है; Settings में grant करके लौटें: list reinstall के बिना दूरी से sort होती है, भले ही बीच में app relaunch हुआ हो; app background में रहते Settings से revoke: लौटने पर tab बिना crash के शहर का field दिखाता है।

Back navigation, Android: store detail screen पर back और Up दोनों Nearby list पर उसी scroll position पर लौटाते हैं; Nearby tab (root tab) पर back तय नियम के मुताबिक़ app छोड़ता है या पिछले tab पर लौटता है, कभी blank screen पर नहीं; store के deep link के बाद Up Nearby list पर जाता है, back वहाँ लौटता है जहाँ से user आया था। iOS: detail screen पर back button है और edge swipe काम करता है; user tabs बदलकर लौटे तो Nearby tab अपनी history रखता है।

Release सवाल: क्या store listing और app में location का purpose text feature से मेल खाता है (सिर्फ़ stores near me, कोई background tracking नहीं), और submission से पहले release candidate किन OS versions और किस build (internal track, TestFlight) पर test होगा?

Commands, Android: adb uninstall com.example.retail फिर adb install -r app.apk "never asked" देता है; adb shell pm grant com.example.retail android.permission.ACCESS_COARSE_LOCATION और साथ में ACCESS_FINE_LOCATION precise देता है, सिर्फ़ coarse approximate देता है; adb shell pm revoke revoked देता है और app process खत्म करता है; "denied once", "denied twice" और "Only this time" के लिए dialog का ही जवाब दें। iOS Simulator: xcrun simctl privacy booted reset location com.example.retail "never asked" पर लौटाता है, और grant location या revoke location granted और denied states set करते हैं; "Allow Once" और precise switch dialog का जवाब देकर set होते हैं; असली iPhone पर permission सिर्फ़ Settings से या reinstall करके बदलती है।

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

क्या iOS apps test करने के लिए Mac चाहिए?

iPhone पर app चलाने के लिए Mac पर Xcode से बना build चाहिए, जो आम तौर पर TestFlight या provisioning profile से बाँटा जाता है। TestFlight build device पर install करके test करने के लिए tester को Mac नहीं चाहिए, लेकिन build ख़ुद macOS पर Xcode से बनता है, team के Mac पर या किसी cloud build service में, और iOS Simulator सिर्फ़ macOS पर चलता है।

Deny करने के बाद iOS permission dialog दोबारा क्यों नहीं दिखाता?

यही platform का नियम है: iOS हर permission का dialog एक बार दिखाता है। App को denied state पहचाननी चाहिए, बताना चाहिए कि क्या missing है और Settings app तक का रास्ता देना चाहिए। Report करने लायक defect Settings तक का missing या टूटा हुआ route है, न कि गायब dialog।

क्या Android app Google Play के बिना test हो सकता है?

हाँ। Debug या release APK सीधे device या emulator पर install हो सकता है, और ज़्यादातर test builds ऐसे ही मिलते हैं। Release से पहले Play testing track से आया build भी test करें, क्योंकि signing, app bundle से Play के बनाए APKs, और in-app updates व integrity checks जैसे Play features हाथ से install किए APK से अलग व्यवहार करते हैं।

क्या store review का reject होना defect है?

उसे defect की तरह लें: वह release रोकता है। आम कारण हैं reviewer के device पर crash, ऐसा feature जहाँ reviewer पहुँच नहीं पाता, अस्पष्ट permission purpose text, या app से मेल न खाती listing। Submission से पहले reviewer का रास्ता और listing test करना इनमें से ज़्यादातर रोक देता है।

संदर्भ

  • 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 टेस्ट, और बेहतरीन तरीके।
  • Android vitalsAndroid Developers (Google)उपयोगकर्ताओं के डिवाइस से Google Play द्वारा जुटाए गए ऐप-गुणवत्ता मेट्रिक्स — core vitals में user-perceived crash और ANR rate — और वे bad-behavior thresholds जो ऐप की दृश्यता पर असर डालते हैं।

Mutqan tools से अभ्यास करें

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

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

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

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

किसी फ़ीचर के लिए functional, negative, security, usability और compatibility पहलुओं को कवर करने वाले उच्च-स्तरीय टेस्ट सिनेरियो जनरेट करें।

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

User-Agent स्ट्रिंग से ब्राउज़र, वर्शन, इंजन, OS, डिवाइस टाइप और बॉट की पहचान करें।

वेब

रेगुलर एक्सप्रेशन को लाइव टेस्ट करें — मैच हाइलाइटिंग, कैप्चर ग्रुप और रिप्लेस प्रीव्यू के साथ।

यूटिलिटीज़

और गहराई से

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

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