docs(9.1): create phase plan
Phase 9.1: Fix Flaky Test When Ran In Parallel - 1 plan created - 2 tasks defined - Ready for execution Fixes 5 tests that fail in parallel but pass individually
This commit is contained in:
@@ -0,0 +1,232 @@
|
||||
---
|
||||
phase: 9.1-fix-flaky-test-when-ran-in-parallel
|
||||
plan: 01
|
||||
type: execute
|
||||
---
|
||||
|
||||
<objective>
|
||||
Fix test suite flakiness where 5 tests fail in parallel execution but pass individually.
|
||||
|
||||
Purpose: Ensure reliable CI/CD testing by resolving Swift Testing parallel execution state pollution discovered in Phase 9.
|
||||
Output: All 5 flaky tests pass consistently in full parallel test suite execution.
|
||||
</objective>
|
||||
|
||||
<execution_context>
|
||||
~/.claude/get-shit-done/workflows/execute-phase.md
|
||||
~/.claude/get-shit-done/templates/summary.md
|
||||
</execution_context>
|
||||
|
||||
<context>
|
||||
@.planning/PROJECT.md
|
||||
@.planning/ROADMAP.md
|
||||
@.planning/STATE.md
|
||||
@.planning/codebase/TESTING.md
|
||||
|
||||
# Prior phase context
|
||||
@.planning/phases/09-trip-planner-modes-tdd/09-01-SUMMARY.md
|
||||
@.planning/phases/09-trip-planner-modes-tdd/09-02-SUMMARY.md
|
||||
@.planning/phases/09-trip-planner-modes-tdd/09-03-SUMMARY.md
|
||||
|
||||
# Test files with flaky tests
|
||||
@SportsTimeTests/ScenarioAPlannerSwiftTests.swift
|
||||
@SportsTimeTests/ScenarioBPlannerTests.swift
|
||||
@SportsTimeTests/ScenarioCPlannerTests.swift
|
||||
|
||||
**Flaky tests identified (5 total):**
|
||||
|
||||
From ScenarioAPlannerSwiftTests.swift (3 tests):
|
||||
- `plan_StopDepartureDate_IsLastGameDate()` (line ~300)
|
||||
- `plan_ManyGames_HandledEfficiently()` (line ~493)
|
||||
- `plan_ThreeSameDayGames_PicksFeasibleCombinations()` (line ~944)
|
||||
|
||||
From ScenarioBPlannerTests.swift (2 tests):
|
||||
- `plan_FillerSameDayAsAnchor_Excluded()`
|
||||
- `plan_MustSeeGamesTooFarApart_Fails()`
|
||||
|
||||
From ScenarioCPlannerTests.swift (1 test):
|
||||
- `corridor_MultipleGamesMixed_FiltersCorrectly()`
|
||||
|
||||
**Root cause:** Swift Testing runs tests in parallel by default. Tests likely share mutable state (actor instances, simulator state) causing interference.
|
||||
|
||||
**Tech stack available:**
|
||||
- Swift Testing framework (iOS 26+)
|
||||
- `#expect()` assertions
|
||||
- `@Suite` and `@Test` attributes
|
||||
- `.serialized` trait for controlling parallelization
|
||||
- `confirmation()` for actor synchronization
|
||||
|
||||
**Key observation:** ScenarioAPlannerSwiftTests is missing `@Suite` attribute (other test files have it).
|
||||
</context>
|
||||
|
||||
<tasks>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 1: Add Swift Testing isolation to flaky tests</name>
|
||||
<files>SportsTimeTests/ScenarioAPlannerSwiftTests.swift, SportsTimeTests/ScenarioBPlannerTests.swift, SportsTimeTests/ScenarioCPlannerTests.swift</files>
|
||||
<action>
|
||||
Apply Swift Testing isolation patterns to prevent state pollution:
|
||||
|
||||
1. **Add @Suite attribute to ScenarioAPlannerSwiftTests** (currently missing):
|
||||
- Add `@Suite("ScenarioA Tests")` before `struct ScenarioAPlannerSwiftTests`
|
||||
- Matches pattern used in ScenarioBPlannerTests and ScenarioCPlannerTests
|
||||
|
||||
2. **Apply .serialized trait to flaky tests:**
|
||||
- Modify the 5 flaky test functions to use `.serialized` trait
|
||||
- Swift Testing syntax: `@Test(.serialized, "test description")`
|
||||
- This prevents parallel execution of these specific tests
|
||||
- Example: Change `@Test("handles many games")` to `@Test(.serialized, "handles many games")`
|
||||
|
||||
3. **Verify actor synchronization patterns:**
|
||||
- Review if tests use `confirmation()` for actor operations (Swift Testing pattern for async/actor testing)
|
||||
- Add `confirmation()` if tests modify shared actor state and don't already use it
|
||||
- Only needed if actors are shared across tests (check planner initialization in `plan()` helper)
|
||||
|
||||
**Why .serialized:** These tests likely interfere due to parallel execution timing. Running them serially eliminates race conditions while maintaining all other tests' parallel execution benefits.
|
||||
|
||||
**What to avoid and WHY:**
|
||||
- Don't add `.serialized` to ALL tests - only the 5 flaky ones. Other tests benefit from parallel execution speed.
|
||||
- Don't use XCTest patterns (like `setUp()`/`tearDown()`) - this is Swift Testing, use Swift Testing patterns only.
|
||||
- Don't modify test assertions - tests validate correct behavior individually, issue is isolation not correctness.
|
||||
</action>
|
||||
<verify>
|
||||
Run full test suite in parallel:
|
||||
```bash
|
||||
xcodebuild -project SportsTime.xcodeproj -scheme SportsTime -destination 'platform=iOS Simulator,name=iPhone 17,OS=26.2' test
|
||||
```
|
||||
|
||||
All 5 previously flaky tests must pass:
|
||||
- `plan_StopDepartureDate_IsLastGameDate()`
|
||||
- `plan_ManyGames_HandledEfficiently()`
|
||||
- `plan_ThreeSameDayGames_PicksFeasibleCombinations()`
|
||||
- `plan_FillerSameDayAsAnchor_Excluded()`
|
||||
- `plan_MustSeeGamesTooFarApart_Fails()`
|
||||
- `corridor_MultipleGamesMixed_FiltersCorrectly()`
|
||||
|
||||
Run suite 3 times to confirm consistency (flaky tests would fail at least once in 3 runs).
|
||||
</verify>
|
||||
<done>
|
||||
- @Suite attribute added to ScenarioAPlannerSwiftTests
|
||||
- .serialized trait applied to all 5 flaky tests
|
||||
- Full test suite passes 3 consecutive times
|
||||
- Test output shows serialized tests running (no parallel interference)
|
||||
</done>
|
||||
</task>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 2: Verify test isolation doesn't reduce coverage</name>
|
||||
<files>SportsTimeTests/ScenarioAPlannerSwiftTests.swift, SportsTimeTests/ScenarioBPlannerTests.swift, SportsTimeTests/ScenarioCPlannerTests.swift</files>
|
||||
<action>
|
||||
Confirm serialization fixes flakiness without compromising test quality:
|
||||
|
||||
1. **Run tests individually to confirm behavior unchanged:**
|
||||
```bash
|
||||
# Run each flaky test individually
|
||||
xcodebuild -only-testing:SportsTimeTests/ScenarioAPlannerSwiftTests/plan_StopDepartureDate_IsLastGameDate test
|
||||
xcodebuild -only-testing:SportsTimeTests/ScenarioAPlannerSwiftTests/plan_ManyGames_HandledEfficiently test
|
||||
# ... repeat for all 5
|
||||
```
|
||||
All must still pass individually (sanity check).
|
||||
|
||||
2. **Measure performance impact:**
|
||||
- Note full suite execution time before changes (from Task 1 baseline)
|
||||
- Note full suite execution time after .serialized changes
|
||||
- Document in SUMMARY.md (expected: minimal impact since only 5/180+ tests serialized)
|
||||
|
||||
3. **Verify no new flaky tests introduced:**
|
||||
- Check test output for any other tests now showing intermittent failures
|
||||
- Run suite 5 times total (2 more runs after Task 1's 3 runs)
|
||||
- All 180+ tests must pass consistently
|
||||
|
||||
**What to avoid and WHY:**
|
||||
- Don't skip individual test verification - ensures serialization didn't break test logic
|
||||
- Don't accept new flaky tests - if any appear, investigate whether .serialized needs to be applied more broadly or if there's a different issue
|
||||
</action>
|
||||
<verify>
|
||||
```bash
|
||||
# Verify all tests pass consistently
|
||||
for i in {1..5}; do
|
||||
echo "Run $i/5"
|
||||
xcodebuild -project SportsTime.xcodeproj -scheme SportsTime -destination 'platform=iOS Simulator,name=iPhone 17,OS=26.2' test | grep "Test Suite 'All tests'"
|
||||
done
|
||||
```
|
||||
|
||||
Expected output (all 5 runs):
|
||||
- "Test Suite 'All tests' passed"
|
||||
- No failures in any of the 5 runs
|
||||
</verify>
|
||||
<done>
|
||||
- All 5 previously flaky tests pass individually
|
||||
- Full test suite passes 5 consecutive times (100% success rate)
|
||||
- No new flaky tests detected
|
||||
- Performance impact documented (serializing 5/180+ tests should add ~1-2 seconds max)
|
||||
</done>
|
||||
</task>
|
||||
|
||||
</tasks>
|
||||
|
||||
<verification>
|
||||
Before declaring phase complete:
|
||||
- [ ] Full test suite passes consistently (5/5 runs successful)
|
||||
- [ ] All 5 previously flaky tests now pass in parallel execution
|
||||
- [ ] No new flaky tests introduced
|
||||
- [ ] Individual test execution still passes for all 5 tests
|
||||
- [ ] Test isolation change documented in SUMMARY.md
|
||||
</verification>
|
||||
|
||||
<success_criteria>
|
||||
|
||||
- All tasks completed
|
||||
- All verification checks pass
|
||||
- 5 flaky tests now pass reliably in parallel test suite
|
||||
- No degradation in test coverage or execution
|
||||
- CI/CD testing is now reliable
|
||||
</success_criteria>
|
||||
|
||||
<output>
|
||||
After completion, create `.planning/phases/9.1-fix-flaky-test-when-ran-in-parallel/9.1-01-SUMMARY.md`:
|
||||
|
||||
# Phase 9.1 Plan 01: Fix Flaky Test Parallel Execution Summary
|
||||
|
||||
**[Substantive one-liner describing solution - e.g., "Applied .serialized trait to 5 flaky tests for reliable CI/CD execution"]**
|
||||
|
||||
## Performance
|
||||
|
||||
- **Duration:** [time]
|
||||
- **Started:** [timestamp]
|
||||
- **Completed:** [timestamp]
|
||||
- **Tests:** 5 flaky tests fixed
|
||||
|
||||
## Accomplishments
|
||||
|
||||
- Fixed test suite flakiness affecting 5 tests
|
||||
- Added @Suite attribute to ScenarioAPlannerSwiftTests
|
||||
- Applied .serialized trait to prevent parallel execution interference
|
||||
- Verified consistent test suite execution (5/5 runs pass)
|
||||
|
||||
## Files Created/Modified
|
||||
|
||||
- `SportsTimeTests/ScenarioAPlannerSwiftTests.swift` - Added @Suite, .serialized to 3 tests
|
||||
- `SportsTimeTests/ScenarioBPlannerTests.swift` - Added .serialized to 2 tests
|
||||
- `SportsTimeTests/ScenarioCPlannerTests.swift` - Added .serialized to 1 test
|
||||
|
||||
## Decisions Made
|
||||
|
||||
| Decision | Rationale |
|
||||
|----------|-----------|
|
||||
| Use .serialized trait instead of global serialization | Only 5/180+ tests affected, maintains parallel execution benefits for other tests |
|
||||
| Add @Suite to ScenarioAPlannerSwiftTests | Matches pattern in other test files, provides better test organization |
|
||||
|
||||
## Deviations from Plan
|
||||
|
||||
[Auto-fixed issues or deferred enhancements]
|
||||
|
||||
## Issues Encountered
|
||||
|
||||
[Problems and resolutions, or "None"]
|
||||
|
||||
## Next Phase Readiness
|
||||
|
||||
- Test suite reliability: 100% (5/5 parallel runs pass)
|
||||
- Ready for Phase 10: Trip Builder Options TDD
|
||||
- No blockers
|
||||
</output>
|
||||
Reference in New Issue
Block a user