728x90
셀레니움을 이용한 테스트 자동화 구축 가이드
소프트웨어 개발에서 테스트 자동화는 품질을 향상시키고 개발 효율성을 높이는 데 필수적입니다. 특히 웹 애플리케이션의 경우 셀레니움(Selenium)은 가장 널리 사용되는 자동화 도구 중 하나입니다.
셀레니움을 이용한 테스트 자동화는 반복적인 테스트 작업을 효율화하고, 소프트웨어 품질을 높이는 데 큰 도움이 됩니다
+--------------------------------------+
| Selenium Automation |
+--------------------------------------+
| |
| 1. WebDriver Download & Setup |
| - ChromeDriver, GeckoDriver etc. |
| |
| 2. Selenium Installation |
| - pip install selenium |
| |
| 3. Test Code Writing |
| - Python, Java, etc. |
| - Interaction with Web Elements |
| |
| 4. Test Execution |
| - Run Test Scripts |
| |
| 5. Result Logging |
| - Verify Output |
| |
+--------------------------------------+
1. 셀레니움 다운로드 및 설치
1.1 Python 설치 확인
셀레니움을 사용하기 위해서는 Python이 설치되어 있어야 합니다.
- Python 설치 확인: 터미널 또는 명령 프롬프트에서 다음 명령어를 입력하여 Python이 설치되어 있는지 확인합니다.
python --version
- 설치되어 있지 않다면: Python 공식 웹사이트에서 Python을 다운로드하여 설치합니다.
1.2 셀레니움 설치
pip를 사용하여 셀레니움 패키지를 설치합니다.
pip install selenium
1.3 웹드라이버 다운로드 및 설정
셀레니움이 브라우저를 제어하기 위해서는 해당 브라우저의 웹드라이버가 필요합니다.
크롬 웹드라이버(ChromeDriver)
- Chrome 버전 확인: 크롬 브라우저에서 설정 > Chrome 정보로 이동하여 버전을 확인합니다.
- ChromeDriver 다운로드: ChromeDriver 다운로드 페이지에서 크롬 버전에 맞는 드라이버를 다운로드합니다.
- Download: https://chromedriver.chromium.org/downloads - 드라이버 설치: 다운로드한 chromedriver 파일을 적절한 경로에 저장합니다. 일반적으로 프로젝트 루트나 시스템 PATH에 포함된 경로를 사용합니다.
1.3.2 다른 브라우저 웹드라이버
- 파이어폭스(Firefox): GeckoDriver 다운로드 :https://github.com/mozilla/geckodriver/releases
- 엣지(Edge): EdgeDriver 다운로드 : https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
- 사파리(Safari): Safari는 내장된 SafariDriver를 사용할 수 있습니다.
2. 셀레니움을 이용한 테스트 코드 작성
2.1 기본 테스트 코드 작성
셀레니움을 이용하여 간단한 웹 페이지를 열고 제목을 출력하는 예제입니다.
from selenium import webdriver
# 웹드라이버 경로 설정
driver = webdriver.Chrome(executable_path='path/to/chromedriver')
# 웹 페이지 열기
driver.get('https://www.example.com')
# 현재 페이지 제목 출력
print('페이지 제목:', driver.title)
# 브라우저 닫기
driver.quit()
2.2 웹페이지 Element 요소 찾기 및 상호작용
웹 페이지의Element 요소를 찾아서 상호작용하는 방법을 알아보겠습니다.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome(executable_path='path/to/chromedriver')
driver.get('https://www.example.com')
# 텍스트 필드에 값 입력하기
search_box = driver.find_element(By.NAME, 'q')
search_box.send_keys('Selenium')
# 엔터 키 입력
search_box.send_keys(Keys.RETURN)
# 결과 출력
results = driver.find_elements(By.CSS_SELECTOR, 'h3')
for result in results:
print(result.text)
driver.quit()
2.3 테스트 코드 구조화
unittest 모듈을 사용하여 테스트 코드를 구조화할 수 있습니다.
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
class MyTestCase(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome(executable_path='path/to/chromedriver')
def test_example(self):
driver = self.driver
driver.get('https://www.example.com')
self.assertIn('Example Domain', driver.title)
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
3. 테스트 시나리오 작성 및 테스트
3.1 테스트 시나리오 작성
시나리오 1: 회원 로그인 기능 테스트
- 목적: 올바른 자격 증명을 사용하여 로그인 기능이 정상적으로 동작하는지 확인합니다.
- 사전 조건: 테스트용 계정이 존재해야 합니다.
- 테스트 단계:
- 회원 로그인 페이지로 이동합니다.
- 사용자 이름과 비밀번호를 입력합니다.
- 로그인 버튼을 클릭합니다.
- 로그인 성공 메시지가 표시되는지 확인합니다.
3.2 테스트 코드 작성
- 회원 로그인 관련 셀레니움 테스트 코드 작성 예시
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
class LoginTest(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome(executable_path='path/to/chromedriver')
def test_login(self):
driver = self.driver
driver.get('https://www.example.com/login')
# 사용자 이름 입력
username = driver.find_element(By.ID, 'username')
username.send_keys('test_user')
# 비밀번호 입력
password = driver.find_element(By.ID, 'password')
password.send_keys('test_password')
# 로그인 버튼 클릭
login_button = driver.find_element(By.ID, 'loginButton')
login_button.click()
# 로그인 성공 확인
success_message = driver.find_element(By.ID, 'successMessage')
self.assertIn('로그인 성공', success_message.text)
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()
회원가입 관련 셀레니움 테스트 예시
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestSignUp(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
def test_sign_up(self):
driver = self.driver
driver.get('https://www.example.com/signup')
# 이름 입력
name_field = driver.find_element(By.ID, 'name')
name_field.send_keys('홍길동')
# 이메일 입력
email_field = driver.find_element(By.ID, 'email')
email_field.send_keys('testuser@example.com')
# 비밀번호 입력
password_field = driver.find_element(By.ID, 'password')
password_field.send_keys('Password123!')
# 약관 동의
terms_checkbox = driver.find_element(By.ID, 'agree')
terms_checkbox.click()
# 회원 가입 버튼 클릭
sign_up_button = driver.find_element(By.ID, 'signup')
sign_up_button.click()
# 회원 가입 성공 메시지 확인
success_message = driver.find_element(By.CLASS_NAME, 'success')
self.assertIn('회원 가입이 완료되었습니다', success_message.text)
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()
3.3 테스트 실행 및 확인
- 테스트 실행: 터미널에서 테스트 스크립트를 실행합니다.
python login_test.py
- 테스트 결과 확인: 테스트가 통과하면 성공 메시지가 출력됩니다.
4. 테스트 결과서 작성
4.1 테스트 결과서 작성 가이드
- 테스트 케이스 ID: 고유한 식별자를 부여합니다.
- 테스트 제목: 테스트할 기능의 요약을 작성합니다.
- 테스트 목적: 테스트의 목표를 명확히 합니다.
- 사전 조건: 테스트 전에 필요한 상태나 데이터 등을 명시합니다.
- 테스트 단계: 테스트를 수행하는 절차를 상세히 기술합니다.
- 예상 결과: 각 단계에서 예상되는 결과를 작성합니다.
- 실제 결과: 테스트 수행 후 실제로 나타난 결과를 기록합니다.
- 테스트 결과: 테스트의 성공 여부를 판단합니다.
- 비고: 추가적인 참고사항이나 특이점을 기록합니다.
4.2.1 테스트 결과서 예시 - 회원 로그인
테스트 케이스 ID테스트 제목테스트 목적
TC001 | 로그인 기능 테스트 | 올바른 자격 증명으로 로그인 시도 시 성공 확인 |
사전 조건테스트 단계예상 결과실제 결과테스트 결과비고
테스트 계정 생성 | 1. 로그인 페이지로 이동<br>2. 사용자명을 'test_user' 입력<br>3. 비밀번호를 'test_password' 입력<br>4. 로그인 버튼 클릭 | 로그인 성공 메시지가 표시되어야 함 | 로그인 성공 메시지가 '로그인 성공'으로 표시됨 | 성공 | 정상 동작 |
4.2.2 테스트 결과서 예시 - 회원 가입
항목내용
테스트 케이스 ID | TC-001 |
테스트 목적 | 회원 가입 기능이 정상적으로 작동하는지 확인 |
테스트 환경 | Windows 10, Chrome 95 |
사전 조건 | 테스트용 이메일 계정 준비 |
테스트 데이터 | 이름: 홍길동<br>이메일: testuser@example.com<br>비밀번호: Password123! |
테스트 단계 | 1. 회원 가입 페이지 이동<br>2. 정보 입력<br>3. 약관 동의<br>4. 회원 가입 버튼 클릭<br>5. 성공 메시지 확인 |
예상 결과 | "회원 가입이 완료되었습니다" 메시지가 표시되어야 함 |
실제 결과 | 메시지가 정상적으로 표시됨 |
결과 판정 | 성공 |
비고 | - |
4.3 결과서 작성 팁
- 명확하고 간결하게: 테스트 과정과 결과를 명확하고 간결하게 작성합니다.
- 사실 기반으로: 실제로 발생한 결과를 사실에 입각하여 기록합니다.
- 공유 및 협업: 결과서를 팀원들과 공유하여 문제를 함께 해결합니다.
추가로 알아두면 좋은 사항
페이지 객체 모델(Page Object Model, POM) 적용
테스트 코드의 유지보수성과 재사용성을 높이기 위해 페이지 객체 모델을 활용할 수 있습니다.
# page_objects/login_page.py
from selenium.webdriver.common.by import By
class LoginPage:
def __init__(self, driver):
self.driver = driver
self.username = (By.ID, 'username')
self.password = (By.ID, 'password')
self.login_button = (By.ID, 'loginButton')
def load(self):
self.driver.get('https://www.example.com/login')
def login(self, username, password):
self.driver.find_element(*self.username).send_keys(username)
self.driver.find_element(*self.password).send_keys(password)
self.driver.find_element(*self.login_button).click()
# tests/test_login.py
import unittest
from selenium import webdriver
from page_objects.login_page import LoginPage
class LoginTest(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome(executable_path='path/to/chromedriver')
self.login_page = LoginPage(self.driver)
def test_login(self):
self.login_page.load()
self.login_page.login('test_user', 'test_password')
# 추가 검증 로직 작성
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()
728x90
반응형
'Programming' 카테고리의 다른 글
MVC, MVP, MVVM, MVVM-C 및 VIPER 아키텍처 패턴 비교 (2) | 2025.01.07 |
---|---|
개발 방법론으로 Domain-Driven Design (DDD) 와 CBD (Context-Based Design) 의 비교 (1) | 2025.01.05 |
개발방법론 - 스파이럴 모델 (Spiral Model) 반복을 통한 위험 관리 (1) | 2025.01.04 |
개발방법론 - V-모델 (V-Model) 단계별 검증과 품질 강화 (0) | 2025.01.03 |
애자일개발방법론 - 애자일 (Agile) 신속한 대응과 품질 (0) | 2025.01.02 |
개발방법론 - 폭포수 모델 (Waterfall Model) 개발 방법론의 교과서 (1) | 2025.01.01 |
애자일개발방법론 - 린 (LEAN) 비용 절감과 효율성 극대화 (0) | 2024.12.31 |