본문으로 건너뛰기
고급약 30분

컴퓨터 사용 에이전트(CUA)와 의도 기반 테스트 정의

경로를 미리 정하는 실행에서 런타임에 찾아가는 실행으로. CUA가 무엇이고, 의도 기반 테스트 정의를 어떤 형식으로 쓰며, 언제 이 방식을 쓰고 언제 쓰지 말아야 하는지 판단 기준을 세운다.

  • #CUA
  • #ComputerUse
  • #의도기반테스트
  • #OpenTestAI
  • #실행모델

개념

경로를 미리 정하는 실행 vs 찾아가는 실행

앞 레슨에서 절차를 의도로 바꾼 테스트 정의를 만들었다. 그런데 그 정의는 스스로 실행되지 않는다. "주문을 확정한다"를 실제 클릭으로 옮기는 무언가 가 필요하다.

그 역할을 하는 것이 CUA(Computer Use Agent, 컴퓨터 사용 에이전트) 다. 화면을 보고, 맥락을 해석하고, 어떤 컨트롤을 조작할지 판단하고, 예상치 못한 상황에서 복구를 시도하면서 목표를 향해 가는 AI 시스템이다.

기존 자동화 프레임워크와의 차이는 결정이 일어나는 시점 하나로 요약된다.

Selenium·PlaywrightCUA
경로 결정 시점작성 시점(코드에 새겨짐)실행 시점(그때 화면을 보고 결정)
화면이 바뀌면실패 → 사람이 코드 수정다시 보고 다른 경로 시도
예상 못한 팝업실패(명시적으로 처리해둔 것만 통과)닫고 계속 진행 가능
실행 결과 재현성높음(같은 경로)낮음(경로가 매번 다를 수 있음)
실행 비용낮음높음
판단의 폭코드에 쓴 것만넓음(대신 예측이 어려움)

Selenium이 지도를 미리 그려놓고 그대로 걷는 것 이라면, CUA는 목적지만 알려주고 길은 그때그때 찾게 하는 것 이다. 이 비유는 장점과 단점을 동시에 설명한다. 길이 막혀도 돌아갈 수 있지만, 어제와 오늘 다른 길로 갔을 수 있다.

셀프힐링과는 무엇이 다른가

레슨 3에서 셀프힐링 로케이터 를 배웠다. 셀렉터가 깨지면 AI가 비슷한 요소를 찾아 복구를 시도하는 기술이다. 얼핏 CUA와 비슷해 보이는데, 계층이 다르다.

셀프힐링:  [ 절차는 그대로 ]  →  깨진 한 단계만 AI가 대체
           click(#submit-btn) 실패 → 유사 요소 탐색 → click
 
CUA:       [ 절차 자체가 없음 ]  →  목표만 주고 매 단계를 AI가 결정
           "주문을 확정한다" → 화면 관찰 → 무엇을 눌러야 할지 판단 → 실행

즉 셀프힐링은 기존 절차의 구멍을 메우는 보수 공사 이고, CUA는 절차를 없애고 목표만 남기는 구조 변경 이다. 셀프힐링에는 여전히 "원래 무엇을 클릭하려 했는지"가 코드에 남아 있어서 복구의 기준이 되지만, CUA에는 그 기준이 테스트 정의의 의도 밖에 없다. 그래서 의도를 얼마나 잘 썼는지가 곧 실행 품질이 된다.

레슨 5의 Agentic Testing 과의 관계도 정리해두자. Agentic Testing은 관찰-계획-실행-검증 루프라는 사고 틀 이고, CUA는 그 루프를 실제 화면 위에서 돌리는 실행 주체 다. 개념과 구현체의 관계다.

의도 기반 테스트 정의는 어떻게 생겼나

CUA에게 넘길 산출물은 테스트 코드가 아니라 구조화된 테스트 정의 다. 이 형식을 표준화하려는 시도가 있고, 오픈소스 스키마(OpenTest.AI 형식 등)는 대체로 다음 필드들로 테스트를 쪼갠다.

필드담는 것
Title테스트의 이름
Goal이 테스트가 달성하려는 결과
Description맥락·배경 설명
Thinking이 단계를 왜 이렇게 하는지에 대한 추론
Action수행할 동작(의도 수준)
Target동작의 대상
Value입력할 값·파라미터
Expected Outcome무엇을 보면 성공인가

실제로 써보면 이런 모양이 된다.

title: 신규 고객이 첫 주문을 완료한다
goal: 회원가입한 신규 고객이 장바구니에 담은 상품을 결제까지 마칠 수 있다
description: >
  프로모션 기간에 신규 가입 쿠폰이 자동 적용되는 흐름을 포함한다.
  쿠폰은 회원가입 후 24시간 내에만 유효하다.
 
steps:
  - thinking: >
      신규 고객은 배송지가 없는 상태이므로 결제 단계에서 배송지 입력
      화면이 먼저 뜬다. 기존 고객 흐름과 여기서 갈라진다.
    action: 결제를 진행한다
    target: 장바구니 화면의 결제 진행 수단
    value: null
    expected_outcome: 배송지 입력 화면이 나타난다
 
  - thinking: >
      쿠폰이 자동 적용되는지가 이 테스트의 핵심이다. 사용자가 직접
      쿠폰을 선택하지 않아도 총액에 반영되어야 한다.
    action: 주문을 확정한다
    target: 결제 확인 화면
    value: null
    expected_outcome: >
      주문 완료 화면이 나타나고, 결제 금액은 상품 합계에서 신규 가입
      쿠폰 할인이 빠진 값이며, 정확히 계산된 금액과 일치한다.

Thinking 필드가 이 형식의 핵심이다

여덟 개 필드 중 가장 낯선 것이 thinking이다. 그리고 가장 중요하다.

전통적인 자동화는 행동을 기록 한다. 의도 기반 정의는 추론을 기록 한다. 이 차이가 실행 시점에 드러난다.

배송지 입력 화면이 뜨지 않고 바로 결제 화면이 떴다고 하자.

  • thinking이 없으면: CUA는 "어? 예상과 다르네" 하고 그냥 진행하거나 실패로 처리한다.
  • thinking이 있으면: "신규 고객이라 배송지가 없어야 하는데 배송지 화면이 안 떴다 → 이 계정이 신규가 아니거나, 배송지가 이미 있다 → 테스트 전제가 깨졌다"고 판단할 수 있다.

즉 thinking은 실패의 원인을 가르는 근거 를 실행 시점에 제공한다. 모듈 6에서 배운 좋은 버그 리포트의 조건 — "무엇을 기대했고 왜 그렇게 기대했는가" — 이 테스트 정의 안으로 들어온 것으로 봐도 된다.

QA 실무에서 이 필드가 갖는 또 다른 값은 인수인계 다. 3년 뒤에 이 테스트를 보는 사람은 코드가 아니라 이 문장을 읽는다.

검증이 넓어진다 — 그리고 흐려진다

CUA 기반 실행은 검증의 폭을 넓힌다. 기존 자동화가 하기 어려웠던 판정이 가능해지기 때문이다.

판정 유형기존 자동화CUA
텍스트 정확 일치쉬움가능
숫자 계산 검증쉬움가능(단, 정확 비교로 지시해야)
"이 화면이 시각적으로 깨져 보이는가"시각 회귀 도구 필요, 오탐 많음판정 가능
"이 흐름이 사용자에게 혼란스러운가"사실상 불가능판정 가능(주관적)
"성공한 것처럼 보이는가"불가능가능

마지막 두 줄이 새로 열리는 영역이다. 이전에는 사람이 직접 봐야만 알 수 있어서 자동화 대상이 아니었던 것들이다.

그런데 여기에 함정이 있다. 넓어진 만큼 흐려진다. "혼란스러운가"는 판정 기준이 사람마다 다르고, 같은 모델도 실행마다 다르게 답할 수 있다. 모듈 18b(레슨 5)에서 배운 원칙이 그대로 필요하다 — 판단이 개입하는 검증은 한 번의 결과로 확정하지 않고, 반복 실행과 통과율로 다룬다.

실무 규칙으로 정리하면 이렇다.

정확해야 하는 것은 정확히 지시하고, 판단이 필요한 것만 판단에 맡긴다. 금액·재고 수량·권한 여부는 expected_outcome에 정확한 비교로 쓴다. 레이아웃 붕괴·문구의 자연스러움은 판단에 맡기되, 실패했을 때 곧바로 빌드를 깨지 말고 사람 확인 큐로 보낸다.

이건 모듈 18b 레슨 8에서 만든 정량 게이트와 정성 게이트의 분리 와 정확히 같은 구조다.

언제 CUA를 쓰고 언제 쓰지 말아야 하는가

가장 중요한 실무 판단이다. 전부를 CUA로 옮기는 것도, 전부를 스크립트로 남기는 것도 답이 아니다.

상황권장이유
UI가 자주 바뀌는 화면의 회귀 테스트CUA유지보수 비용이 가장 큰 영역
탐색적 테스트의 자동 확장CUA경로를 미리 정할 수 없는 성격
접근성·시각적 이상 점검CUA기존에 자동화가 어려웠던 판정
금액·정산·세금 계산 검증스크립트정확성이 절대적, 판단 여지가 없어야 함
매 커밋 실행되는 스모크 테스트스크립트속도·비용·재현성이 지배적
규제·인증 증거로 제출할 검증스크립트실행 경로의 추적 가능성이 요구됨
성능 측정스크립트에이전트의 판단 시간이 측정값을 오염시킴
장애 재현·디버깅스크립트같은 경로를 반복해야 원인을 좁힐 수 있음

표의 오른쪽 열을 관통하는 기준은 하나다. 재현성과 정확성이 중요할수록 스크립트, 변화 적응력과 판단의 폭이 중요할수록 CUA.

모듈 11에서 배운 자동화 피라미드에 얹어 생각하면 이해가 쉽다. 피라미드 아래쪽(단위·API)은 결정적이어야 하고, 위로 갈수록 사람의 판단에 가까운 검증이 필요해진다. CUA는 피라미드 꼭대기를 넓히는 도구이지, 피라미드 전체를 대체하는 것이 아니다.

도구 지형은 계속 바뀐다

CUA 영역의 도구는 빠르게 바뀌는 중이다. 상용·오픈소스 도구가 계속 등장하고 사라진다. 그래서 특정 도구 이름을 외우는 것은 의미가 적다.

중요한 것은 실행 모델 자체가 바뀌고 있다 는 사실이다. 어떤 도구가 이기든, "경로를 코드에 새기는 방식"과 "목표를 주고 런타임에 판단하게 하는 방식"이 공존하는 구도는 유지될 가능성이 높다. 그렇다면 QA가 준비할 것은 도구 사용법이 아니라 둘을 가르는 판단 기준과, 판단에 맡긴 검증을 신뢰할 수 있게 만드는 방법 이다.

그래서 자동화 엔지니어는 사라지는가

이 질문을 정면으로 다루자. 이 흐름이 없애는 것과 남기는 것은 분명하다.

줄어드는 일

  • 셀렉터를 고치는 일
  • 대기 시간을 조정하는 일
  • UI 변경마다 페이지 객체를 갱신하는 일
  • 오탐(false failure)을 조사하는 일

늘어나는 일

  • 무엇이 중요한지 정의하는 일 — 어떤 시나리오가 사업에 치명적인가
  • "성공"을 판정 가능한 문장으로 만드는 일
  • 정확해야 할 것과 판단에 맡길 것을 가르는 일
  • AI의 판정을 검증하는 일 — 모듈 18c 전체가 이 능력을 다룬다
  • 비결정적 결과를 통계로 다루고 신뢰 구간을 말하는 일

앞의 목록은 도구가 대신할 수 있는 일 이고, 뒤의 목록은 제품과 도메인을 이해해야만 할 수 있는 일 이다. 개발 쪽에서 "코드만 쓰는 개발자에서 제품 맥락을 이해하는 개발자로"라는 말이 도는 것과 같은 이동이, 테스트 쪽에서는 이렇게 나타난다.

자동화 엔지니어의 정의가 "테스트를 실행하는 코드를 쓰는 사람" 에서 "무엇을 신뢰할 수 있다고 말할지 정의하고, 그 판단을 검증하는 사람" 으로 이동한다.

주의할 것은 이 이동이 모두에게 좋은 소식은 아니라는 점 이다. 스크립트 작성 숙련도만으로 경쟁하던 자리는 실제로 줄어든다. 반면 도메인 이해, 리스크 판단, 검증 설계 능력을 갖춘 사람의 자리는 넓어진다. 이 커리큘럼이 자동화 도구보다 테스트 설계(모듈 3)와 리스크(모듈 4), 개발 지식(모듈 9) 을 앞에 둔 이유가 여기에 있다.

레슨 14는 이 판단을 제품화된 두 실행 모드 — 수동 테스트 단계를 에이전트가 읽고 바로 실행하는 자율 실행 과, 요구사항만 받고 시나리오까지 만드는 자율 탐색 — 를 팀이 운영하는 절차로 이어간다. 결과 일치율을 재고, 명세에 없는 기대값을 사양 질문으로 돌리는 법이 거기서 나온다.

실무에서 왜 필요한가

당장 CUA를 도입하지 않더라도 이 레슨의 사고 틀은 바로 쓸 수 있다. 테스트를 쓸 때 thinking에 해당하는 내용을 주석이나 문서로 남기는 습관 이 그것이다. "왜 이 단계가 필요한지"가 남아 있는 테스트는 사람이 유지보수할 때도 훨씬 오래 산다.

판단 기준 표도 즉시 유용하다. 팀에서 "이건 AI에게 맡길까"라는 논의가 나올 때, 재현성·정확성·비용이라는 세 축으로 나눠 얘기하면 취향 논쟁이 설계 논의로 바뀐다.

그리고 이 레슨은 비용 구조를 미리 계산해두라는 경고 이기도 하다. CUA 기반 실행은 실행마다 판단이 들어가므로 CI에서 수천 개를 매 커밋 돌리는 용도로는 대개 맞지 않는다. 야간 회귀, 릴리즈 전 확인, 탐색적 확장처럼 빈도가 낮고 가치가 높은 실행 에 배치하는 것이 현실적인 출발점이다.

실습 과제

과제 1 — 스크립트를 의도 정의로 변환하기 (25분)

기존 UI 자동화 테스트를 하나 골라(없다면 앞 레슨 과제에서 다룬 것), 본문의 8개 필드 형식으로 다시 쓴다. 최소 4단계 이상이 되도록 고른다.

각 단계마다 thinking을 반드시 채운다. 채우기 어려운 단계가 나오면, 그 단계는 원래 왜 있었는지 모른다는 뜻이므로 표시해둔다.

해설 보기

변환하면서 가장 흔히 만나는 문제는 원래 코드에 있던 대기(wait)를 어떻게 옮길 것인가 다. wait.until(visibilityOf(...))는 구현 세부사항이지만, 그 뒤에는 "이 시점에 서버 처리가 끝나야 한다"는 의도가 있다. 그 의도를 expected_outcome으로 옮기면 된다 — "처리 완료 메시지가 나타난다".

두 번째로 흔한 문제는 정확 검증을 뭉뚱그리는 것 이다. assertEquals로 비교하던 금액을 "금액이 표시된다"로 옮기면 테스트가 약해진다. 본문의 규칙대로, 정확해야 하는 것은 expected_outcome에 정확한 비교로 남긴다.

과제 2 — CUA/스크립트 판단 기준표 만들기 (20분)

우리 팀의 테스트를 유형별로 8개 골라, 본문의 표를 참고해 각각 CUA·스크립트·보류 중 하나로 분류한다. 그리고 각 판단에 근거를 한 줄씩 적는다.

테스트 유형판단근거(재현성·정확성·비용·변경빈도 중 무엇이 지배적인가)

'보류'가 나온 항목에 대해서는 무엇을 알면 결정할 수 있는지 를 적는다.

과제 3 — 판단 검증을 설계하기 (20분)

CUA로 옮기기로 한 테스트 중 하나에 대해, 그 판정을 신뢰할 수 있게 만드는 장치를 설계한다.

  1. 이 테스트를 몇 번 반복 실행할 것인가, 통과율 기준은 몇 %인가
  2. 실패했을 때 자동으로 남겨야 할 증거는 무엇인가(스크린샷·실행 궤적· 판단 근거 텍스트)
  3. 실패가 곧바로 빌드를 깨야 하는가, 사람 확인 큐로 가야 하는가
  4. 같은 실패가 반복되면 무엇을 바꿀 것인가(정의 보강 / 스크립트로 회귀)
해설 보기

4번의 마지막 선택지 — 스크립트로 되돌리기 — 를 반드시 선택지에 넣는 것이 중요하다. 전환은 한 방향으로만 흐르는 과정이 아니다. 어떤 테스트는 의도 기반으로 옮겼다가 "이건 판단에 맡길 게 아니었다"는 결론이 나올 수 있고, 그때 되돌리는 것은 실패가 아니라 정상적인 설계 결정이다.

2번에서 '판단 근거 텍스트'를 빠뜨리기 쉽다. CUA가 왜 실패로 판정했는지 남기지 않으면, 사람은 스크린샷만 보고 "멀쩡해 보이는데 왜 실패했지"에서 막힌다. 모듈 14에서 배운 관측 가능성이 여기서는 에이전트의 판단 로그 형태로 필요하다.

과제 4 — 역할 변화 진단 (15분)

본문의 '줄어드는 일 / 늘어나는 일' 목록을 놓고, 최근 3개월간 내가 실제로 쓴 시간을 각 항목에 배분한다(합계 100%).

  • 줄어드는 일 쪽 비중이 높다면: 그 시간을 줄이기 위해 지금 당장 시도할 수 있는 것 하나를 적는다
  • 늘어나는 일 쪽에서 0%인 항목 이 있다면: 그 능력을 기르기 위한 다음 한 걸음을 적는다(이 커리큘럼의 특정 모듈이어도 좋다)

자가 체크리스트

  • CUA와 기존 자동화 프레임워크의 차이를 '결정이 일어나는 시점'으로 설명할 수 있다
  • 셀프힐링 로케이터와 CUA가 어느 계층에서 다른지 구분할 수 있다
  • Agentic Testing(개념)과 CUA(실행 주체)의 관계를 말할 수 있다
  • 의도 기반 테스트 정의의 주요 필드와 각각이 담는 내용을 설명할 수 있다
  • Thinking 필드가 실행 시점에 어떤 판단을 가능하게 하는지 예를 들어 설명할 수 있다
  • CUA로 넓어지는 검증 유형과, 그로 인해 흐려지는 부분을 함께 말할 수 있다
  • 정확해야 할 검증과 판단에 맡길 검증을 가르는 규칙을 설명할 수 있다
  • CUA를 쓸 상황과 스크립트를 유지할 상황을 재현성·정확성·비용 기준으로 판단할 수 있다
  • CUA가 자동화 피라미드의 어느 부분을 넓히는 도구인지 설명할 수 있다
  • 자동화 엔지니어의 일에서 줄어드는 것과 늘어나는 것을 각각 세 가지 이상 들 수 있다

흔한 실수

  • CUA를 셀프힐링의 상위 버전으로 이해한다. 셀프힐링은 절차를 유지한 채 구멍을 메우고, CUA는 절차를 없앤다. 계층이 다르다.
  • 모든 검증을 판단에 맡긴다. 금액·수량·권한처럼 정확성이 절대적인 항목은 정확한 비교로 지시해야 한다. 넓어진 검증은 추가지 대체가 아니다.
  • 비결정적 결과를 한 번의 실행으로 확정한다. 반복 실행과 통과율로 다뤄야 한다(모듈 18b 레슨 5).
  • CI 매 커밋에 CUA 실행을 건다. 비용과 소요 시간이 맞지 않는다. 빈도가 낮고 가치가 높은 실행 지점에 배치한다.
  • Thinking을 비워둔 채 정의를 만든다. 그 순간 정의는 다시 절차 목록이 되고, 실행 시점에 판단할 근거가 사라진다.
  • 판단 근거 로그를 남기지 않는다. 실패 원인을 사람이 재구성할 수 없어 디버깅 비용이 오히려 늘어난다.
  • 되돌리기를 실패로 여긴다. 의도 기반으로 옮겼다가 스크립트로 회귀하는 것은 정상적인 설계 결정이다.
  • 도구 이름을 기준으로 학습한다. 이 영역의 도구 지형은 빠르게 바뀐다. 판단 기준과 검증 설계가 남는 자산이다.

참고 자료

낯선 말 풀이

이 레슨에 나온 약어입니다. 본문에서도 처음 나올 때 점선으로 표시해 두었습니다 (제목과 링크 글자는 그대로 둡니다).

AI — 인공지능
사람이 규칙을 일일이 적지 않아도 데이터에서 규칙을 찾아 판단하는 소프트웨어.
QA — 품질보증
만든 것이 쓸 만한지 확인하고, 애초에 덜 망가지게 만드는 방법을 정하는 일. "테스트"는 그 일의 일부다.
UI — 사용자 인터페이스
사람이 직접 보고 누르는 부분 — 화면, 버튼, 입력창.
API — 응용 프로그램 인터페이스
프로그램끼리 주고받는 창구. 사람이 화면 버튼을 누르는 대신, 프로그램이 정해진 주소로 요청을 보내 답을 받는다.
CI — 지속적 통합
코드를 올릴 때마다 자동으로 합쳐서 빌드하고 시험까지 돌리는 방식.

용어집 전체 보기