Programming

셀레니움을 이용한 테스트 자동화 구축 가이드

IT오이시이 2025. 1. 25. 00:52
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)

  1. Chrome 버전 확인: 크롬 브라우저에서 설정 > Chrome 정보로 이동하여 버전을 확인합니다.
  2. ChromeDriver 다운로드: ChromeDriver 다운로드 페이지에서 크롬 버전에 맞는 드라이버를 다운로드합니다.
  3. 드라이버 설치: 다운로드한 chromedriver 파일을 적절한 경로에 저장합니다. 일반적으로 프로젝트 루트나 시스템 PATH에 포함된 경로를 사용합니다.

 

1.3.2 다른 브라우저 웹드라이버

 


 

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:  회원 로그인 기능 테스트

  • 목적: 올바른 자격 증명을 사용하여 로그인 기능이 정상적으로 동작하는지 확인합니다.
  • 사전 조건: 테스트용 계정이 존재해야 합니다.
  • 테스트 단계:
    1. 회원 로그인 페이지로 이동합니다.
    2. 사용자 이름과 비밀번호를 입력합니다.
    3. 로그인 버튼을 클릭합니다.
    4. 로그인 성공 메시지가 표시되는지 확인합니다.

 

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
반응형