UI 자동화 테스트의 기초 이해
사용자 인터페이스(이하 UI)는 사용자와 시스템 간 상호작용을 담당하는 핵심 요소입니다. 웹 애플리케이션과 모바일 앱에서의 자동화 테스트는 모두 이 UI 계층을 대상으로 수행됩니다. 이러한 방식은 수동 작업을 줄이고 반복적인 검증 절차를 효율적으로 처리할 수 있도록 도와줍니다.
왜 UI 자동화가 필요한가?
테스트 자동화는 단위 테스트, API 테스트, 그리고 UI 테스트로 나뉘며, 각 계층은 서로 보완적인 역할을 합니다. 특히 초기 단계에서 단위 또는 인터페이스 테스트 없이 바로 UI 레벨의 자동화에만 의존하는 것은 비효율적이며 품질 보장을 어렵게 만듭니다. 또한, 완전한 UI 자동화는 유지보수 비용이 매우 높아지며, 요소 변화가 잦은 프로젝트에서는 오히려 부담이 됩니다.
그럼에도 불구하고, 최종 사용자가 직접 경험하는 부분인 UI는 꾸준한 검증이 필수입니다. 따라서 자동화를 통해 반복적인 작업을 일부 자동화하고, 인력 낭비와 유지보수 부담 사이의 균형을 찾는 것이 중요합니다.
UI 자동화에 적합한 프로젝트 조건
- 장기 개발 프로젝트: 1년 이상 지속되는 제품
- 요구사항 안정성: 변경 빈도가 낮은 프로젝트
- 재검증 필요성: 반복적인 회귀 테스트가 필요한 경우
자동화 테스트 적용 시점
기능 테스트가 완료된 이후에 시작하는 것이 이상적입니다. 이는 정확한 기준을 확보하고, 자동화 스크립트의 신뢰성을 높이는 데 도움이 됩니다.
테스트 유형 분류 및 위치
UI 자동화는 일반적으로 블랙박스 테스트(기능 테스트)에 해당하며, 내부 구현을 고려하지 않고 외부 동작을 검증합니다.
주요 웹 자동화 프레임워크 비교
- QTP (Unified Functional Testing): 상용 툴, 웹 및 데스크톱 자동화 지원, 비용 발생
- Selenium: 오픈소스, 무료, 주로 웹 기능 테스트에 사용되며 가장 널리 활용됨
- Robot Framework: Python 기반, 키워드 기반, 확장성이 뛰어난 자동화 프레임워크
Selenium의 주요 특징
- 오픈 소스: 코드 접근 가능, 커스터마이징 가능
- 다중 플랫폼 지원: Windows, Linux, macOS
- 브라우저 호환성: Chrome, Firefox, Edge, Safari, Opera 등
- 다양한 언어 연동: Python, Java, JavaScript, Ruby, PHP 등
- 안정성 및 성숙도: Google, Baidu, Tencent 등 대규모 기업에서 활용
- 강력한 기능 확장성: 커뮤니티 기반으로 다양한 기능 추가 가능
환경 설정: Selenium + ChromeDriver
- Python 환경 설치
- 설치 명령어:
pip install selenium - ChromeDriver 다운로드: 타오바오 미러에서 브라우저 버전과 정확히 일치하는 드라이버 선택
- Chrome 브라우저 설치
설치 확인 예제
from selenium import webdriver
import time
# Chrome 드라이버 초기화 (Windows)
driver = webdriver.Chrome('./chromedriver.exe')
# 웹 페이지 열기
driver.get('https://www.baidu.com')
# 3초 대기 후 종료
time.sleep(3)
driver.quit()
실행 시 브라우저가 자동으로 열리고 '백도' 홈페이지가 표시되면 설정 성공입니다.
요소 탐색 방법 (8가지 기본 전략)
Selenium은 웹 문서 내 요소를 정확히 찾아내는 데 다양한 방법을 제공합니다.
- id: DOM 요소의
id속성 기반 - name:
name속성 기반 - class name:
class속성 값 중 하나로 매칭 - tag name: HTML 태그 이름 기반 (예:
input,div) - link text: 하이퍼링크의 전체 텍스트로 찾기
- partial link text: 하이퍼링크의 일부 텍스트로 찾기
- xPath: XML 경로 기반 정밀 탐색
- CSS 선택자: CSS 구문을 이용한 요소 식별
실습 예제: 여러 타입의 요소 선택
from selenium import webdriver
import time
browser = webdriver.Chrome('./chromedriver.exe')
browser.get('file:///F:/jiango/zidonghua/pagetest/가입.html')
time.sleep(3)
# id로 입력
browser.find_element_by_id('userA').send_keys('2597349742')
# class로 입력
browser.find_element_by_class_name('telA').send_keys('17535827976')
# name으로 입력
browser.find_element_by_name('emailA').send_keys('123@qq.com')
# tag name으로 입력
browser.find_element_by_tag_name('input').send_keys('hello')
# 링크 텍스트 클릭
browser.find_element_by_link_text("새로운 사이트").click()
# 부분 텍스트 클릭
browser.find_element_by_partial_link_text('사이트').click()
time.sleep(3)
browser.quit()
핵심 탐색 기법 설명
- id:
find_element_by_id('value')— 유일성 보장됨 - class name:
find_element_by_class_name('value')— 복수 클래스 중 하나만 포함해도 매칭 - name:
find_element_by_name('value')— 폼 요소에 자주 사용 - tag name:
find_element_by_tag_name('input')— 모든input태그에 적용 - link text / partial link text:
find_element_by_link_text()— 링크 텍스트 정확 매칭, 부분 매칭은partial_link_text