Total rebrand across KMM project: - Kotlin package: com.example.casera -> com.tt.honeyDue (dirs + declarations) - Gradle: rootProject.name, namespace, applicationId - Android: manifest, strings.xml (all languages), widget resources - iOS: pbxproj bundle IDs, Info.plist, entitlements, xcconfig - iOS directories: Casera/ -> HoneyDue/, CaseraTests/ -> HoneyDueTests/, etc. - Swift source: all class/struct/enum renames - Deep links: casera:// -> honeydue://, .casera -> .honeydue - App icons replaced with honeyDue honeycomb icon - Domains: casera.treytartt.com -> honeyDue.treytartt.com - Bundle IDs: com.tt.casera -> com.tt.honeyDue - Database table names preserved Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
7.3 KiB
XCUITest Debugging Guide
Current Status
✅ Completed:
- Created comprehensive XCUITest infrastructure (34 tests)
- Added
AccessibilityIdentifiers.swiftwith centralized identifiers - Added accessibility identifiers to critical views (LoginView, RegisterView, MainTabView, Residence views, ProfileView)
- Updated
TestHelpers.swiftto use accessibility identifiers - Project builds successfully for testing
❌ Issue:
- ALL tests are failing within ~0.5 seconds
- Tests fail during
setUp()when trying to login - The login helper cannot find UI elements by their accessibility identifiers
Root Cause Analysis
The tests fail at this line in TestHelpers.swift:44:
let usernameField = app.textFields[AccessibilityIdentifiers.Authentication.usernameField]
XCTAssertTrue(usernameField.waitForExistence(timeout: 5), "Username field should exist")
// ❌ This assertion fails - field not found
Possible Causes:
- Accessibility identifiers not set at runtime - The
.accessibilityIdentifier()modifiers might not be working - App not rendering properly in test mode - The app might be crashing or showing a different screen
- Timing issue - The login screen might not be fully loaded when the test runs
- Kotlin initialization blocking - The TokenStorage/Kotlin framework might be blocking UI rendering
Recommended Next Steps
Option 1: Debug in Xcode (RECOMMENDED)
This is the fastest way to diagnose the issue:
-
Open the project in Xcode:
cd /Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp open iosApp.xcodeproj -
Select the Test target and a simulator:
- Select "iPhone 17 Pro" simulator from the device dropdown
- Select the
HoneyDueTestsscheme
-
Use UI Recording to see what elements exist:
- Open
DebugLoginTest.swift - Place your cursor in
testAppLaunches()method - Click the red record button at the bottom of the editor
- The app will launch in the simulator
- Tap on UI elements - Xcode will generate code showing the actual identifiers
- Stop recording and examine the generated code
- Open
-
Check console output:
- Run
testAppLaunches()test (Cmd+U or click diamond icon in gutter) - View console output (Cmd+Shift+Y) to see the
XCTContextactivity logs - This will show actual counts of UI elements found
- Run
-
Use Accessibility Inspector:
- Open Accessibility Inspector (Xcode → Open Developer Tool → Accessibility Inspector)
- Run the app normally (not in test mode)
- Inspect the login fields to verify accessibility identifiers are set
Option 2: Add Debug Output to App
Modify LoginView.swift to print when it renders:
var body: some View {
// ... existing code ...
.onAppear {
print("🟢 LoginView appeared")
print("🔍 Username field identifier: \(AccessibilityIdentifiers.Authentication.usernameField)")
}
}
Then run tests and check if "LoginView appeared" prints in console.
Option 3: Simplify the Test
The DebugLoginTest.swift is already simplified. Try running it:
cd /Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp
xcodebuild test \
-project iosApp.xcodeproj \
-scheme iosApp \
-destination 'platform=iOS Simulator,name=iPhone 17 Pro' \
-only-testing:HoneyDueTests/DebugLoginTest/testAppLaunches
Check if it passes (meaning the app launches and has SOME UI elements).
Known Issues to Check
1. AccessibilityIdentifiers Not in Test Target
Verify that AccessibilityIdentifiers.swift is included in the iosApp target (not HoneyDueTests):
- In Xcode, select
Helpers/AccessibilityIdentifiers.swift - In File Inspector (right panel), check "Target Membership"
- ✅
iosAppshould be checked - ❌
HoneyDueTestsshould NOT be checked
2. LoginView Not Using Correct Identifiers
Double-check Login/LoginView.swift:
grep "accessibilityIdentifier" /Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/iosApp/Login/LoginView.swift
Should output:
.accessibilityIdentifier(AccessibilityIdentifiers.Authentication.usernameField)
.accessibilityIdentifier(AccessibilityIdentifiers.Authentication.passwordField)
.accessibilityIdentifier(AccessibilityIdentifiers.Authentication.loginButton)
3. App Showing Different Screen in Test Mode
The app might be checking for existing auth token and bypassing login. Check if TokenStorage has a stored token from previous runs:
// In iOSApp.swift init(), add for testing:
#if DEBUG
if ProcessInfo.processInfo.arguments.contains("--uitesting") {
TokenStorage.shared.clearToken() // Force logout for tests
}
#endif
4. Kotlin Framework Initialization Blocking
The app initializes TokenStorage in iOSApp.init(). This might be blocking:
init() {
// This could be blocking UI rendering:
TokenStorage.shared.initialize(manager: TokenManager())
}
Try moving initialization to background thread or making it async.
Quick Verification Commands
# Check if identifiers are in LoginView
grep -c "accessibilityIdentifier" /Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/iosApp/Login/LoginView.swift
# Should output: 6
# Check if AccessibilityIdentifiers exists
ls -la /Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/iosApp/Helpers/AccessibilityIdentifiers.swift
# Should show the file
# Run simplified debug test
cd /Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp
xcodebuild test -project iosApp.xcodeproj -scheme iosApp \
-destination 'platform=iOS Simulator,name=iPhone 17 Pro' \
-only-testing:HoneyDueTests/DebugLoginTest/testAppLaunches 2>&1 | grep "Test Case"
Expected Output When Working
When tests work properly, you should see:
Test Case '-[HoneyDueTests.DebugLoginTest testAppLaunches]' started.
Activity 'Found 1 text fields' started
Activity 'Found 1 secure fields' started
Activity 'Found 5 buttons' started
Activity 'Email field exists: true' started
Activity 'Password field exists: true' started
Test Case '-[HoneyDueTests.DebugLoginTest testAppLaunches]' passed (5.234 seconds).
Currently seeing:
Test Case '-[HoneyDueTests.DebugLoginTest testAppLaunches]' failed (0.540 seconds)
The ~0.5 second failure suggests the app isn't even launching or is crashing immediately.
Files Modified
- ✅
/Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/iosApp/Helpers/AccessibilityIdentifiers.swift- Created - ✅
/Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/iosApp/Login/LoginView.swift- Added 6 identifiers - ✅
/Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/iosApp/Login/RegisterView.swift- Added 6 identifiers - ✅
/Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/iosApp/MainTabView.swift- Added 5 tab identifiers - ✅
/Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/iosApp/Residence/*- Added 15+ identifiers - ✅
/Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/iosApp/Profile/ProfileTabView.swift- Added logout identifier - ✅
/Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/HoneyDueTests/TestHelpers.swift- Updated to use identifiers - ✅
/Users/treyt/Desktop/code/HoneyDue/HoneyDueKMM/iosApp/HoneyDueTests/DebugLoginTest.swift- Simplified debug test
Next Action
Open the project in Xcode and use the UI Recording feature. This will immediately show you what identifiers are actually available and why the tests can't find them.