Harness(하네스)란 무엇인가
테스트 실행 환경에서 AI 에이전트까지, 대상을 감싸서 제어하는 시스템
Harness라는 단어는 원래 "말에 채우는 마구(馬具)"다. 말(대상)을 제어하기 위해 감싸는 장치. 소프트웨어에서도 같은 의미로 쓴다.
Test Harness — 원조
Test Harness는 테스트 대상(SUT: System Under Test)을 감싸서 실행하는 환경이다. 테스트 실행기, mock 데이터, 로그 수집, 결과 평가를 묶은 것.
JUnit, RSpec, pytest 같은 테스트 프레임워크가 전부 Test Harness다. 테스트 코드 자체가 아니라, 테스트를 실행하고 결과를 수집하는 "환경"이 하네스.
Keploy 같은 도구도 Test Harness다. eBPF로 커널 레벨에서 앱의 네트워크 트래픽을 녹화하고, 녹화된 트래픽으로 테스트를 자동 생성한다. 앱 코드를 수정하지 않고 앱을 "감싸서" 테스트 환경을 만드는 것.
AI Harness — 확장
AI/LLM 문맥에서는 모델을 실제 작업에 연결하는 시스템 전체를 뜻한다. 파일 읽기, 코드 수정, 테스트 실행, 에러 분석, 재시도까지 포함하는 파이프라인.
핵심 인사이트는 '대상(모델/앱)의 성능보다 Harness 설계가 더 중요하다'는 것이다. 같은 Codex라도 단순한 Harness(prompt → 코드 → 끝)와 좋은 Harness(repo 탐색 → patch → 테스트 → 에러 분석 → 재수정 반복)의 SWE-bench 점수 차이가 크다.
하네스의 공통 패턴
분야가 달라도 하네스의 구조는 비슷하다.
감싸기(Wrapping) — 대상을 직접 수정하지 않고, 외부에서 감싸서 제어한다. Keploy는 eBPF로 앱을 감싸고, Claude Code는 프롬프트와 도구로 모델을 감싼다.
격리(Isolation) — 외부 의존성을 차단하고 제어된 환경에서 실행한다. Test Harness는 DB를 mock하고, AI Harness는 샌드박스에서 코드를 실행한다.
관찰(Observation) — 대상의 입출력을 기록하고 분석한다. Test Harness는 테스트 결과를, AI Harness는 모델의 행동을 추적한다.
반복(Iteration) — 결과를 보고 재실행한다. 테스트가 실패하면 코드를 고치고 다시 돌린다. 에이전트가 실패하면 다른 접근을 시도한다.
동작 흐름
감싸기(Wrapping) — 대상을 수정하지 않고 외부에서 감싸서 제어 (eBPF로 앱을 감싸든, 프롬프트로 모델을 감싸든)
격리(Isolation) — 외부 의존성을 차단하고 제어된 환경에서 실행 (DB mock, 샌드박스)
관찰(Observation) — 대상의 입출력을 기록하고 분석 (테스트 결과, 모델 행동 추적)
반복(Iteration) — 결과를 보고 재실행 (테스트 실패 → 수정 → 재실행, 에이전트 실패 → 재시도)
장점
- ✓ Harness 설계를 개선하면 모델 교체 없이도 성능이 크게 향상됨
- ✓ Cursor, Claude Code, Devin 등 AI 코딩 도구의 핵심 차별점이 Harness
- ✓ 2026년 현재 AI 업계에서 Model Engineering보다 Harness Engineering이 더 중요한 기술
단점
- ✗ Harness가 복잡할수록 디버깅과 유지보수가 어려워짐
- ✗ 모델 업데이트 시 Harness와의 호환성 문제가 발생할 수 있음