Ranveo
Web · Android · iOS · LVGL · UnityAn AI test engineer that works from your source code

Never write or debug a test by hand again.

Tell the chat what to test. Ranveo reads your app's source code, drives the live screen, writes the test, runs it and fixes it until it passes. When something breaks later, it tells you why.

Say what to test. Ranveo works out the how.

In the demo above, nobody said which buttons to tap or by how much the setpoint moves. Ranveo found that in the thermostat’s source and on the live screen, wrote nine steps and ran them. Flows, limits, schedules and error paths work the same way.

Every test is a plain file in your repo: JSON, Python or TypeScript, reviewed like code.

Or ask for

  • Test the weekly schedule across midnight.
  • Walk through every error dialog in Settings.
  • Test that the mobile app and the embedded device stay in sync.
  • Check every screen in German for clipped or overlapping text.
  1. It reads your source.

    Point it at the repository and the running app. It learns the screens, the object names, the state behind them, and the limits and error paths in the code.

  2. It writes the test, or you do.

    Ask in a sentence and the AI writes the steps. Or record them in the live view, or program them in Python or TypeScript.

  3. A second AI audits it.

    It checks every expected result on the screenshots, and the test has to fail with a key action left out. Only then does it count.

  4. It runs the tests anywhere.

    On your PC, in CI and on the team server, on real hardware, emulators and browsers, each test with its own app and its own clock.

  5. It checks every failure against the source.

    It reads the commits since the last pass, the app’s log and the code. A bug becomes a ticket with its cause; a change made on purpose, an updated test to review.

Ask, record or program it.

The AI, the recorder and your own code write the same tests: one runner, one report, one history.

  • Ask the AI

    It reads the source and the live screen and writes the steps, and a second AI audits them. You review the file like any other change.

  • Record it

    Tap through the app in the live view. Each tap becomes a step, and you add a check wherever you want one.

  • Program it in Python or TypeScript

    Loops, test data and your own helpers, with the same steps as functions. Run them from the same CI as your other tests.

test_setpoint_steps.py

from ranveo import test

@test("Each tap adds 0.5 °C, up to 30.0 °C")
def setpoint_steps(app):
    app.set("heat_setpoint", 210)
    for _ in range(18):
        app.tap(name="btn_plus")
    app.expect("heat_setpoint", 300)

    # one tap more: it stays at the limit
    app.tap(name="btn_plus")
    app.expect("heat_setpoint", 300)
    app.expect_text(name="lbl_setpoint", equals="30.0")

setpoint-steps.test.ts

import { test } from '@ranveo/test';

test('Each tap adds 0.5 °C, up to 30.0 °C', async (app) => {
  await app.set('heat_setpoint', 210);
  for (let i = 0; i < 18; i++) {
    await app.tap({ name: 'btn_plus' });
  }
  await app.expect('heat_setpoint', 300);

  // one tap more: it stays at the limit
  await app.tap({ name: 'btn_plus' });
  await app.expect('heat_setpoint', 300);
  await app.expectText({ name: 'lbl_setpoint' }, { equals: '30.0' });
});

setpoint-steps.test.json

{
  "name": "Each tap adds 0.5 °C, up to 30.0 °C",
  "steps": [
    { "set": { "subject": "heat_setpoint", "value": 210 } },
    { "repeat": { "times": 18 } },
      { "tap": { "name": "btn_plus" } },
    { "end": true },
    { "expect": { "subject": "heat_setpoint", "value": 300 } },
    { "tap": { "name": "btn_plus" } },
    { "expect": { "subject": "heat_setpoint", "value": 300 } },
    { "expect": { "text": { "name": "lbl_setpoint" }, "equals": "30.0" } }
  ]
}

One test, three ways to write it: each tap adds 0.5 °C, and the setpoint stops at 30.0 °C.

A test the AI wrote is audited before it counts.

The test states up front what must be seen. A second AI, independent of the one that wrote it, looks for each of those results on the run’s screenshots. Then Ranveo runs the test again with a key action left out, and it has to fail. Only a verified test joins the suite.

  • Expected results, stated before the run
  • An independent visual audit of the screenshots
  • A negative control that has to fail
  • Expectations are never bent to fit a wrong picture

Switched on per project on the team server.

A test can check

  • Text and numbers on the screen
  • The app’s state behind the screen
  • Screenshots against an approved picture
  • Clipped text and overlapping objects
  • Frame time and memory budgets
  • Errors in the app’s log
  • Schedules on a virtual clock
  • HTTP calls and your own test rigs
Platforms

Test the whole product,
not just the browser.

Ranveo tests web apps, mobile apps on Android and iOS, LVGL devices on real hardware and Unity apps, with the same tests, the same runner and one team server. And a single test can drive all of them at once.

It runs on every commit and explains every failure.

Every test gets its own copy of the app and its own clock, so tests run side by side. When one fails, the AI compares the run with the last pass, the commits since and the app's log, says what changed and files the bug.

tests passed
3/3
run time
2.6 s
$ ranveowall test tests --jobs 4 --junit junit.xml

Above: the Aurora T1 demo tests, run on one Windows PC.

Illustration of a Ranveo test line: a small robot works at a console while test cards pass through a glowing Ranveo gate and come out as green checks

On premises

Your test line runs on your own machines.

The server, its machines, the AI assistant, the bug tracker and the reports stay with you, without internet if you like. At run time it is one native binary: no Python, no Node.js, no database.

  • Live view

    The target's screen, its input and a control panel built from its state, shared by everyone on the project.

  • Parallel runs that queue

    Each test in its own process with its own clock. When every instance is busy, the run waits its turn instead of failing.

  • A bug tracker built in

    A failure becomes a ticket, failures with the same cause merge, and tickets move on to GitLab, Jira, GitHub or a webhook.

  • Reviewed references

    The first run records the picture; a person approves it. Differences are mapped onto the object tree.

  • History and test health

    Every run with its logs, failure pictures and traces, and which tests have started to wobble.

  • Reports

    HTML, PDF and JUnit, plus a trace viewer built into the binary for the test that failed.

  • Schedules and environments

    Nightly runs, staging and production, and secrets that never land in a test file.

  • Roles and an audit log

    Viewers, editors and admins. Who changed what is written down.

Every failure arrives as a bug, with its cause.

The AI compares a failed run with the last pass, the commits since and the app’s log, and writes down what changed. Failures with the same cause become one ticket, with pictures and a trace, and it goes on to Jira, GitLab or GitHub.

  • AUR-B8 The Fan tile shows Auto while the fan is offAUR-12 · fan.test.json · — · ×1 yesterday
  • AUR-B4 The kitchen tile shows °F after a restartAUR-9 · units.test.json · — · ×2 last week
  • AUR-B3 The schedule list scrolls past its last rowAUR-7 · schedule.test.json · — · ×1 last week
  • AUR-B2 An error dialog is cut off in GermanAUR-11 · dialogs.test.json · — · ×1 2 weeks ago
  • AUR-B1 Away mode heats to 18.0 °C instead of 16.0 °CAUR-3 · away.test.json · — · ×4 3 weeks ago
  • AUR-B0 The Humidity tile rounds 45.5% down to 45%AUR-14 · humidity.test.json · — · ×1 last month
  • AUR-A9 The clock skips 02:00 on the DST changeAUR-15 · clock.test.json · — · ×2 last month

One tap on + adds 1.0 °C

Why it failed

AI summary

Step 6 expects heat_setpoint = 215 after one tap, but got 220. Commit 7c2e91a changed SETPOINT_STEP from 5 to 10.

State

Open

Assignee

Nobody

Test

AUR-2 Each tap raises the setpoint by 0.5 °C up to 30.0 °Csetpoint-steps.test.json

Seen

in 3 runs

first 2 minutes ago

Ticket

Jira · THERMO-218

Labels

regressionthermostat

Click a bug to watch how Ranveo found its cause.

Pricing

Pay for tests running at once. Not for seats.

Unlimited users, CI included, no run limits. A test takes one slot however many apps, devices or browsers it drives, and a run that finds no free slot waits in line.

Free

$0
commercial use included

Web and desktop LVGL for one person or a side project.

  • 1 test machine, 1 project
  • 3 users, 1 environment
  • AI with your subscription
  • Built-in bug tracker
Download

Web

$720
per concurrent test / year

For teams that ship web and Electron apps only.

  • Unlimited users and projects
  • Unlimited machines
  • Your own AI API key
  • Jira, GitLab, GitHub, webhook
Start trial

Small business

$990
per year, flat

For companies under $150k yearly revenue.

  • Every platform, real devices
  • 2 concurrent tests
  • Up to 5 users
  • Unlimited projects
Start trial
Recommended

Full

$2,400
per concurrent test / year

Devices, web and Unity, in one test if you like.

  • Every platform, real devices
  • Everything in Web
  • Unlimited users and machines
  • Perpetual licence available
Start trial

Enterprise

$3,000
per concurrent test / year, from 5

For several sites and air-gapped labs.

  • Local AI models
  • Video module included
  • Offline activation
  • Priority support with SLA
Talk to us

Prices in USD. Every server starts with a 30-day trial of every platform and module. The demo video module is +$490 a year (included in Enterprise, watermarked in Free).

Your next test is one sentence away.

Start the server, connect your app and ask for the first test today. The trial has every platform for 30 days.

The Ranveo test editor in dark mode with the AI assistant open