iOS Testing Router
You MUST use this skill for ANY testing-related question, including writing tests, debugging test failures, making tests faster, or choosing between testing approaches.
When to Use
Use this router when you encounter:
Writing new unit tests or UI tests Swift Testing framework (@Test, #expect, @Suite) XCTest or XCUITest questions Making tests run faster (without simulator) Flaky tests (pass sometimes, fail sometimes) Testing async code reliably Migrating from XCTest to Swift Testing Test architecture decisions Condition-based waiting patterns Routing Logic
This router invokes specialized skills based on the specific testing need:
- Unit Tests / Fast Tests → swift-testing
Triggers:
Writing new unit tests Swift Testing framework (@Test, #expect, #require, @Suite) Making tests run without simulator Testing async code reliably withMainSerialExecutor, TestClock Migrating from XCTest Parameterized tests Tags and traits Host Application: None configuration Swift Package tests (swift test)
Why swift-testing: Modern Swift Testing framework with parallel execution, better async support, and the ability to run without launching simulator.
Invoke: Read the axiom-swift-testing skill
- UI Tests / XCUITest → ui-testing
Triggers:
Recording UI Automation (Xcode 26) XCUIApplication, XCUIElement Flaky UI tests Tests pass locally, fail in CI sleep() or arbitrary timeouts Condition-based waiting Cross-device testing Accessibility-first testing
Why ui-testing: XCUITest requires simulator and has unique patterns for reliability.
Invoke: Read the axiom-ui-testing skill
- Flaky Tests / Race Conditions → test-failure-analyzer (Agent)
Triggers:
Tests fail randomly in CI Tests pass locally but fail in CI Flaky tests (pass sometimes, fail sometimes) Race conditions in Swift Testing Missing await confirmation for async callbacks Missing @MainActor on UI tests Shared mutable state in @Suite Tests pass individually, fail when run together
Why test-failure-analyzer: Specialized agent that scans for patterns causing intermittent failures in Swift Testing.
Invoke: Launch test-failure-analyzer agent
- Async Testing Patterns → testing-async
Triggers:
Testing async/await functions confirmation for callbacks (Swift Testing) expectedCount for multiple callbacks Testing MainActor code with @MainActor @Test Migrating XCTestExpectation → confirmation Parallel test execution concerns Test timeout configuration
Why testing-async: Dedicated patterns for async code in Swift Testing framework.
Invoke: Read the axiom-testing-async skill
- Test Crashes / Environment Issues → xcode-debugging
Triggers:
Tests crash before assertions run Simulator won't boot for tests Tests hang indefinitely "Unable to boot simulator" errors Clean test run differs from incremental
Why xcode-debugging: Test failures from environment issues, not test logic.
Invoke: Read the axiom-xcode-debugging skill
- Running XCUITests from Command Line → test-runner (Agent)
Triggers:
Run tests with xcodebuild Parse xcresult bundles Export failure screenshots/videos Code coverage reports CI/CD test execution
Why test-runner: Specialized agent for command-line test execution with xcresulttool parsing.
Invoke: Launch test-runner agent
- Closed-Loop Test Debugging → test-debugger (Agent)
Triggers:
Fix failing tests automatically Debug persistent test failures Run → analyze → fix → verify cycle Need to iterate until tests pass Analyze failure screenshots
Why test-debugger: Automated cycle of running tests, analyzing failures, suggesting fixes, and re-running.
Invoke: Launch test-debugger agent
- Recording UI Automation (Xcode 26) → ui-recording
Triggers:
Record user interactions in Xcode Test plans for multi-config replay Video review of test runs Xcode 26 recording workflow Enhancing recorded test code
Why ui-recording: Focused guide for Xcode 26's Record/Replay/Review workflow.
Invoke: Read the axiom-ui-recording skill
- UI Automation Without XCUITest → simulator-tester + axe-ref
Triggers:
Automate app without test target AXe CLI usage (tap, swipe, type) describe-ui for accessibility tree Quick automation outside XCUITest Scripted simulator interactions
Why simulator-tester + axe-ref: AXe provides accessibility-based UI automation when XCUITest isn't available.
Invoke: Launch simulator-tester agent (uses axiom-axe-ref)
Decision Tree User has testing question │ ├─ Writing unit tests or asking about Swift Testing? │ └─ YES → swift-testing │ ├─ Writing UI tests or debugging XCUITest? │ └─ YES → ui-testing │ ├─ Testing async/await code patterns? │ ├─ confirmation, expectedCount, @MainActor @Test? → testing-async │ └─ General async questions? → testing-async │ ├─ Tests fail randomly / flaky in CI / race conditions? │ ├─ Check: Uses XCUIApplication/XCUIElement? → ui-testing │ └─ Check: Uses @Test/#expect? → test-failure-analyzer (Agent) │ ├─ Tests crash or environment seems wrong? │ └─ YES → xcode-debugging (via ios-build) │ ├─ Tests are slow, want to speed them up? │ └─ YES → swift-testing (Fast Tests section) │ ├─ Run tests from command line / CI / parse results? │ └─ YES → test-runner (Agent) │ ├─ Fix failing tests automatically / closed-loop debugging? │ └─ YES → test-debugger (Agent) │ ├─ Record UI interactions in Xcode 26? │ └─ YES → ui-recording │ └─ Automate without XCUITest / use AXe CLI? └─ YES → simulator-tester + axe-ref
Swift Testing vs XCTest Quick Guide Need Use Unit tests (logic, models) Swift Testing UI tests (tap, swipe, assert screens) XCUITest (XCTest) Tests without simulator Swift Testing + Package/Framework Parameterized tests Swift Testing Performance measurements XCTest (XCTMetric) Objective-C tests XCTest Anti-Rationalization
Do NOT skip this router for:
"Simple" test questions (proper patterns prevent future pain) "I know XCTest" (Swift Testing is significantly better for unit tests) "Tests are slow but it's fine" (fast tests enable TDD and better feedback)
Fast, reliable tests are foundational to code quality.
Example Invocations
User: "How do I write a unit test in Swift?" → Invoke: axiom-swift-testing
User: "My UI tests are flaky in CI" → Check codebase: XCUIApplication/XCUIElement patterns? → ui-testing → Check codebase: @Test/#expect patterns? → test-failure-analyzer
User: "Tests fail randomly, pass sometimes fail sometimes" → Invoke: test-failure-analyzer (Agent)
User: "Tests pass locally but fail in CI" → Invoke: test-failure-analyzer (Agent)
User: "How do I test async code without flakiness?" → Invoke: testing-async
User: "How do I test callback-based APIs with Swift Testing?" → Invoke: testing-async
User: "What's the Swift Testing equivalent of XCTestExpectation?" → Invoke: testing-async
User: "How do I use confirmation with expectedCount?" → Invoke: testing-async
User: "I want my tests to run faster" → Invoke: axiom-swift-testing (Fast Tests section)
User: "Should I use Swift Testing or XCTest?" → Invoke: axiom-swift-testing (Migration section) + this decision tree
User: "Tests crash before any assertions" → Invoke: axiom-xcode-debugging
User: "Run my tests and show me what failed" → Invoke: test-runner (Agent)
User: "Help me fix these failing tests" → Invoke: test-debugger (Agent)
User: "Parse the xcresult from my last test run" → Invoke: test-runner (Agent)
User: "Export failure screenshots from my tests" → Invoke: test-runner (Agent)
User: "How do I record UI automation in Xcode 26?" → Invoke: axiom-ui-recording
User: "How do I use test plans for multi-language testing?" → Invoke: axiom-ui-recording
User: "Can I automate my app without writing XCUITests?" → Invoke: simulator-tester (Agent) + axiom-axe-ref
User: "How do I tap a button using AXe?" → Invoke: axiom-axe-ref (via simulator-tester)