Enable parallel UI test execution via per-session data isolation

Each test class now gets a unique session ID (UUID) passed to the app
via UI_TEST_SESSION_ID environment variable. The app uses this to:

- Route GroupUserDefaults to a session-specific UserDefaults suite,
  preventing tests from clobbering each other's AppStorage state
- Create an in-memory SwiftData container instead of the shared
  on-disk App Group store, eliminating SQLite contention

Refactored 8 test classes that bypassed BaseUITestCase.setUp() with
custom launch args — they now use overridable `localeArguments` and
`extraLaunchArguments` properties, keeping session ID injection
centralized. Added `relaunchApp(resetState:bypassSubscription:)` to
BaseUITestCase for tests that need mid-test relaunch with different
subscription state.

Includes a ParallelUITests.xctestplan with class-level parallelism
enabled and random execution ordering.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Trey T
2026-03-24 15:04:55 -05:00
parent 8231750cff
commit 2ef1c1ec51
13 changed files with 128 additions and 145 deletions

View File

@@ -10,25 +10,7 @@ import XCTest
final class LongTranslationTests: BaseUITestCase {
override var seedFixture: String? { "single_mood" }
override var bypassSubscription: Bool { true }
override func setUp() {
// Do NOT call super we need German locale (known for long compound words)
continueAfterFailure = false
let application = XCUIApplication()
let args: [String] = [
"--ui-testing", "--disable-animations",
"--reset-state",
"--bypass-subscription",
"--skip-onboarding",
"-AppleLanguages", "(de)",
"-AppleLocale", "de_DE"
]
application.launchArguments = args
application.launchEnvironment = ["UI_TEST_FIXTURE": "single_mood"]
application.launch()
app = application
}
override var localeArguments: [String] { ["-AppleLanguages", "(de)", "-AppleLocale", "de_DE"] }
/// TC-138: German locale with long compound words renders without crashes.
/// Navigates through all tabs to ensure no layout truncation causes issues.