70bf5703b32863a87b32355429b51697086e3f71
First time box-v6.yaml (raw recorder output, 676 lines) replays end-to-end and actually creates a Box in the SUT — no AI post-editing of target paths or offsets required. This is the counterpart to #13's recorder-side fixes: the player now absorbs the remaining record→replay gaps instead of demanding a hand-cleaned scenario. Changes (all in Recordingtest.Player): - PlayerEngine: null-target fallbacks - Type with null target → host.Type() against current focus - Click with null target + raw_coord → click at screen-absolute raw_coord - Other null targets still skipped - PlayerEngine: strip leading alt+tab hotkey steps (recording-startup noise that fights the player's own foreground switch) - PlayerEngine: preserve recorded inter-step timing, clamped 150ms–3s, routed through new IPlayerHost.Delay so the engine itself stays Sleep-free (keeps the existing "no fixed sleep" DoD test passing) - PlayerEngine: per-step console log for live debugging - UiaPlayerHost: BringSutToForeground() — SetForeground + Focus + 600ms settle, called from Program.cs before engine.Run - Step model: add RawCoord (int[]) and Ts (long?) fields, auto-mapped from YAML raw_coord / ts keys Tests updated: - PlayerEngine_NullTarget_SkipsWithoutCalling → _Fallback_Issue14 (verifies the new Click-with-raw_coord and Type behavior) - FakePlayerHost (both player.tests and runner.tests) implement Delay Live smoke: box-v6.yaml raw replay produced the expected Box geometry on the 2nd attempt; 1st attempt dropped the initial "BOX" keystrokes, tracked as a follow-up (foreground settle is still threshold-sensitive at 600ms). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
recordingtest
사내 WPF 3D 편집 응용(자체 엔진 HmEG, MEF plugin 아키텍처)에 대한 사용자 입력 회귀 테스트 자동화 도구. 도구 자체이지 SUT가 아니다. 자세한 운영 지침은 CLAUDE.md, 현재 진행 상태는 PROGRESS.md, 다음 할 일은 PLAN.md를 참고.
핵심 전략 — Golden-file 회귀
수동 테스트 입력을 레코딩 → 리플레이 → 결과 저장 파일을 정규화 후 baseline과 diff. ApprovalTests 패턴과 동형이며 SUT 코드 변경 협조를 최소화하기 위한 의도적 선택이다.
[수동 테스트] → 입력 레코드 + 결과 파일 A (approved baseline)
[회귀 시점] → 입력 리플레이 → 결과 파일 B → normalize → diff(A, B)
모듈 구성
| 모듈 | 책임 | 상태 |
|---|---|---|
| Recordingtest.SutProber | SUT 정적 probe (plugin/Json/assembly 카탈로그) | PoC pass |
| Recordingtest.Recorder | 입력 캡처 (UIA element path + offset + 키/마우스/포커스) | PoC pass |
| Recordingtest.Player | 시나리오 재생, 비동기 동기화 | PoC pass |
| Recordingtest.Normalizer | 결과 파일 정규화 (timestamp/GUID/path/float/order) | PoC pass |
| Recordingtest.DiffReporter | approved vs received diff 리포트 | PoC pass |
| Recordingtest.EngineBridge.Client + Recordingtest.EgPlugin | HmEG 내부 상태 sidecar (MEF plugin masquerade + HttpListener) | v2 pass |
| Recordingtest.Runner | 5-모듈 E2E 파이프라인 + 실패 triage | PoC pass |
작업 사이클 — Planner / Generator / Evaluator
Anthropic harness design 원칙을 채택. 같은 에이전트가 생성과 평가를 겸하지 않는다.
/contract <name>— Sprint Contract 작성 (docs/contracts/<name>.md, 검증 가능한 DoD)- Generator — 계약 기준으로 구현
/evaluate <name>— 독립 evaluator가 채점, pass 시에만 PROGRESS.md 갱신
기술 스택
- 언어: C# / .NET (SUT와 동일 생태계)
- UI 자동화: FlaUI 1순위, Win32 low-level hook hybrid
- 시나리오 포맷: YAML/JSON (git diff 친화적)
- 베이스라인:
*.approved.{ext}/*.received.{ext}
디렉터리
recordingtest/
├── src/ # 모듈별 C# 프로젝트
├── scenarios/ # 시나리오 YAML
├── docs/
│ ├── contracts/ # Sprint Contracts + evaluations
│ ├── history/ # 작업 히스토리
│ ├── sut-catalog/ # sut-prober 산출물
│ └── guides/ # smoke test, deploy 가이드
├── CLAUDE.md # 에이전트 운영 지침
├── PROGRESS.md # 완료 상태
└── PLAN.md # 우선순위 큐
저장소
- Origin: https://gitea.hmac.kr/kimminsung/recordingtest
- 이슈/PR은 동일 Gitea, 커밋 메시지에
#N참조
Description
Languages
C#
93.2%
Python
4.6%
Shell
1.4%
Batchfile
0.8%