Skip to main content
Mobile App Testing·Lesson 2 of 5

Emulators vs Real Devices

One of the first decisions in mobile testing is what to test on. Each option has trade-offs.

Emulators and Simulators

Android Emulator

The Android Emulator (part of Android Studio) creates a virtual Android device on your computer.

Setup:

  1. Install Android Studio
  2. Open AVD Manager (Android Virtual Device)
  3. Create a device profile (e.g., Pixel 7, API 34)
  4. Download the system image
  5. Launch the emulator

Advantages:

  • Free
  • Test on any Android version
  • Quick to create and destroy
  • Can simulate GPS, battery, network conditions
  • Good for automated testing

Limitations:

  • Slower than real devices
  • Can't test hardware features (camera, fingerprint, NFC)
  • Performance doesn't match real device behavior
  • Touch responsiveness differs

iOS Simulator

The iOS Simulator (part of Xcode) runs iOS apps on your Mac. Note: it's a "simulator" not an "emulator" — it runs on your Mac's CPU, not a virtualized ARM chip.

Setup:

  1. Install Xcode from the Mac App Store
  2. Open Xcode → Settings → Platforms → Download iOS simulators
  3. Open Simulator app or run from Xcode

Advantages:

  • Fast — runs at near-native speed
  • Test on any iPhone/iPad model
  • Free (Xcode is free)
  • Good for UI testing and screenshots

Limitations:

  • Requires a Mac
  • Can't test push notifications (real device only)
  • Can't test camera, biometrics, or Bluetooth
  • Performance characteristics differ from real hardware

Real Devices

Nothing beats testing on the actual hardware your users hold in their hands.

When real devices are essential:

  • Performance testing (CPU, memory, battery)
  • Hardware features (camera, GPS, sensors)
  • Touch and gesture accuracy
  • Push notifications
  • Biometric authentication (Face ID, fingerprint)
  • Final validation before release

Challenges:

  • Expensive to maintain a device lab
  • Hard to cover all device/OS combinations
  • Devices degrade over time
  • Physical management overhead

Cloud Device Farms

Services that give you remote access to real devices:

ServiceKey Features
BrowserStack3000+ real devices, automated + manual testing
Sauce LabsReal devices + emulators, CI/CD integration
AWS Device FarmPay-per-minute, automated testing
Firebase Test LabFree tier available, Robo tests, Google devices
LambdaTestReal devices, cross-browser + mobile testing

How it works:

  1. Upload your app (APK/IPA) or connect via URL
  2. Select devices and OS versions
  3. Run manual sessions or automated tests
  4. View results, screenshots, and video recordings

The Testing Strategy

Use a combination based on your phase:

PhaseEnvironmentWhy
DevelopmentEmulator/SimulatorFast iteration, easy debugging
Feature testingEmulator + 2-3 real devicesCatch platform-specific issues
RegressionCloud device farmCover broad device matrix
Pre-releaseTop 5-10 real devicesFinal validation with real hardware

Choosing Test Devices

You can't test on every device. Pick strategically:

By Market Share

Check your analytics or global stats to find your users' most common devices:

  • Top 3 Android devices (e.g., Samsung Galaxy S24, Pixel 8, Samsung A54)
  • Top 2 iOS devices (e.g., iPhone 15, iPhone 14)

By Screen Size

Cover the range:

  • Small phone (iPhone SE, Galaxy A14)
  • Standard phone (iPhone 15, Pixel 8)
  • Large phone (iPhone 15 Pro Max, Galaxy S24 Ultra)
  • Tablet (iPad, Galaxy Tab)

By OS Version

Cover current and one or two versions back:

  • iOS 17, iOS 16
  • Android 14, Android 13, Android 12

By Manufacturer (Android)

Different manufacturers customize Android differently:

  • Samsung (One UI)
  • Google Pixel (stock Android)
  • Xiaomi (MIUI)

Setting Up ADB for Android

ADB (Android Debug Bridge) connects your computer to an Android device or emulator:

# List connected devices
adb devices

# Install an app
adb install app-debug.apk

# Take a screenshot
adb exec-out screencap -p > screenshot.png

# View logs
adb logcat

# Simulate a slow network
adb shell settings put global network_watchlist_enabled 0