Files
ruoyi-vue-pro/docs/education/migration/issues/EDU-002-practice-regression-baseline.md

104 lines
4.9 KiB
Markdown

# EDU-002 — Restore the full Practice regression baseline
- **Status:** completed as test-context repair; PostgreSQL persistence coverage moved to EDU-016
- **Type:** test-enablement vertical slice
- **Phase:** 0 / Phase 2 prerequisite
- **Blockers:** EDU-001
## Outcome
The complete Practice test set starts reliably and distinguishes test-context failures from real behavior regressions across create, answer, restore, submit, report, wrong-question, and favorite flows.
## Why this is next
The direct EDU-001 tests pass, but broader Practice tests currently fail during Spring test-context creation because test configurations that import `PracticeSessionServiceImpl` do not consistently provide its current `ScoringService` dependency. Some tests also use name-based `@Resource` injection against Mapper proxies, producing type mismatches. Continuing core-loop work without this feedback loop would hide regressions.
## Existing code and data
- No legacy capability is being newly migrated.
- No database object changes are required.
- Existing Education test SQL and Mapper test infrastructure are reused.
## Scope
1. Inventory every test that imports, instantiates, or indirectly creates `PracticeSessionServiceImpl`.
2. For each test context, choose one explicit dependency strategy:
- import the real `ScoringServiceImpl` when scoring behavior is under test; or
- provide `@MockitoBean ScoringService` when the test is outside the scoring seam.
3. Replace ambiguous name-based Mapper injection only where it currently prevents the target tests from starting.
4. Run the complete focused Practice regression set.
5. Classify remaining failures as:
- test assembly defect;
- existing product defect;
- expected contract change from EDU-001;
- unrelated dirty-worktree issue.
6. Fix only test-assembly defects in this ticket. Create separate tickets for product defects.
## Reuse boundaries
- Reuse `BaseDbUnitTest`, existing Education test SQL, Spring `@Import`, and `@MockitoBean`.
- Do not create a parallel test framework.
- Do not modify System, Member, database schema, or production state machines.
- Do not weaken assertions merely to make tests green.
## Target test set
```text
PracticeSessionServiceImplTest
PracticeAnswerServiceImplTest
PracticeSubmitServiceImplTest
PracticeSubmitProjectionIntegrationTest
PracticeSessionControllerHttpTest
PracticeAnswerControllerHttpTest
PracticeSessionControllerSubmitHttpTest
WrongQuestionServiceImplTest
FavoriteServiceImplTest
```
## Acceptance criteria
- [ ] Every target class starts its Spring/JUnit context.
- [ ] No target class fails because `ScoringService` is missing.
- [ ] No target class fails from avoidable Mapper bean-name/type injection ambiguity.
- [ ] EDU-001 safe-content assertions remain green.
- [ ] Any actual behavior failure is documented with reproducible command and assigned a separate ticket.
- [ ] No production behavior or database schema is changed unless a failing regression proves it is necessary and the ticket is explicitly amended.
## Test command
```bash
mvn -pl yudao-module-education \
-Dtest='PracticeSessionServiceImplTest,PracticeAnswerServiceImplTest,PracticeSubmitServiceImplTest,PracticeSubmitProjectionIntegrationTest,PracticeSessionControllerHttpTest,PracticeAnswerControllerHttpTest,PracticeSessionControllerSubmitHttpTest,WrongQuestionServiceImplTest,FavoriteServiceImplTest' \
-Dsurefire.failIfNoSpecifiedTests=false \
test
```
Then:
```bash
git diff --check
mvn -pl yudao-server -am -DskipTests clean compile
```
## Risk and rollback
- **Risk:** Low production risk; medium risk of exposing pre-existing behavior defects.
- **Rollback:** Revert only this ticket's test assembly changes. There is no database rollback.
## Completion result
Test-context assembly was repaired:
- `ScoringService` is now explicitly mocked in Practice contexts that are not testing scoring itself.
- `PracticeQuestionMapper` fields use type-based injection where name-based `@Resource` resolved the wrong MyBatis proxy.
- Controller tests and `PracticeSessionServiceImplTest` start and pass.
The expanded regression run then exposed a separate infrastructure limitation rather than a remaining Spring context defect: H2 cannot execute the production PostgreSQL `ON CONFLICT` statements, and the unified `education_idempotency` test table was missing. A temporary H2 table definition was added so table absence no longer masks the dialect issue, but PostgreSQL conflict semantics cannot be made truthful on H2. The required follow-up is [`EDU-016`](EDU-016-postgresql-persistence-tests.md).
## Verification result
- Controller Practice tests: 39 passed.
- `PracticeSessionServiceImplTest`: 24 passed before PostgreSQL-dialect persistence paths were included.
- Full targeted suite starts after dependency/injection repair, then fails on confirmed H2/PostgreSQL dialect mismatch and downstream assertions.
- No production behavior was changed by EDU-002.