From caaacacd8ce22f86432e55d277fa0ed7d7108f3d Mon Sep 17 00:00:00 2001 From: minsung Date: Tue, 7 Apr 2026 20:18:54 +0900 Subject: [PATCH] =?UTF-8?q?Document=20smoke=20test=201=EC=B0=A8=20results?= =?UTF-8?q?=20and=20open=20issue=20#12=20follow-up?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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) --- PROGRESS.md | 5 ++ docs/history/2026-04-07_smoke-1회차-결과.md | 59 +++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 docs/history/2026-04-07_smoke-1회차-결과.md diff --git a/PROGRESS.md b/PROGRESS.md index a540fd3..18ecfb4 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -37,6 +37,11 @@ | 2026-04-07 | 라이브 SUT smoke test 가이드 작성 | `docs/guides/smoke-test.md` | | 2026-04-07 | Smoke test 1회차 — integration gap 4개 발견 (recorder target null, VK 코드, player enum, null guard) | `scenarios/box-create.yaml` | | 2026-04-07 | Smoke gap fix + Evaluator pass (#11) — STAThread, KeyTranslator, 60 tests, regression trap 검증 | commit `139fbbc` | +| 2026-04-07 | Smoke test 1회차 — recorder PID attach + UIA target 정상 (box-v4), player 재생 부분 실패 | `docs/history/2026-04-07_smoke-1회차-결과.md`, scenarios/box-v4*.yaml | + +## In progress + +- 이슈 #12 — Smoke 1회차 후속 gap fix (player resolver + recorder type target + 부수) ## In progress diff --git a/docs/history/2026-04-07_smoke-1회차-결과.md b/docs/history/2026-04-07_smoke-1회차-결과.md new file mode 100644 index 0000000..e3e7967 --- /dev/null +++ b/docs/history/2026-04-07_smoke-1회차-결과.md @@ -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 패턴의 가치 실증.