* ft makepad_test * Improve run handling, manifest parsing, and stdout newline Replace dynamic free-port lookup with an ephemeral localhost SocketAddr in test runtime and remove the unused find_free_listen_address helper. Ensure headless stdout messages end with a newline. Simplify send_to_app error handling and add a test that queued bootstrap messages are delivered once an app socket connects. Substantially enhance process_manager: unify cargo flag parsing, parse Cargo.toml to determine package/bin targets, resolve the correct binary name for direct stdio runs, and build the cargo/build+exec script from the resolved args. Add unit tests for manifest parsing and script generation and adjust related call sites. * test harness * Preserve test attrs; return Vec for gateway binds In the test macro (libs/makepad_test/macros/src/lib.rs) preserve wrapper-only attributes (ignore and should_panic) on the generated wrapper test while removing them from the inner function. Added Attribute import, is_wrapper_only_test_attr helper, adjusted attribute filtering and emission, and added unit tests to verify attribute placement and expansion. In the hub (studio/hub/src/hub.rs) change gateway_bind_candidates to return a Vec<SocketAddr> instead of an iterator and special-case ephemeral port 0 to preserve ephemeral binding; otherwise collect the range of candidate ports into a Vec. Added tests to validate candidate behavior. Also minor formatting/whitespace tweaks and a small IPv6 formatting adjustment. * Add visible Studio mode and remote client Enable running UI tests visibly through a running Makepad Studio. Adds a new makepad-network dependency and studio_remote client (libs/makepad_test/src/studio_remote.rs) and integrates it into the runtime via a TestConnection enum. Introduces visible-mode tooling: env vars (MAKEPAD_TEST_VISIBLE, MAKEPAD_TEST_STUDIO, MAKEPAD_TEST_STUDIO_MOUNT, MAKEPAD_TEST_STARTUP_DELAY_MS, MAKEPAD_TEST_ACTION_DELAY_MS, MAKEPAD_TEST_KEEP_OPEN_MS), pacing/delays after actions, and pause-before-shutdown. Splits startup into start_headless_app/start_visible_app, clears existing visible builds before launching, and updates tests, docs (GUIDE.md, README.md), and selector/runtime minor cleanups/formatting.
3.1 KiB
makepad_test
makepad_test provides Rust-native UI regression tests for Makepad apps. Tests live next to the package they exercise, run through normal cargo test, and drive the app through the existing Studio protocol in headless mode.
Quick Start
Add this to the package under test:
[dev-dependencies]
makepad-test = { path = "../../libs/makepad_test", version = "0.1.0" }
Create an integration test:
use makepad_test::{makepad_test, Selector, TestApp};
#[makepad_test]
fn fill_and_submit(app: TestApp) {
app.locator(Selector::id("input_singleline"))
.wait_visible()
.fill("hello")
.wait_value("hello");
app.press_return();
app.locator(Selector::id("status_label"))
.wait_text("Returned from singleline: \"hello\"");
}
Run a package-local suite with:
cargo test -p makepad-example-text-input --test ui -- --test-threads=1
Run the same test visibly inside a running Makepad Studio session with:
MAKEPAD_TEST_VISIBLE=1 cargo test -p makepad-example-counter --test ui -- --test-threads=1
Visible mode expects Studio to already be running at 127.0.0.1:8001. Set
MAKEPAD_TEST_STUDIO=<ip:port> to override the address.
To make the run easy to watch inside Studio, add pacing:
MAKEPAD_TEST_VISIBLE=1 \
MAKEPAD_TEST_STARTUP_DELAY_MS=1000 \
MAKEPAD_TEST_ACTION_DELAY_MS=750 \
MAKEPAD_TEST_KEEP_OPEN_MS=3000 \
cargo test -p makepad-example-counter --test ui -- --test-threads=1
Run the curated repo UI suites serially on macOS with:
tools/run_ui_tests.sh
Surface Area
#[makepad_test]for current-package UI testsTestAppfor app-scoped input, waits, logs, screenshots, and raw protocol forwardingSelectorfor structured snapshot matchingLocatorfor strict single-widget interaction and assertions
Structured selectors support:
Selector::all()Selector::id("...")Selector::widget_type("...")Selector::raw("...")- builder filters:
.text_exact(...),.text_contains(...),.nth(...),.window(...),.window_index(...),.any_window()
Common locator actions:
click,type_text,fill,clearpress_key,press_key_with_modifiersscroll,drag_by
Common waits and assertions:
wait_visible,wait_hidden,wait_countwait_text,wait_value,wait_checked,wait_enabledassert_text,assert_value,assert_checked,assert_enabled
Inspection helpers:
widget_snapshot()widget_dump()screenshot()wait_for_log_contains(...)
Failure Artifacts
Failed tests write artifacts under:
target/makepad_test/<package>/<test>/
The runtime captures:
failure.txtlogs.txtwidget-snapshot.jsonwidget-tree.txtorwidget-tree-error.txtfailure-screenshot.pngorfailure-screenshot-error.txt
Current Constraints
- synchronous API only
- current-package targeting only
- milestone-1 repo suite is validated on macOS first
- no visual diffing or trace viewer yet
Guide
For the full authoring model, runtime behavior, and troubleshooting notes, see GUIDE.md.