Skip to main content

write-ui-tests

Use when writing or modifying UI/Compose instrumented tests in the Alkaa project — triggers on tasks like "add a UI test", "test this composable", "add instrumented test", "test this screen behavior".

Source facts

Repository
igorescodro/alkaa
Last source activity
March 29, 2026 at 21:16
Detected SKILL.md language
English
Stars
1,649
Forks
164

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
2 files

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
write-ui-tests
description
Use when writing or modifying UI/Compose instrumented tests in the Alkaa project — triggers on tasks like "add a UI test", "test this composable", "add instrumented test", "test this screen behavior".
# Write UI Tests ## Overview UI tests in Alkaa test Compose and UI behavior in isolation — not integration tests. Composables must be stateless to make testing straightforward: pass all state and callbacks as parameters, then assert on the semantic tree. Tests live in: `features/<feature>/src/commonTest/kotlin/com/escodro/<feature>/presentation/instrumented/` ## Structure - **Class setup** — Extends `AlkaaTest()`, `@OptIn(ExperimentalTestApi::class)` on class → see `references/SETUP.md` - **Test body** — `= runComposeUiTest { }` for each test - **Loading composables** — Private extension function on `ComposeUiTest`; always wrap with `AlkaaThemePreview` → see `references/SETUP.md` - **Fakes** — Implement interface, register in Koin test module, clean in `@AfterTest` → see `references/SETUP.md` - **Assertions** — By text, content description, or test tag; never by component ID → see `references/SETUP.md` ## Naming Snake_case, two accepted forms: - Standard: `test_emptyViewIsShown()` - State-driven: `when_view_is_opened_then_empty_view_is_shown()` No camelCase, no backtick names. ## Rules | Rule | Details | |------|---------| | **Always wrap** | Wrap composable in `AlkaaThemePreview` | | **Resource strings** | `getString(Res.string.xyz)` inside `uiTest` or `runComposeUiTest` — never hardcode | | **One scenario per test** | Split different states into separate `@Test` functions | | **`useUnmergedTree = true`** | When nodes are inside merged semantics | | **`@IgnoreOnDesktop`** | For tests not applicable on desktop | | **`@AfterTest` cleanup** | Call `clean()` on every fake | | **Given/When/Then** | Always add the three comment blocks | ## Common Mistakes | Mistake | Fix | |---------|-----| | Testing a stateful composable directly | Extract a stateless Content composable and test that | | Using mocks for domain interfaces | Create a fake implementing the interface | | Hardcoding UI strings | Use `getString(...)` inside `uiTest` or `runComposeUiTest` | | Testing multiple scenarios in one test | Split into separate `@Test` functions | | Missing `@AfterTest` cleanup | Add `tearDown()` calling `clean()` on every fake | | Forgetting `AlkaaThemePreview` wrapper | Always wrap composable | | Omitting Given/When/Then comments | Always add the three comment blocks |
View on GitHub