RUVIOLTAModern testing platformv3.0.1
What's New · 3.0.1

Android is now part of Ruviolta.

The same readable .ut (User Testing) language now drives native Android applications on the Ruviolta Emulator and connected real devices. Web, API and Android testing live in one intentionally unified platform.

Android initVirtual + realNative controlsWindows + Linux
Release focus

Android in one view

▣

Ruviolta Emulator

Use a managed Android virtual device with deterministic display, lifecycle and application settings.

▯

Real devices

Run the same tests on a supported USB-connected Android device with debugging authorized.

⌁

Native controls

Interact with inputs, spinners, switches, checkboxes, radio options, scrolling, gestures and file pickers.

↓

Lazy provisioning

The normal Web/API install stays small. Android is downloaded only after explicit initialization.

New setup command

One command provisions the correct Android package

Terminal
ruviolta android init
Mobile lifecycle
ruviolta mobile start android
ruviolta mobile status
ruviolta mobile stop android

Platform-aware and non-destructive

Initialization detects Windows or Linux, downloads and verifies the matching runtime, and creates projects/android. Existing project files are preserved and a verified runtime is reused.

The managed runtime stays outside the user workspace, so Web/API projects remain clean.

New application commands

Install, launch and inspect Android applications

+

app install

Install any local APK on the configured virtual or real device.

ruviolta mobile app install android path/to/app.apk
▶

app launch

Install when needed and open an Android application.

ruviolta mobile app launch android path/to/app.apk
⌕

inspect

See accessible native controls and selectors from the current screen.

ruviolta mobile inspect android
New native test steps

Test real mobile interactions with readable commands

demoTest.ut
Variables:
    let file = "../demoData/DemoData.pdf"

waitFor(contains["SIGNED IN"])
waitFor("FORM").click()
waitFor("First name").replaceInput("Georgi")
waitFor("Country select").select("Bulgaria")
upload("Choose a file", file)
checkbox("Accept demo terms checkbox", ON)
switch("Enable notifications switch", ON)
waitFor("Submit request").click()

Native controls, familiar flow

waitFor(), click(), input(), replaceInput(), select() and upload() work with native controls. State helpers cover checkboxes, switches and radio options.

Gestures include longPress(), dragAndDrop(), scrollTo(), swipe() and back().

New Android selectors

Find controls by meaning, context or symbol

≈

contains[]

Use normalized, case-insensitive partial text.

waitFor(contains["SIGNED IN"])
↔

Context selectors

Scope a target with nextTo[], before[] or after[].

click("A", nextTo["Class 7"])
click("Save", before["Edit"])
waitFor("Student", after["Title"])
U+

symbol[]

Match an icon by its exposed Unicode code point and combine it with context.

waitFor(
  symbol["U+F100"],
  nextTo[contains["Georgi"]]
).click()
New project data

Keep local test data out of committed examples

config/data.mjs
export default {
  androidLogin: {
    email: "user@ruviolta.com",
    password: "Ruviolta123",
  },
};

data(), project .env and explicit login()

Read private values with data("androidLogin", "email"), project-local environment values with env("NAME"), and invoke the configured login flow with login("androidLogin").

Safe example templates remain trackable while real config/data.mjs and .env files stay local.

Virtual or real

Change the device, not the test language

Virtual device
android: {
  device: { type: "virtual" },
  toolbar: "hide",
  softKeyboard: "hidden"
}
Real device
android: {
  device: {
    type: "real",
    // serial: "optional-device-serial"
  },
  softKeyboard: "hidden"
}

When the soft keyboard is hidden for a Ruviolta session, the previous device setting is restored when the session ends.