Document smoke test 1차 results and open issue #12 follow-up

- Live SUT smoke surfaced 4 structural gaps post-#11 fix
- recorder UIA path capture works (PID attach + FromPoint)
- player resolver only matches last AutomationId → wrong elements
- recorder type-step target empty → player skips text input
- Box command not reproduced; coordinate replay partially works

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
minsung
2026-04-07 20:18:54 +09:00
parent a5523b41e5
commit caaacacd8c
2 changed files with 64 additions and 0 deletions

View File

@@ -0,0 +1,59 @@
# 2026-04-07 Smoke Test 1회차 결과
- **이슈**: #11 fix 검증 → 새 이슈 #12 도출
- **소요 시간**: ~1.5시간 (Step 0~4 + 4번 재녹화)
- **Context 사용량**: ~370k tokens (orchestrator 누적)
## 진행 단계
| Step | 결과 | 메모 |
|------|------|------|
| 0 | 환경 확인 | .NET 9 SDK, SUT 존재, DPI 100% |
| 1 | 빌드 + `dotnet test` | 60/60 green |
| 2 | SUT 수동 실행 | `manual-box.hmeg` 저장 성공 |
| 3 | recorder 1회차 (`box-create.yaml`) | target 100% null, 113 step skip |
| 3-fix | 이슈 #11 fix (STAThread 등) | merged commit `139fbbc` |
| 3-2회차 | recorder (`box-v2.yaml`) | target 여전히 null — attach 실패 (창 제목 mismatch) |
| 3-3회차 | recorder PID attach (`box-v3.yaml`) | VS Code 창이 잡힘 (recorder는 시스템 hook이라 모든 창 캡처) |
| 3-4회차 | SUT-only 캡처 (`box-v4.yaml`) | ✅ **target에 SUT UIA path 정확히 잡힘** (`MetroWindow`, `CommandBox`, `CB`) |
| 4 | player 재생 (cleaned `box-v4-clean.yaml`) | exit 0이지만 Box 미생성 |
## 결정적 발견
### 성공
1. recorder의 PID attach + UIA `FromPoint`가 정상 동작
2. yaml에 SUT 컨트롤 path 정확히 기록 (`MetroWindow[@AutomationId='root']/CommandPanel/.../CB`)
3. Win32 VK → 문자 번역 (`BOX`, `enter`)
4. player의 `null guard`가 의도대로 동작 — type 스텝을 안전하게 skip
5. Box 명령 자체는 SUT가 받음 (좌표 입력은 일부 진행됨)
### 실패 / 해결할 gap
**Gap A — player `UiaPlayerHost.ResolveElement` AutomationId-only 매칭**
- `MetroWindow/ItemsControl` 같이 마지막 segment에 AutomationId가 없는 path는 빈 string으로 검색 → first descendant 아무거나 잡음 → 엉뚱한 좌표 클릭
- 결과: 메뉴 클릭이 재질 스타일 팝업을 열거나, ItemsControl의 임의 위치를 클릭
**Gap B — recorder type 스텝에 target 미설정**
- `DragCollapser`가 type 스텝을 만들 때 typeRes가 null이면 target을 안 채움
- player의 null guard가 type을 skip → "BOX"·"10" 입력 안 됨
- typeRes가 항상 null인 이유: 키 이벤트는 resolver를 안 부르도록 fix했기 때문 (정당한 이유). 하지만 그러면 type 스텝의 target은 어디서 가져와야 하는가? → 직전 focus_change 이벤트의 element를 사용하는 게 자연스러움
**Gap C (부수)** — recorder가 시스템 전역 hook이라 SUT 외 창의 이벤트도 캡처. 사용자가 alt+tab하면 다른 창 path가 섞임. 필터 필요.
**Gap D (부수)** — yaml 한글 인코딩 PowerShell 출력 시 깨짐 (파일 자체는 정상일 가능성)
## Box 명령이 안 그려진 이유 정리
1. type 스텝 2개 skip → "BOX" 미입력 → Box 명령 미발동
2. click 7개는 잘못된 element를 잡고 엉뚱한 좌표 클릭
3. 그래도 일부 좌표가 우연히 SUT 영역과 겹쳐 메뉴 팝업 열림 정도 발생
## 다음 단계
- 이슈 #12 생성: player full-path resolver + recorder type-step target inheritance
- Generator → Evaluator 사이클
- Smoke 2회차
## Smoke가 잡아낸 것의 가치
샌드박스 60 unit test 전부 green 상태에서도 라이브 실행 시 발견된 **구조적 gap이 4개**. harness design 기사가 강조한 "integration gaps that unit tests miss" 정확한 사례. Smoke test 패턴의 가치 실증.