Real devices and virtual ones
When to ask for a simulator or emulator instead of a real phone, and how the two are kept apart.
We run both: real phones and tablets you can hold, and virtual devices — iOS simulators and Android emulators running on our machines.
You choose with one capability:
"testkase:options": { virtual: true }Leave it out and you get real hardware.
The two never substitute for each other. A test asking for a real Pixel never lands on an emulator. A test asking for a virtual one never takes a real phone out of the pool.
Which to ask for
Real devices are the truth. Real cameras, real graphics, real battery behaviour. Test anything you plan to ship on one.
Virtual devices start faster and there are more of them, so they queue less. They are good for most tests — sign-in, navigation, form validation — where you are testing your own logic rather than the hardware.
A common split: run everything on virtual devices on each commit, and the same tests on real phones before a release.
What differs
| Real device | Virtual | |
|---|---|---|
| Speed to start | Slower — the device is cleaned between sessions | Faster |
| How many | Limited by how many we own | More |
| Camera, GPU, sensors | Real | Simulated or absent |
| App build needed | A device build | A simulator build on iOS |
.ipa that installs on an iPhone. Upload the simulator build instead. Send the wrong one and the session is refused, with a message saying which it expected. Android has no such split. The same .apk runs on a phone and on an emulator.farm://app-sample handles this for you. Our demo app serves the right build for whichever kind of device you asked for, so you can switch virtual on and off without changing anything else.
Picking a model
The same model name can appear in both lists. There are real Pixels and emulated Pixels.
The capability generator has a Device type switch. Flip it to see which models exist in each.
const capabilities = {
platformName: "Android",
"appium:deviceName": "Pixel 8",
"appium:app": "farm://app-sample",
"testkase:options": {
accessKey: "xyz_your_access_key_here",
virtual: true,
},
};Everything else in your test stays identical. A virtual device works the same way as a real one.
