jevtest (Just-Betr)
Plain-English end-to-end tests for Android and iOS apps where Jev works out the taps and a lockfile replays every decision exactly.
Overview
jevtest (Just-Betr) runs end-to-end tests for Android and iOS apps written in plain English. Each step is an action and what should be true afterwards: a do step takes a natural-language goal such as signing in with given credentials, Jev works out the concrete taps and typing on the current screen, and expect and see steps check the result, with expect judged by Jev and see matching visible text. More than 20 exact step types (tap, type, swipe, scroll_to and others) are available for precise control.
Determinism is a core feature: every Jev decision is recorded in a lockfile, the same screen always gets the same answer, and --lock frozen replays a run exactly with no network or API key, which suits CI. The whole test file is validated before a device is touched. It supports Android emulators and phones, iOS simulators and iPhones, and native, Flutter, React Native and in-app WebView apps. It is distributed on PyPI with documentation, and the README run shows the cost of live decisions per run.
What the decision model decides
| Type | Question | Answers |
|---|---|---|
| Choice | Which on-screen control and action accomplish this plain-English step? | — |
| Yes / no | Is the expected state (e.g. 'the home screen is showing') true now? | — |
How it works
- Write YAML tests with do, expect and see steps
- jevtest validates the whole file before touching a device
- Jev chooses concrete actions for each do step on the live screen
- Expectations are judged; decisions are saved to a lockfile
- CI replays with --lock frozen, no network or key needed
Strengths
- Deterministic replays via lockfile
- Readable, spec-like tests
- Broad platform and framework coverage
- Strict validation with all problems reported at once
Caveats
- First runs need a TypeSafe key and device access
- UI changes may require re-recording decisions
- Model judgments on expect steps can be wrong
Getting started
pip install jevtest, then jevtest run login.yaml (add --lock frozen in CI).At a glance
- Type
- App
- Status
- beta
- Language
- Python
- Runtime
- CLI driving Android and iOS devices
- Has code
- yes
- Has tests
- yes
- License
- MIT
Use cases and integrations
How curated lists describe it
Plain-English end-to-end tests for Android and iOS apps, driven by TypeSafe's Jev. Deterministic, strict, CI-ready.
logicrw/awesome-jev-projectsPlain-English end-to-end tests for Android and iOS apps, driven by TypeSafe's Jev. Deterministic, strict, CI-ready.
hellogumbo/awesome-jev
Frequently asked questions
What does Jev decide?
The concrete taps and typing for each plain-English step, and whether expectations hold on screen.
Is it deterministic?
Yes, decisions are stored in a lockfile and --lock frozen replays them exactly without network.
Which apps are supported?
Native, Flutter, React Native and in-app WebViews on Android and iOS.
Related projects
Flutter integration-test package where Jev picks the next registered UI action and judges whether the test goal is reached.
LibrarybetaDartVerified computer-use agent: a Jev guard checks claimed completions and gates irreversible actions; Jev also takes simple steps.
ProjectbetaPythonGoal-driven browser agent where each step is one Jev choice over the page's controls, then reviews the run for root causes.
AppbetaTypeScriptFork of mobile-mcp that adds OCR and lets Jev pick which recognised text element to tap on Android and iOS devices.
MCP serverbetaTypeScriptFast iOS Simulator and Android navigator built on sim-use where Jev picks each tap instead of a frontier-model turn.
ProjectbetaSelf-hostable harness to run coding agents from your phone; a mobile testing script can use Jev to pick the next UI interaction.
ProjectbetaTypeScript