Skip to content

What is Emcee

Emcee logo

Emcee is an ultimate solution for running Android and iOS tests in parallel across many servers, let it be bare metal or containerised.

"Emcee" means master of ceremonies.

Emcee allows you to run unit, integration and UI tests in smaller chunks, distributing the load and getting the results of the test run faster. Shared queue manages the order of test execution. Emcee workers execute tests and maintain the lifecycle of their simulators/emulators automatically.


In the process of getting Emcee deployed and functional, you will encounter the following terms.

  • Queue - An Emcee queue accepts testing requests from clients, split tests into buckets for distributed execution, controls load and which tasks get placed on which workers. Queue is also in charge of detecting stuck buckets and recovering in case of failures
  • Worker - An Emcee worker is responsible for running the tests assigned to it. It also registers itself with the queue and watches for any work to be assigned
  • Client - A client acts as an interface (cli or Gradle plugin) to the queue with ability to poll tests run status

Common features#

  • Automatic simulator/emulator lifecycle management
  • Per-test timeouts, simulator/emulator settings, environment variables
  • Single test queue to run tests from multiple parallel pull requests
  • Prioritized jobs and job groups for different kinds of test runs
  • Flexible tests split and failed tests retry strategies
  • Load balancing of worker machines to achieve optimal parallelization performance
  • Easy to use command line interface
  • Advanced analytic events and logs sent by workers and queue
  • Various test reports like Junit, Allure, XCResult (depends on platform)

How Emcee works#

Schematically, the work of Emcee looks like this:

  • Clients send test artifacts to the Emcee and pull test results
  • Workers use the REST API to talk to the queue. They fetch buckets, run tests and send back the test results
  • The queue distributes tests to workers, collects test results, and sends them back to clients

The schematic Emcee flow you can see in this animation:



The prerequisite for any tests running on Emcee is having an input artifacts. Emcee supports different input types:

  • xctest, target and runner application bundles, xctestrun (derivative from test plan) for iOS
  • application and testApplication apk for Android

Emcee does not create these test inputs. Normally you employ CI tools like GitHub Actions, CircleCI to build a project and then upload build artifacts to a storage accessible by Emcee workers. Or local build can be used to create such artifacts and Emcee client will serve them when it schedules a test run.