TestKase
TestKase
|Docs
AutomateMobile

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 deviceVirtual
Speed to startSlower — the device is cleaned between sessionsFaster
How manyLimited by how many we ownMore
Camera, GPU, sensorsRealSimulated or absent
App build neededA device buildA simulator build on iOS
An iOS simulator needs a different build of your app. It cannot run the .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.