23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
Firebase가 최근 UI 테스트 자동화를 위한 신규 기능 App Testing Agent를 공개했습니다.
에이닷 클라이언트 개발팀에서도 UI 테스트를 활발히 진행하고 있던 터라 자연스럽게 눈길이 끌렸습니다.
궁금증을 못 참고 바로 몇 가지 시나리오를 실행해 보며 기능을 체험했고 동시에 백그라운드에서 무슨 일이 벌어지는지도 슬쩍 들여다봤습니다.
이 글에서는 그 과정에서 얻은 실제 테스트 결과와 내부 로직을 추측해 본 이야기를 가볍게 풀어 보려 합니다.
코드 대신 글을 쓰고 있는 프로그래머 (Image generated with Leonardo.Ai)
Firebase App Testing Agent는 Gemini in Firebase가 구동하는 AI 기반 UI 테스트 자동화 에이전트입니다.
“로그인 플로우를 검증해 줘”처럼 자연어로 목표만 입력하면 에이전트가 앱 화면을 해석하고 버튼, 제스처 등 사용자 행동을 시뮬레이션해 테스트 시나리오를 생성하고 실행합니다.
완료 후에는 각 단계의 스크린샷과 로그가 포함된 리포트를 제공해 문제 지점을 한눈에 파악할 수 있도록 돕습니다.
테스트 실행 방식 | |
|---|---|
AI 가이드 테스트 | 정의된 테스트 케이스를 기반으로 앱의 주요 사용자 흐름이 정상적으로 작동하는지를 자동으로 테스트합니다. |
무작위 크롤링 테스트 | 앱을 무작위로 탐색하여 예기치 않은 문제를 발견합니다. |
두 가지의 테스트 실행 방식을 제공하며 이 글에서는 'AI 가이드 테스트'에 초점을 맞춰 보려고 합니다.
에이전트는 자연어로 작성한 테스트 목표를 해석해 앱의 UI 트리를 탐색하고, 실제 사용자 동작을 모사해 시나리오를 자동 실행합니다.
테스트는 단계별 시퀀스로 구성되며, 각 단계마다 목표(Goal), 힌트(Hint), 성공 판정 기준(Success Criteria)을 가이드할 수 있습니다.
이 글을 작성하는 2025년 4월 25일 현재, 테스트 실행에는 Gemini-2.0-Flash-001 모델이 사용되고 있습니다.
현재 에이닷 클라이언트 팀에서 진행하고 있는 것과 동일한 수준의 테스트 시나리오를 작성하고 실행해보면서 App Testing Agent의 가능성과 한계에 대해서 알아보겠습니다.
Firebase App Testing Agent 사용법을 알아보기 위해,
로그인 후 대화방에 진입했을 때 임의의 새 메시지가 정상적으로 노출되는지를 확인하는 간단한 테스트 케이스를 작성하고,
이를 실행한 뒤 결과를 확인해보겠습니다.
Firebase Console의 App Distribution 메뉴에서 ‘테스트 사례’ 탭으로 이동하면, 테스트를 생성하거나 실행할 수 있는 화면에 진입하게 됩니다.
화면에 진입한 뒤 '새 테스트 사례' 버튼을 클릭하면 새로운 테스트 항목을 직접 등록할 수 있습니다.
테스트 제목
테스트 제목을 지정할 수 있으며 목표가 하나인 경우 비워두면 목표가 테스트 제목으로 사용됩니다.
목표
에이전트로 수행할 작업은 가급적 한 문장 이내로 간단히 작성하는 것이 좋습니다. 복잡한 동작일 경우 단계를 나누어 작성하면 오작동 가능성을 줄일 수 있습니다.
힌트 (선택사항)
Gemini가 앱을 이해하고 탐색하는 데 도움이 되는 추가 정보를 제공합니다.
예를 들면, '온보딩 화면을 지나 이동합니다. 팝업을 모두 닫습니다. 로그인하지 않습니다.'와 같은 정보입니다.
성공 기준 (선택사항)
테스트 목표를 달성하는 데 필요한 예상 동작 또는 앱 상태를 설명합니다.
예를 들면, '기본 앱 홈 페이지가 화면에 표시되고 모든 이미지가 로드되었으며 오류가 표시되지 않습니다.'와 같은 내용입니다.
인트로 화면에서 '바로 시작하기' 버튼을 클릭해서 로그인 선택 화면으로 진입할 수 있도록 목표를 설정했습니다.
T ID로 로그인 화면으로 진입하도록 목표를 설정했습니다. Step2에서는 목표를 통해 버튼을 누르도록 지시하지 않고 의도한 행동을 할 수 있도록 힌트를 제공했습니다.
아이디랑 비밀번호 입력 후, 로그인 버튼을 누르도록 했습니다.
버튼의 일부분만 보이는 경우 클릭을 하지 않는 경우가 있어서 버튼 전체가 보일 때까지 스크롤을 하도록 힌트를 제공했습니다.
대화방 진입 후 임의의 메시지가 출력되는지 확인하도록 목표를 설정 했습니다.
테스트 사례 화면에서 '테스트 실행' 버튼을 누르면, 테스트 실행에 필요한 설정을 진행할 수 있는 화면으로 전환됩니다.
테스트 실행 시 제공되는 두 가지 유형인 'AI 가이드 테스트'와 '무작위 크롤링 테스트' 중 하나를 선택해 테스트를 수행할 수 있습니다.
테스트 실행 시 사용할 기기를 선택할 수 있으며, 약 80개의 실제 기기와 에뮬레이터가 준비되어 있어 다양한 환경에서 테스트가 가능합니다.
로그인이 필요한 앱이라면 테스트 실행 시 사용할 아이디와 비밀번호를 사전에 입력해둘 수 있습니다.
(App Testing Agent는 로그인이 필요한 경우에 입력 해놓은 아이디와 비밀번호를 사용합니다.)
테스트를 실행한 뒤에는 App Distribution의 해당 릴리스 버전에서 ‘앱 테스트 에이전트’ 탭을 통해 테스트 진행 상황과 결과를 실시간으로 확인할 수 있습니다.
App Testing Agent는 목표대로 인트로 화면에서 ‘바로 시작하기’ 버튼을 클릭한 후 로딩 완료를 위해 10초 동안 대기했습니다.
App Testing Agent는 로그인 선택 화면에서 ‘T ID로 로그인하기’ 버튼을 클릭해 T ID 로그인 화면으로 이동했으며, 해당 화면 진입 여부를 기준으로 테스트 결과를 Pass로 판단했습니다.
App Testing Agent는 테스트 시작 시 설정한 아이디와 비밀번호를 입력해 로그인을 진행했습니다.
이후, 에이닷 타이틀이 표시된 메인 화면에 정상적으로 진입한 것을 확인하고 이를 성공 기준으로 판단하여 테스트 결과를 Pass로 처리했습니다.
다소 인상적이었던 점은 사전에 존재 여부를 명시하지 않았던 권한 팝업이 표시되었음에도 불구하고
App Testing Agent가 이를 자동으로 인식하고 확인 버튼을 눌러 정상적으로 목표를 달성했다는 점입니다. 🤩
일반적인 UI 테스트에서는 예상되지 않은 팝업이나 UI 변화로 인해 다음 단계로 진행하지 못하고 테스트가 실패하는 경우가 많습니다.
(다만, 이러한 실패는 테스트의 엄격한 조건 검증이라는 측면에서 장점이 될 수도 있습니다.)
임의의 메시지가 출력될 때까지 10초간 대기하도록 가이드했기 때문에 App Testing Agent는 해당 시간 동안 대기합니다.
테스트 중 예상치 못한 돌발 상황으로 위치 서비스 관련 시스템 팝업이 노출되었지만 App Testing Agent는 ‘아니오’ 버튼을 스스로 인식하고 클릭하여 팝업을 정상적으로 닫았습니다.
테스트 목표였던 임의의 메시지 출력을 감지하고 그 텍스트 내용을 정확히 확인한 후 Pass로 처리하는 과정을 보면, App Testing Agent의 UI 분석 능력이 상당히 정교하다는 점을 알 수 있습니다.
‘에이전트 뷰 표시’를 켜면 테스트 중 에이전트가 접근성 정보를 통해 감지한 UI 요소들의 위치와 구조를 시각적으로 확인할 수 있어 디버깅에 유용합니다.
App Testing Agent는 테스트 자동화를 빠르게 시작하고 생산성을 높이기에 적합한 도구입니다.
코드 없이 자연어로 테스트를 구성할 수 있어 QA 초기나 반복 테스트에 효율적이며 비개발자도 쉽게 활용할 수 있다는 점이 강점입니다.
AI 기반 UX 탐색 기능은 사람이 놓치기 쉬운 시나리오까지 커버하며 UI 변경에도 유연하게 대응해 코드 기반 테스트의 단점을 보완합니다.
다만, 복잡한 로직이나 외부 시스템 상태를 검증하는 정밀 테스트에는 한계가 있으며 내부 동작을 파악하기 어려워 디버깅이 쉽지 않고 블랙박스처럼 느껴질 수 있습니다.
또한 자연어 표현이 모호하면 오작동 가능성이 있고 정식 출시 후에는 테스트 횟수에 따라 비용 부담이 발생할 수 있습니다.
App Testing Agent는 테스트 자동화를 빠르게 체험하고 싶거나 코드 없이 다양한 시나리오를 손쉽게 실행하고 싶은 팀에게 적합한 선택지입니다.
단, 모든 테스트를 이 도구 하나에 의존하기보다는 목적에 맞게 전략적으로 병행하는 접근이 필요합니다.
장점 | |
|---|---|
빠른 시작 & 생산성 향상 | 테스트 코드 없이도 빠르게 Test Case 작성 가능 |
비개발자 접근성 | 테스터도 자연어로 테스트 케이스 작성 가능 |
자동 UX 탐색 | 사람이 놓치기 쉬운 흐름까지 자동 탐색 (시스템 팝업과 같은 경우) |
UI 변화에 강한 유연성 | 버튼의 위치나 UI 요소의 ID 변화에도 비교적 안정적 |
단점 | |
|---|---|
정밀 제어 어려움 | 복잡한 로직, 외부 API, DB 상태 확인 같은 테스트에는 한계가 있음 |
디버깅 어려움 | 내부 동작 분석 어려움, 결과 해석 어려움 |
유지보수 불확실성 | 자연어 표현이 모호하면 오동작하거나 일관성 없는 결과가 나올 수 있음 |
비용 | 무료 계정은 월 100회 제한, 프리뷰 종료 후 요금 발생 |
결론 이후에 동작 방식을 별도로 서술한 이유는 비공개 영역의 동작을 설명하기 위해 일부 추정을 전제로 할 수밖에 없었기 때문입니다.
이러한 내용을 보충 설명의 성격으로 분리해 서술하는 것이 글의 흐름과 신뢰도를 유지하는 데 적절하다고 판단했습니다.
테스트 결과 화면에서 '아티팩트 보기' 버튼을 클릭하면, 테스트 실행 결과와 관련된 산출물을 확인할 수 있는 화면으로 이동합니다.
동작 방식 분석에 아티팩트의 내용을 참고했습니다.
이 화면에서는 테스트 실행 중 생성된 스크린샷, 로그, 이벤트 기록 등 다양한 데이터를 확인할 수 있습니다.
04-17 23:14:22.499 16330 16330 I AndroidJUnitRunner: newApplication android.app.Application
04-17 23:14:22.500 16330 16330 I AndroidJUnitRunner: onCreate Bundle[mParcelledData.dataSize=1700]
04-17 23:14:22.501 16330 16330 D AndroidJUnitRunner: Use the raw file system for managing file I/O.
04-17 23:14:22.507 16330 16348 D AndroidJUnitRunner: onStart is called.
04-17 23:14:22.538 16330 16348 I TestRunner: run started: 1 tests
04-17 23:14:22.538 16330 16348 I TestRunner: started: testEntry(androidx.test.tools.crawler.CrawlPlatform)
04-17 23:14:22.552 16330 16348 I Robo : Platform starting proxy service.∏
04-17 23:14:23.566 16330 16348 I Robo : Started as foreground service: androidx.test.tools.crawler/androidx.test.tools.crawler.proxy.ProxyService
04-17 23:14:23.602 16330 16396 I Robo : Current launcher package name: com.sec.android.app.launcher
04-17 23:14:23.704 16397 16397 I Robo : Creating a message overlay
04-17 23:14:23.704 16397 16397 I Robo : Creating a touchpoint overlay
04-17 23:14:23.704 16397 16397 I Robo : OverlayService has been bound.
04-17 23:14:23.707 16330 16330 I Robo : Connection to OverlayService established.
04-17 23:14:23.707 16398 16433 I Robo : Running ProxyService.
04-17 23:14:23.708 16398 16433 I Robo : Server bound to port 36477.
04-17 23:14:23.708 16398 16433 I Robo : Waiting for host to connect for 30 seconds.
04-17 23:14:24.332 16398 16433 I Robo : Host connected.
04-17 23:14:24.992 16330 16396 I Robo : Received RoboConfig from the controller: # androidx.test.tools.crawler.obfuscated.ay.aa@cd0715f7
04-17 23:14:24.992 16330 16396 I Robo : Received start heartbeat request.
04-17 23:14:24.992 16330 16396 I Robo : Starting platform heartbeat'er.
04-17 23:14:25.194 16330 16396 I Robo : Received request from the controller: # androidx.test.tools.crawler.proto.OverlayServiceRequest@1a1bf6a
04-17 23:14:25.218 16330 16396 I Robo : Received request from the controller: # androidx.test.tools.crawler.proto.PerformAction@3af58fe7
04-17 23:14:25.218 16330 16396 I Robo : action {
04-17 23:14:25.218 16330 16396 I Robo : launch_action {
04-17 23:14:25.218 16330 16396 I Robo : app_package_name: "com.skt.nugu.apollo.stg"
04-17 23:14:25.218 16330 16396 I Robo : starting_intent {
04-17 23:14:25.218 16330 16396 I Robo : type: 1
04-17 23:14:25.218 16330 16396 I Robo : }
04-17 23:14:25.218 16330 16396 I Robo : }
04-17 23:14:25.218 16330 16396 I Robo : }
04-17 23:14:25.241 16330 16396 I Robo : UiAutomatorOnly Mode.
04-17 23:14:25.775 16330 16396 I Robo : UiAutomator: launching app로그 파일의 일부분 - 테스트 시작 단계
아티팩트에 저장된 로그 파일을 분석하여 App Testing Agent 내부에서 일어나는 일들을 정리해보았습니다.
단계 | 시간 | 로그 요약 | 설명 |
|---|---|---|---|
1 | 23:14:22 | Platform starting proxy service | Robo 테스트 프록시 서비스 초기화 |
2 | 23:14:23 | Started as foreground service | 테스트 런처에서 서비스가 포그라운드로 시작됨 |
3 | 23:14:23 | Creating overlay | 테스트 진행 상황을 시각화하기 위한 오버레이(UI 표시) 생성 |
4 | 23:14:24 | Host connected | 컨트롤러와 연결됨 (Firebase Test Lab과 통신 개시) |
5 | 23:14:24 | Received RoboConfig | 테스트 실행 구성을 수신함 |
6 | 23:14:25 | PerformAction > launch_action > app_package_name: "com.skt.nugu.apollo.stg" | 테스트 대상 앱을 실행하는 명령 수신 |
7 | 23:14:25 | UiAutomatorOnly Mode | UI Automator만을 사용하는 테스트 모드임을 명시 |
8 | 23:14:27 | Launching using UiAutomator succeeded | UI Automator를 통해 앱 실행 완료 (약 2초 소요) |
9 | 23:14:27 | Executing ADB shell command: dumpsys window displays | 현재 앱의 액티비티 및 디스플레이 상태 분석 시작 |
10 | 23:14:27 | Found activity: com.skt.nugu.visual.home.HomeActivity | 앱이 실행된 후 도달한 첫 화면의 액티비티를 확인 |
11 | 23:14:27 | Received scrape screen request | 화면의 UI 요소를 긁어오기 시작 (스크래핑) |
테스트 실행 설정 정보는 클라이언트의 크롤러 앱으로 전달되며 이 앱이 테스트 서비스를 구동한 후 테스트 대상 앱을 실행합니다.
이후에는 테스트 루프를 실행하는 '테스트 단계'로 들어가게 됩니다.
04-17 23:14:28.098 16330 16396 I Robo : Found activity: com.skt.nugu.visual.home.HomeActivity
04-17 23:14:28.186 16330 16396 I Robo : UiAutomator: Milliseconds to extract current screen state: 376
04-17 23:14:28.241 16330 16396 I Robo : Received take screenshot request: # androidx.test.tools.crawler.proto.TakeScreenshot@7bca4
04-17 23:14:28.241 16330 16396 I Robo : accessibility_hierarchy_mode: 1
04-17 23:14:28.241 16330 16396 I Robo : Taking screenshot.
04-17 23:14:28.465 16330 16396 I Robo : Obtained screenshot.
04-17 23:14:28.465 16330 16396 I Robo : Grabbing accessibility hierarchy.
04-17 23:14:28.484 16330 16396 I Robo : Obtained accessibility hierarchy.
04-17 23:14:28.863 16330 16396 I Robo : Received request from the controller: # androidx.test.tools.crawler.proto.OverlayServiceRequest@868427ba
04-17 23:14:28.863 16330 16396 I Robo : show_message {
04-17 23:14:28.863 16330 16396 I Robo : contents: "4 actions to perform"
04-17 23:14:28.863 16330 16396 I Robo : duration {
04-17 23:14:28.863 16330 16396 I Robo : }
04-17 23:14:28.863 16330 16396 I Robo : title: "Robo Script 2001"
04-17 23:14:28.863 16330 16396 I Robo : }
04-17 23:14:33.623 16330 16396 I Robo : Received request from the controller: # androidx.test.tools.crawler.proto.OverlayServiceRequest@1a1bf6a
04-17 23:14:33.625 16330 16396 I Robo : Received request from the controller: # androidx.test.tools.crawler.proto.PerformAction@e2b2a2f6
04-17 23:14:33.625 16330 16396 I Robo : action {
04-17 23:14:33.625 16330 16396 I Robo : wait_action {
04-17 23:14:33.625 16330 16396 I Robo : wait_interval {
04-17 23:14:33.625 16330 16396 I Robo : }
04-17 23:14:33.625 16330 16396 I Robo : }
04-17 23:14:33.625 16330 16396 I Robo : }
04-17 23:14:33.625 16330 16396 I Robo : Waiting 10000 milliseconds.
04-17 23:14:43.626 16330 16396 I Robo : Looking for activity로그 파일의 일부분 - 테스트 단계
테스트 단계에서는 하나의 액션을 수행하기 전, 준비 → 실행 과정을 반복적으로 수행합니다. 이 반복 루프는 다음과 같은 단계로 구성됩니다:
UI 계층 및 레이아웃 분석
스크린샷 캡처
접근성 정보 수집
스크린샷, 접근성 정보를 바탕으로 정의 된 액션 수신 (화면 정보를 분석하고 Clawer가 수행해야할 액션을 내려주는 것으로 보인다)
수신 한 액션을 순차적으로 실행
위 과정을 통해 App Testing Agent는 화면 상태를 분석하고 주어진 목표를 달성하기 위한 최적의 행동을 반복적으로 시도합니다.
04-17 23:14:48.092 16330 16396 I Robo : Received request from the controller: # androidx.test.tools.crawler.proto.PerformAction@fb40691e
04-17 23:14:48.092 16330 16396 I Robo : action {
04-17 23:14:48.092 16330 16396 I Robo : adb_command_action {
04-17 23:14:48.092 16330 16396 I Robo : command: "input tap 540 2091"
04-17 23:14:48.092 16330 16396 I Robo : }
04-17 23:14:48.092 16330 16396 I Robo : }
04-17 23:14:48.092 16330 16396 I Robo : Executing ADB shell command: input tap 540 2091로그 파일의 일부분 - App Testing Agent (Controller)에서 보내준 클릭 액션을 adb command로 실행한다
테스트 단계 동작을 정리하면 다음과 같습니다.
[스크린 스크랩 요청]
↓
[UI 요소 정보 수집]
↓
[스크린샷 & 계층 분석]
↓
[행동 결정 → 클릭/입력 실행]
↓
[새 UI 진입 여부 판단]
↓
[다시 스크랩 → 반복]App Testing Agent는 목표를 완료 할 때 까지 위 루프를 반복하게 됩니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.