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.
Write a test for the thermostat’s temperature stepping.
Project context
Search project source temp
Read source file src/ui_home.c
Screenshot
State heat_setpoint = 210
Write steps 9
Save test setpoint-steps.test.json
Working
Done: AUR-2. I found that btn_temp_up and btn_temp_down step heat_setpoint by 0.5 °C, so the test taps + twice, then − twice, and checks the value after every tap.
Tell me what to do…Write a test for the thermostat’stemperature stepping.
Click hereClick hereClick hereClick hereClick here
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")
defsetpoint_steps(app):
app.set("heat_setpoint", 210)
for _ inrange(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 limitawait app.tap({ name: 'btn_plus' });
await app.expect('heat_setpoint', 300);
await app.expectText({ 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.
AI auditsetpoint-steps.test.json
Verified
Expected results
After 18 taps the setpoint reads 30.0screenshot 1
One tap more leaves it at 30.0screenshot 2
Negative control
Without the 18 taps the test failsas it should
References approved · ready for the suite
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.
web.aurora.io/rooms
RoomsAurora T1 · home
Living roomHeating21.0 °C22.0 °Ctext "${sp} °C"
KitchenIdle21.0 °C
Updated just now
08:12
AuroranowLiving room set to 22.0° on the thermostat
Living roomAurora T1 · Heating
Heating to21.022.0°CIndoor 19.6°
−+
HeatCoolAutoOff
Outdoor8.2°
Humidity46%
Eco at22:00
Setpoint on every screensetpoint-everywhere.test.json
1Set 22 °C on the deviceEmbedded deviceset 22.0 → sp
2Check the mobile appMobilelbl_setpoint = ${sp}
3And the web appWeb"${sp} °C" within 5 s
Running step 123 of 3Passed: three apps, one test
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.
Platforms
One runner. Four worlds.
The same steps, locators and checks on every platform, wherever the platform can do them.
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.
AUR-1A setpoint change holds until the next schedule event1.84 s
AUR-3A schedule event added by a command is the next one0.96 s
AUR-2Each tap raises the setpoint by 0.5 °C up to 30.0 °C2.31 s
Steps 24TraceLogs 12
#Stepms
1The home screen is shown screen = home · ≤ 10000 mshold.test.json:#1100
2Wait until idlehold.test.json:#211
3The schedule runs Home preset = 0hold.test.json:#315
4Check hold = 0hold.test.json:#45
5Check heat_setpoint = 210hold.test.json:#55
6The heat pump is heating hvac_action = 2hold.test.json:#65
7Tap name=btn_temp_uphold.test.json:#720
8Tap name=btn_temp_uphold.test.json:#88
9Wait until idlehold.test.json:#916
1022.0 °C is held heat_setpoint = 220hold.test.json:#106
11Check hold = 1hold.test.json:#115
12The hold ends at 08:30 hold_until = 510hold.test.json:#125
13Check name=lbl_setpoint text = "22.0"hold.test.json:#1322
$ ranveowall test tests --jobs 4 --junit junit.xml
Above: the Aurora T1 demo tests, run on one Windows PC.
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
AUR-B7
One tap on + adds 1.0 °C
OverviewActivityRuns 3Package
Why it failed
AI summary
Comparing with the last pass, the commits and the log
Step 6 expects heat_setpoint = 215 after one tap, but got 220. Commit 7c2e91a changed SETPOINT_STEP from 5 to 10.
Pictures of the failureOpen its last run
lbl_setpoint
State
Open
AssigneeAssign to me
Nobody
Test
AUR-2 Each tap raises the setpoint by 0.5 °C up to 30.0 °Csetpoint-steps.test.json
Seen
in 1 run2 runs3 runs3 runs
first 2 minutes ago
Ticket
Not sent yetJira · THERMO-218
Labels
regressionthermostat+ Add
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.
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.