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:
1. Unit Tests / Fast Tests → swift-testing
Triggers:
- Writing new unit tests
- Swift Testing framework (, , , )
- Making tests run without simulator
- Testing async code reliably
- ,
- Migrating from XCTest
- Parameterized tests
- Tags and traits
- Host Application: None configuration
- Swift Package tests ()
Why swift-testing: Modern Swift Testing framework with parallel execution, better async support, and the ability to run without launching simulator.
2. UI Tests / XCUITest → ui-testing
Triggers:
- Recording UI Automation (Xcode 26)
- XCUIApplication, XCUIElement
- Flaky UI tests
- Tests pass locally, fail in CI
- or arbitrary timeouts
- Condition-based waiting
- Cross-device testing
- Accessibility-first testing
Why ui-testing: XCUITest requires simulator and has unique patterns for reliability.
3. 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 for async callbacks
- Missing on UI tests
- Shared mutable state in
- Tests pass individually, fail when run together
Why test-failure-analyzer: Specialized agent that scans for patterns causing intermittent failures in Swift Testing.
4. Async Testing Patterns → testing-async
Triggers:
- Testing async/await functions
- for callbacks (Swift Testing)
- for multiple callbacks
- Testing MainActor code with
- Migrating XCTestExpectation → confirmation
- Parallel test execution concerns
- Test timeout configuration
Why testing-async: Dedicated patterns for async code in Swift Testing framework.
5. 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.
6. 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.
7. 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.
8. 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.
9. 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
agent (uses axiom-axe-ref)
Decision Tree
- Writing unit tests / Swift Testing? → swift-testing
- Writing UI tests / XCUITest? → ui-testing
- Testing async/await code? → testing-async
- Flaky tests / race conditions (XCUITest)? → ui-testing
- Flaky tests / race conditions (Swift Testing)? → test-failure-analyzer (Agent)
- Tests crash / environment wrong? → xcode-debugging (via ios-build)
- Tests are slow? → swift-testing (Fast Tests section)
- Run tests from CLI / parse results? → test-runner (Agent)
- Fix failing tests automatically? → test-debugger (Agent)
- Record UI interactions (Xcode 26)? → ui-recording
- Automate without XCUITest / AXe CLI? → 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
| Thought | Reality |
|---|
| "Simple test question, I don't need the skill" | Proper patterns prevent test debt. swift-testing has copy-paste solutions. |
| "I know XCTest well enough" | Swift Testing is significantly better for unit tests. swift-testing covers migration. |
| "Tests are slow but it's fine" | Fast tests enable TDD. swift-testing shows how to run without simulator. |
| "I'll fix the flaky test with a sleep()" | sleep() makes tests slower AND flakier. ui-testing has condition-based waiting patterns. |
| "I'll add tests later" | Tests written after implementation miss edge cases. swift-testing makes writing tests first easy. |
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)