mirror of
https://github.com/priyanshujain/sanderling.git
synced 2026-10-02 11:07:10 +00:00
2d789d7d17a40c7080841be7e7b1a3f9e0e8bc68
The counting invariant can only close its window on Home, and the iOS run in #78 went 117 steps between two Home readings: 37 submits against a rise of 15 transactions is no evidence about the double tap sitting inside it. The ledger and the add-transaction screen both show the account's own balance, and an accepted submit pops back to the ledger, so a window bounded by those readings holds one action. The bound is an upper one: a balance that has not moved is a commit still in flight, a rejected submit or a tap that never landed, and none of those is a violation. Moving by more than the one submit in the window typed is.
sanderling
Autonomous property-based testing for mobile and web apps.
You write rules that must always hold about your app. sanderling explores the app on its own for minutes or hours, performing thousands of taps, swipes, and inputs, and records every step where a rule breaks. No scripted test paths. One TypeScript spec runs against Android, iOS, and web builds of the same app.
import { extract, always } from "@sanderling/spec";
import { defaultActions } from "@sanderling/spec/defaults";
import { noUncaughtExceptions } from "@sanderling/spec/defaults/properties";
const balance = extract("balance", s =>
parseInt(s.ax.find({ testTag: "Balance" })?.text ?? "0", 10));
export const properties = {
noUncaughtExceptions,
balanceNeverNegative: always(() => balance.current >= 0),
};
export const actionsRoot = defaultActions;
Every run produces a trace: one JSON line and one screenshot per step. sanderling replay opens it in a web UI for stepping through actions, screenshots, property timelines, and violations.
Alpha. Android, iOS, and web (Chrome driver only). Full scope in the v0.1.0 roadmap.
Docs
- Introduction: what property-based testing is and how sanderling works
- Case study: Folio: sanderling finding a real bug in a mobile app
- Getting started: install the CLI and run it against Folio
- Spec language reference
- Examples: folio (KMP, Android/iOS/web), folio-web (React + Vite)
- Architecture for contributors
sanderling, a wading bird that probes the shoreline for bugs that lie beneath.
Languages
Go
74.6%
TypeScript
15.2%
Kotlin
5.5%
Shell
2.7%
Swift
1%
Other
0.9%