Simulators and Emulators
What the iOS Simulator and Android Emulator can and can't do, how to set them up for testing, and how to decide when only a real device will do.
The team behind a running app shipped version 3.0 with a shiny new live-run tracker. It passed every test case. The map followed the route perfectly, the distance was right, the summary screen looked great. Every single test had been run on the iOS Simulator using its built-in “City Run” location.
Launch day: hundreds of one-star reviews. “Stopped recording after 10 minutes.” On real iPhones, once the screen locked, the app lost its location updates, because the background location setup was wrong. The simulator never locked, never got hot, never lost GPS signal under a bridge. It just kept feeding perfect coordinates.
The simulator wasn’t the problem. Testing only on the simulator was.
Why it matters
Nobody can own every phone. There are dozens of iPhone and iPad models and thousands of Android devices (that’s fragmentationFragmentationThe huge variety of device models, screen sizes and OS versions an app must support.Open in glossary →). Virtual devices let you test many screen sizes and OS versions for free, in seconds. But they are imitations, and you need to know exactly where the imitation ends, so the right tests happen on a real deviceReal deviceA physical phone or tablet used for testing, as opposed to an emulator or simulator.Open in glossary →.
By the end of this lesson you’ll know:
- the difference between a simulatorSimulatorSoftware that imitates a device's behavior on your computer, like Apple's iOS Simulator.Open in glossary →, an emulatorEmulatorSoftware that imitates a real device's hardware and OS on your computer, like the Android Emulator.Open in glossary → and a real device,
- how to set up and use the iOS Simulator and the Android Emulator like a tester,
- which tests you can trust on a virtual device, and which ones you can’t.
Simulator vs emulator vs real device
People use the words loosely, but there is a real difference:
- The iOS Simulator (part of Xcode, Mac only) runs your app compiled for the Mac. It imitates how iOS behaves, but it does not pretend to be iPhone hardware. That’s why it’s fast.
- The Android Emulator (part of Android Studio, on Mac, Windows and Linux) runs a complete Android system image on a virtual phone: virtual CPU, sensors, modem, battery. It runs the same APK you ship.
- A real device is a physical phone, with the real camera, GPS, radio, battery and the manufacturer’s own changes to the OS.
iOS Simulator
Imitates the software
- Your appcompiled for the Mac's processor
- iOS frameworkssimulator versions running on macOS
- macOSyour Mac's operating system
- Mac hardwareMac CPU, GPU, RAM, network
No phone hardware is emulated at all. Fast, but not a real iPhone.
Android Emulator
Imitates the device
- Your appthe same APK you ship
- Android OSa real system image (API level)
- Virtual hardwareemulated phone: sensors, modem, battery…
- Your computerhost CPU, GPU, RAM, network
A full virtual phone. Closer to reality, but still powered by your computer.
Real device
The real thing
- Your appinstalled build (TestFlight, APK…)
- iOS / Androidplus vendor changes (Samsung, Xiaomi…)
- Phone hardwarecamera, GPS, modem, Bluetooth, NFC, sensors
- Battery & radioreal power limits, real signal
What your users have. Slow to scale, but tells the truth.
What each is good for
| iOS Simulator | Android Emulator | Real device | |
|---|---|---|---|
| Cost and speed | Free, starts in seconds | Free, starts in under a minute | Costs money, has to be charged, updated, shared |
| Screen sizes and OS versions | Every current iPhone/iPad, several iOS versions | Any size, foldables, tablets, many API levels | Only the phones you own |
| Layout, text, translations, dark mode | Great | Great | Great |
| Fake location, battery, network | Location yes; battery no; network via Mac tools | Location, battery, cellular, signal: all built in | Only by really going places |
| Deep links, push payloads, permissions | Yes | Yes | Yes |
| Real performance | No (runs on the Mac’s CPU) | No (uses your computer’s CPU/GPU) | Yes |
| Camera | None | Virtual scene or webcam | Yes |
| Bluetooth, NFC, real cellular | No | Very limited | Yes |
| Phone calls and SMS | No | Simulated incoming call / SMS | Yes |
| Face ID / fingerprint | Simulated match / no match | Simulated fingerprint touch | Real sensor |
| Battery drain, heat, memory pressure | No | No | Yes |
Simulator, emulator or real device?
The honest answer is often “start virtual, finish real”. Pick a scenario to see why:
Simulator, emulator or real device?
Pick what you need to test and see where to test it.
Recommendation
Start on the simulator/emulator, sign off on a real device
You can check the content, the tap action and the permission prompt without a phone. But the real delivery path (APNs or FCM), lock-screen behavior, Focus / Do Not Disturb and battery optimization that kills background apps only show their true colors on real hardware.
Drag an .apns file onto the window or use xcrun simctl push. Real remote push works on Apple silicon / T2 Macs with macOS 13+.
Images with Google Play or Google APIs receive real FCM pushes.
The only way to see real delivery timing, Focus modes and vendor battery savers.
Tester tip: Test the "app killed" case: swipe the app away, send a push, then tap it. Deep-link-from-push bugs love this path.
Setting up the iOS Simulator
The Simulator comes with Xcode, which is free on the Mac App Store. You don’t need to be a developer to use it.
- Install Xcode from the Mac App Store and open it once so it can install its extra components. iOS runtimes for older versions can be added later in Xcode › Settings › Components (called Platforms in older Xcode versions).
- Open the Simulator. In Xcode choose Xcode › Open Developer Tool › Simulator. You can also keep it in your Dock and open it like any app.
- Choose a device. Use File › Open Simulator and pick a model and iOS version, for example a small iPhone SE and a large Pro Max. To add more models, go to Window › Devices and Simulators in Xcode, open the Simulators tab and click +.
- Install the app. If a developer runs the app from Xcode, it installs automatically. If they give you a simulator build (a
.appfolder), drag it onto the Simulator window. - Start testing, using the menus below to fake the world around the app.
The menus testers use most
| Menu | Item | What it’s for |
|---|---|---|
| Features | Face ID › Enrolled, then Matching Face / Non-matching Face | Test biometric loginBiometric authenticationUnlocking a saved login with Face ID, Touch ID or a fingerprint.Open in glossary → success, failure and fallback |
| Features | Location › Custom Location…, Apple, City Run, Freeway Drive | Teleport to an address or play a moving route |
| Features | Toggle Appearance (⇧⌘A) | Switch between light and dark modeDark modeA display setting that uses light text on dark backgrounds.Open in glossary → |
| Features | Toggle Increased Contrast | Check the high-contrast accessibility setting |
| Device | Rotate Left / Right (⌘← / ⌘→) | Test orientationOrientationWhether the device is held upright (portrait) or sideways (landscape).Open in glossary → changes and lost state |
| Device | Shake (⌃⌘Z) | Trigger “shake to report a bug” or “shake to undo” |
| Device | Home (⇧⌘H), Lock (⌘L) | Send the app to the background: an app lifecycleApp lifecycleThe states an app moves through: not running, foreground, background, suspended and terminated.Open in glossary → test |
| Device | Erase All Content and Settings… | A clean phone, like a fresh install |
| I/O | Keyboard › Toggle Software Keyboard (⌘K) | Show the on-screen keyboard (see the warning below) |
| File | Save Screen (⌘S), Record Screen (⌘R) | Screenshots and videos for your bug reportBug reportA clear written description of a bug so developers can reproduce and fix it.Open in glossary → |
| Debug | Slow Animations | Catch glitches that happen too fast to see |
You can also drag files onto the Simulator window: photos and videos go to the Photos app (handy for testing an avatar upload), a .app installs, and an .apns file delivers a test push notificationPush notificationA message an app sends to the device that appears even when the app is closed.Open in glossary →.
Useful command-line tricks
Xcode includes simctl, which is great for repeatable setups. booted means “the simulator that is currently running”.
xcrun simctl list devices # all simulators and their state
xcrun simctl install booted ShopApp.app # install a simulator build
xcrun simctl openurl booted "shopapp://product/42" # open a deep link
xcrun simctl location booted set 52.5219,13.4132 # set GPS to Berlin
xcrun simctl push booted com.example.shopapp payload.apns # send a test push
xcrun simctl ui booted appearance dark # dark mode
xcrun simctl ui booted content_size accessibility-extra-large # very large text
xcrun simctl io booted screenshot bug.png # screenshot
xcrun simctl io booted recordVideo bug.mp4 # record (Ctrl+C to stop)
Setting up the Android Emulator
The emulator comes with Android Studio, free for Mac, Windows and Linux.
- Install Android Studio from developer.android.com and finish the setup wizard. It downloads the SDK, the emulator and a first system image.
- Open the Device Manager. Use the Device Manager icon in the right-hand toolbar, or View › Tool Windows › Device Manager.
- Create a virtual device. Click + › Create Virtual Device, then pick a hardware profile: a phone such as Pixel or Medium Phone, a small phone, a tablet or a foldable.
- Choose a system image (API level). Each Android version has an API level (Android 15 is API 35, for example). Pick images marked Google Play if the app needs Google services like maps or push. On Apple silicon Macs choose arm64 images; on Intel/AMD PCs choose x86_64.
- Name it and adjust settings. You can set the startup orientation, RAM, storage and which camera to use (virtual scene or webcam). Click Finish.
- Start it with the ▶ button. By default it opens inside Android Studio’s Running Devices window; it can also run as a separate window.
Extended controls
Click the ⋮ / … (More) button on the emulator’s toolbar to open Extended controls. This is where you fake the outside world:
| Panel | What you can do | Example test |
|---|---|---|
| Location | Set a single point, save places, play a route, import GPX/KML | Delivery zone ends at the city border |
| Cellular | Network type (e.g. LTE, 5G), signal strength, data and voice status, roaming | App on a weak signal or while roaming |
| Battery | Charge level, charger connection, battery health and status | Low-battery banner, Battery Saver behavior |
| Phone | Call the device from a number, send an SMS | Incoming call in the middle of checkout; SMS one-time codes |
| Fingerprint | “Touch” the sensor with an enrolled finger | Fingerprint login, and a non-enrolled finger failing |
| Camera | Use a virtual 3D room or your webcam | Camera screen opens, permission prompts |
| Virtual sensors | Rotate the device, change accelerometer, proximity, light | Rotation, shake, auto-brightness logic |
| Record and Playback | Record the screen as a video | Attach a video to a bug report |
Try it yourself. Change the location, battery, network and theme and watch the delivery app react:
Extended controls playground
A food delivery app running in an Android Emulator. Fake the world around it.
Deliver to
Alexanderplatz
Order #4821 is on the way
Live tracking · courier 1.2 km away
Near you
- CCurry CornerStreet food · 20–30 min4.6
- SSpree SushiJapanese · 25–35 min4.8
- DDöner LabTurkish · 15–25 min4.5
Change a control on the right. Each one is a real setting in the emulator's Extended controls (the "…" button on its toolbar).
Installing builds
- Drag a
.apponto the Simulator window, or runxcrun simctl install booted ShopApp.app. - The build must be made for the simulator. An
.ipafile or a TestFlightTestFlightApple's service for distributing beta builds of iOS apps to testers before App Store release.Open in glossary → build is made for real iPhones and won’t install on the Simulator. Ask the developers for a simulator build (or run it from Xcode). - To start fresh, delete the app (long-press its icon, like on a phone) or use Device › Erase All Content and Settings…
- Drag an
.apkonto the emulator window, or runadb install app.apk(see adb basics). - The same APK works on emulators and real phones, as long as it includes code for the emulator’s processor type. Most apps do.
- An
.aab(Android App Bundle) is meant for Google Play and can’t be dragged in directly. Ask for an APK, or install through Google Play internal testing or Firebase App DistributionFirebase App DistributionGoogle's service for sending pre-release Android (and iOS) builds to testers.Open in glossary →. - To start fresh: Settings › Apps › the app › Storage › Clear storage, or Wipe Data for the whole virtual device in the Device Manager.
Useful toggles for testers
These settings find a surprising number of bugs. All of them work on virtual devices:
| What | iOS Simulator | Android Emulator |
|---|---|---|
| Dark mode | Features › Toggle Appearance (⇧⌘A) | Quick Settings tile, or Settings › Display (Display & touch on newer versions) › Dark theme |
| Large text | Settings › Accessibility › Display & Text Size › Larger Text, or Xcode’s Environment Overrides while running | Settings › Display › Display size and text (font size) |
| Language and region | Settings › General › Language & Region, or the scheme’s App Language in Xcode | Settings › System › Languages |
| Rotation | Device › Rotate Left / Right | Rotate buttons on the emulator toolbar |
| Location | Features › Location | Extended controls › Location |
Large textDynamic TypeThe phone setting that lets users make text bigger or smaller across apps.Open in glossary → and long languages (German, Finnish) are the fastest way to find truncationTruncationText that gets cut off because it doesn't fit its space.Open in glossary → bugs. Changing the localeLocaleRegional settings that control language and formats for dates, numbers and currency.Open in glossary → also changes date, number and currency formats, so check prices and dates while you’re at it.
What to test where
Safe to test on simulators and emulators
- Layout on every screen size, including the smallest supported phone, tablets and foldables, and the safe areaSafe areaThe part of the screen not covered by the notch, Dynamic Island, rounded corners or home indicator.Open in glossary → around notches.
- Flows and logic: sign-up, search, cart, settings, error messages.
- System settings: dark mode, large text, languages, rotation.
- Fake-able conditions: GPS location and routes, battery level (Android), network type, permissions granted or denied.
- Entry points: deep linksDeep linkA link that opens a specific screen inside an app instead of just its home screen.Open in glossary →, push payloads, opening the app from a share sheet.
Needs a real device
- Hardware: camera, Bluetooth accessories, NFC payments, real biometrics, haptics.
- Performance: start-up time, scrolling, animations, memory on low-end phones.
- The physical world: real GPS outdoors, weak signal, switching between Wi-Fi and mobile data, battery drain and heat.
- Real interruptionsInterruptionAnything that takes the user away from the app mid-task: a call, an alarm, a notification, low battery.Open in glossary →: phone calls (always on iPhone), alarms, low-power mode, the OS killing the app in the background.
- Manufacturer quirks: Samsung, Xiaomi and others change Android, especially battery savers that kill background work and notifications.
Bugs that slip through when you only test virtually
| # | Bug | What you see | Typical severity |
|---|---|---|---|
| 1 | Background tracking stops | Run or delivery tracking freezes when the screen locks on real phones | High |
| 2 | Keyboard covers the button | On the Simulator the hardware keyboard hid the on-screen one; on a phone you can’t reach Pay | High |
| 3 | Janky scrolling | Smooth on the emulator, stuttering on a budget phone with 3 GB RAM | Medium |
| 4 | Camera screen crashes or stays black | The scanner was never exercised because the Simulator has no camera | High |
| 5 | Push never arrives | Works with drag-and-drop payloads, but the real server uses the wrong APNs environment | High |
| 6 | Killed by battery saver | Reminders or uploads silently stop on some Android brands | Medium |
| 7 | State lost after background kill | Real phones with little memory kill the app; the cart or form is empty on return | Medium |
| 8 | Breaks on network switch | Upload fails when walking out of Wi-Fi onto mobile data | Medium |
Practice: where would you test it?
You’re planning testing for a shopping and fitness app with three emulators, two simulators and two real phones. Sort each idea into the right place:
Sort the test ideas
Is a simulator/emulator enough, or do you need a real device?
01Check the checkout screen layout on iPhone SE, iPhone 16 Pro Max and iPad.
02Scan the QR code printed on a paper receipt to collect loyalty points.
03Check that the "Low battery: tracking paused" banner appears at 10% on Android.
04Check that scrolling the product feed stays smooth on a 3-year-old budget Android.
05Look for truncated labels in the German translation.
06Pair the fitness app with a heart-rate chest strap over Bluetooth.
07Check every screen in dark mode for unreadable text.
08Check that the link shopapp://product/42 opens the right product page.
09Track a 45-minute outdoor run with GPS and check battery drain.
10Receive a phone call on an iPhone while a payment is processing.
Cloud device farms
When you need a phone you don’t own (a specific Samsung model, an old iPhone, a tablet), a cloud device farm rents you real devices through the browser. You install the build, tap around remotely, and record videos and logs.
Common options are BrowserStack, Sauce Labs, LambdaTest, AWS Device Farm and Firebase Test Lab (the last two are aimed mostly at automated tests). They’re great for reproducing a bug a user reported on “Galaxy A14, Android 14”, but there is some lag, and you can’t hold the device, walk outside or plug in a Bluetooth gadget.
Example test cases
TC-ENV-001Checkout layout on the smallest supported iPhonepositivehigh
Preconditions
- iOS Simulator with iPhone SE (3rd generation)
- Software keyboard shown (⌘K)
Steps
- Add an item to the cart
- Open Checkout
- Tap the card number field
- Scroll to the bottom
Expected result
All fields and the Pay button are reachable with the keyboard open. Nothing is cut off or hidden behind the keyboard.
TC-ENV-002Restaurant list updates when location changespositivehigh
Preconditions
- Android Emulator, location permission granted
Steps
- Extended controls › Location: set Berlin, Alexanderplatz
- Open the app
- Set location to Munich, Marienplatz
- Pull to refresh
Expected result
The delivery address changes to Marienplatz and only Munich restaurants are listed.
TC-ENV-003Outside the delivery zone shows an empty statenegativemedium
Preconditions
- Android Emulator
Steps
- Set a location outside the delivery area
- Open the app
Expected result
A friendly "We don't deliver here yet" message is shown, with an option to change the address. No endless spinner.
TC-ENV-004Low battery banner at 10%edgelow
Preconditions
- Android Emulator
- Active order with live tracking
Steps
- Extended controls › Battery: Charger connection None
- Set charge level to 10%
Expected result
The app shows that live tracking updates less often. Order details remain usable.
TC-ENV-005Face ID failure falls back to passwordnegativehigh
Preconditions
- iOS Simulator
- Features › Face ID › Enrolled is checked
- Face ID login enabled in the app
Steps
- Lock and reopen the app
- When Face ID is requested, choose Features › Face ID › Non-matching Face
- Repeat
Expected result
The app shows a clear error and offers login with password. It never logs the user in.
TC-ENV-006Run tracking continues with the screen lockededgehigh
Preconditions
- Real iPhone and real Android phone
- Location permission: Always / Allow all the time
Steps
- Start a run outdoors
- Lock the phone
- Walk for 15 minutes
- Unlock and stop the run
Expected result
The route has no gaps and the distance matches the walk (within a few percent).
Tip: click a test case to expand it.
Checklist
Simulator and emulator testing checklist
0 of 11 checked
Check your understanding
Quick quiz
0/5 answered · 0 correct
1.What is the main technical difference between the iOS Simulator and the Android Emulator?
2.You must test how a budget Android phone handles a long product feed. Where should you test?
3.Which test can the Android Emulator do but the iOS Simulator cannot?
4.A developer sends you a TestFlight link. Can you test that build on the iOS Simulator?
5.Forms look perfect on the Simulator, but users say the keyboard hides the Pay button. What probably went wrong in testing?
Key takeaways
- The iOS Simulator imitates iOS on your Mac; the Android Emulator emulates a full virtual phone. Neither is a real device.
- Use virtual devices for layout, flows, settings and fake-able conditions: screen sizes, OS versions, dark mode, large text, languages, location, battery, network.
- Use real devices for hardware, performance, the physical world, real interruptions and the final sign-off.
- Know the menus: Features and Device on the Simulator, Extended controls on the Emulator.
- Fill the gaps with a small real-device lab and a cloud device farm.
Finished this page?Nice work, this page is complete!
Mark it as done to track your progress. It's saved in this browser, no account needed.
Its review cards are now in Bites ⚡