# Test iOS App Skill **Description**: Build and test iOS applications in Xcode Simulator during development. ## When to Use - Developing new iOS features - Verifying UI/UX changes - Testing platform-specific functionality - Debugging iOS-only issues ## Prerequisites ### Environment Setup - Xcode installed from Mac App Store - iOS Simulator available - Backend services running (if applicable) - Apple Developer account (for device testing) ### Service Dependencies ```bash # Start required backend services ./run-local-all-services.sh start # Verify backend health curl http://127.0.0.1:8000/health # Check all services ./run-local-all-services.sh status ``` ## Testing Workflow ### 1. Open Project in Xcode ```bash # Navigate to iOS project cd mobile_app/ios # Open the workspace (not project) open LysnrAI.xcworkspace ``` ### 2. Configure Build Settings In Xcode: - **Scheme**: LysnrAI (or your app name) - **Destination**: iPhone 16 Pro Simulator (or preferred device) - **Configuration**: Debug (for development) ### 3. Build and Run **Using Xcode:** - Press `Cmd+R` to build and run - Or Product → Run **Using Command Line:** ```bash # Build xcodebuild -workspace LysnrAI.xcworkspace \ -scheme LysnrAI \ -destination 'platform=iOS Simulator,name=iPhone 16 Pro' \ build # Run xcodebuild -workspace LysnrAI.xcworkspace \ -scheme LysnrAI \ -destination 'platform=iOS Simulator,name=iPhone 16 Pro' \ test ``` ### 4. Core Functionality Testing #### Authentication Flow ```swift // Test cases to verify: // 1. Registration with valid email/password // 2. Registration with invalid data (show errors) // 3. Login with existing credentials // 4. Login with wrong password (show error) // 5. Logout functionality // 6. Session persistence ``` #### Main Features ```swift // Verify these screens work: // 1. Home screen with personalized greeting // 2. Core feature screens (e.g., recording, dashboard) // 3. Settings/profile screen // 4. Navigation between tabs // 5. Form validation throughout ``` ### 5. Platform-Specific Testing #### iOS Features - [ ] Push notifications (if enabled) - [ ] Background app refresh - [ ] Face ID/Touch ID (if implemented) - [ ] Dark mode support - [ ] Dynamic Type (font scaling) - [ ] VoiceOver accessibility - [ ] iPad layout (if universal app) #### Device Testing ```bash # List available simulators xcrun simctl list devices # Boot specific simulator xcrun simctl boot "iPhone 16 Pro" # Install app on simulator xcrun simctl install "iPhone 16 Pro" build/Build/Products/Debug-iphonesimulator/YourApp.app # Launch app xcrun simctl launch "iPhone 16 Pro" com.yourbundle.yourapp ``` ## Key Testing Areas ### 1. User Interface - Layout on different screen sizes - iPhone vs iPad layout differences - Rotation support - Keyboard appearance/disappearance - Safe area handling ### 2. Network Behavior - API calls with valid responses - Error handling (no network, server errors) - Loading states - Offline functionality (if any) - Request timeout handling ### 3. Data Persistence - Core Data/UserDefaults saving - Data survives app restart - Sync with backend (if applicable) - Data migration between versions ### 4. Performance - App startup time - Screen transition smoothness - Memory usage monitoring - Battery drain assessment ## Debugging Tools ### Xcode Debugging ```swift // Breakpoints // Use lldb commands in console // po object - print object description // p variable - print variable value // expr expression - evaluate expression // View hierarchy debugging // Debug → View Debugging → Capture View Hierarchy ``` ### Console Logging ```swift // Structured logging import os.log let logger = Logger(subsystem: "com.yourapp.yourapp", category: "Main") logger.info("User logged in") logger.error("Failed to load data: \(error.localizedDescription)") ``` ### Network Debugging ```swift // Use Charles Proxy or Proxyman // Or implement network logging extension NetworkLogger { static func log(request: URLRequest) { print("🌐 \(request.httpMethod ?? "") \(request.url?.absoluteString ?? "")") } } ``` ## Automated Testing ### Unit Tests ```swift // Tests/YourAppTests/AuthenticationTests.swift import XCTest @testable import YourApp class AuthenticationTests: XCTestCase { var authService: AuthService! override func setUp() { super.setUp() authService = AuthService() } func testValidLogin() async { let result = await authService.login(email: "test@example.com", password: "password") XCTAssertTrue(result.success) } func testInvalidLogin() async { let result = await authService.login(email: "test@example.com", password: "wrong") XCTAssertFalse(result.success) } } ``` ### UI Tests ```swift // Tests/YourAppUITests/AuthenticationUITests.swift import XCTest class AuthenticationUITests: XCTestCase { override func setUpWithError() throws { continueAfterFailure = false } func testLoginFlow() throws { let app = XCUIApplication() app.launch() // Tap login button app.buttons["Login"].tap() // Enter credentials app.textFields["Email"].typeText("test@example.com") app.secureTextFields["Password"].typeText("password") // Submit app.buttons["Sign In"].tap() // Verify home screen XCTAssertTrue(app.staticTexts["Welcome"].waitForExistence(timeout: 5)) } } ``` ### Run Tests ```bash # Unit tests xcodebuild test -workspace LysnrAI.xcworkspace \ -scheme LysnrAI \ -destination 'platform=iOS Simulator,name=iPhone 16 Pro' # UI tests xcodebuild test -workspace LysnrAI.xcworkspace \ -scheme LysnrAI \ -destination 'platform=iOS Simulator,name=iPhone 16 Pro' \ -only-testing:LysnrAITests ``` ## Common Issues and Solutions ### Build Issues | Problem | Solution | | ---------------------- | ---------------------------------------- | | "No such module" | Run `pod install` and clean build | | Code signing errors | Set automatic signing in target settings | | Simulator won't launch | Reset Simulator content and settings | | App crashes on launch | Check device console logs | ### Runtime Issues | Problem | Solution | | --------------------- | -------------------------------- | | Network requests fail | Check API endpoint configuration | | UI not updating | Verify main thread usage | | Data not persisting | Check Core Data model version | | Memory leaks | Use Instruments → Leaks | ## Performance Testing ### Instruments ```bash # Launch with Instruments xcrun xctrace open --template Time Profiler xcrun xctrace open --template Allocations xcrun xctrace open --template Leaks ``` ### Metrics to Track - App startup time (< 3 seconds) - Memory usage (< 100MB typical) - CPU usage during tasks - Network request times - Battery consumption ## Device Testing ### Physical Device Setup ```bash # Connect device # Trust computer on device # Check in Xcode: Window → Devices and Simulators # Install on device xcodebuild -workspace LysnrAI.xcworkspace \ -scheme LysnrAI \ -destination 'platform=iOS,name=Your iPhone' \ install ``` ### Test on Real Devices - Performance differences - Touch ID/Face ID - Camera/microphone access - Push notifications - Background modes ## CI/CD Integration ### GitHub Actions ```yaml name: iOS Tests on: [push, pull_request] jobs: test: runs-on: macos-latest steps: - uses: actions/checkout@v4 - name: Setup Xcode uses: maxim-lobanov/setup-xcode@v1 with: xcode-version: latest-stable - name: Install CocoaPods run: | cd mobile_app/ios pod install - name: Run Tests run: | xcodebuild test \ -workspace mobile_app/ios/LysnrAI.xcworkspace \ -scheme LysnrAI \ -destination 'platform=iOS Simulator,name=iPhone 16 Pro' ``` ## Test Documentation ### Test Checklist Template ```markdown # iOS Test Report - Version 1.0.0 ## Environment - Xcode: 15.0 - iOS: 17.0 - Device: iPhone 16 Pro Simulator ## Test Results | Feature | Status | Notes | | ------------------ | ------ | -------------------- | | Authentication | ✅ | All flows working | | Home Screen | ✅ | Data loads correctly | | Settings | ⚠️ | Dark mode issue | | Push Notifications | ❌ | Not configured | ## Bugs Found 1. Settings screen crashes in dark mode 2. Push notification permission not requested ## Next Steps 1. Fix dark mode crash 2. Implement push permission flow ``` ## Best Practices ### Testing Strategy 1. **Test on multiple devices** - Different screen sizes 2. **Test iOS versions** - Support current and previous major version 3. **Use real devices** - Simulators don't catch everything 4. **Automate regression tests** - Prevent breaking existing features ### Debugging Tips 1. **Use breakpoints effectively** - Conditional breakpoints 2. **Check console logs** - Both Xcode and device console 3. **Use view debugger** - Inspect UI hierarchy 4. **Profile performance** - Don't guess, measure ## Notes - **Simulator limitations** - Some features differ on real devices - **iOS version differences** - Test on minimum supported version - **App Store guidelines** - Test against review guidelines - **Accessibility matters** - Test with VoiceOver and other accessibility features ## Related Skills - [iOS Release](./ios-release.md) - After testing - [Mobile Code Quality](./mobile-code-quality.md) - Code standards - [Test Strategies](./test-strategies.md) - General testing - [Debug Service](./debug-service.md) - Troubleshooting