Selenium, unittest를 이용한 Django 웹페이지 기능테스트

김동환·2021년 4월 29일
0

TDD

목록 보기
1/1

해당 내용은 클린 코드를 위한 테스트 주도 개발의 내용을 바탕으로 작성되었습니다.
python 3.8.8 버전과 Django 3.2 기준 코드입니다.(Mac OS)

기능테스트

기능테스트(Functional test, FT)란 End-to-End Test라고 부르기도 하는 것으로, 전체 애플리케이션이 어떻게 동작하는지를 외부 사용자 관점에서 확인하는 테스트를 의미합니다. 시스템 내부의 정확한 로직들을 알 수는 없으나 사용자 스토리에 맞춰 애플리케이션이 정상적으로 동작하는지를 확인하고 이해할 수 있다는 점에서 의의가 있습니다. 따라서 잘 작성된 기능테스트의 경우에는 이것만을 가지고도 애플리케이션 요구사항과 특징에 대해 논의가 가능합니다.

관련 설치

해당 글에서는 기능테스트를 위해 selenium을 이용하여 브라우저(firefox)를 실행한 후 Django webserver가 제공하는 내용을 테스트하는 방식을 사용합니다. 따라서 selenium 및 Django 그리고 관련 webdriver를 설치해줘야 합니다.

python package

$ pip install selenium django

Webdriver(FireFox)

$ brew install geckodriver

unittest 모듈

python 기본 라이브러리에는 테스트를 도와주는 unittest 라이브러리가 기본으로 존재합니다. 이를 이용하면 아래처럼 간단하게 기능 테스트를 구현할 수 있습니다. 해당 테스트는 localhost의 8000번 포트로 접속할 경우 타이틀에 'The install' 이라는 단어가 포함된 웹 페이지를 경험하면 성공하게 됩니다. (아무 설정이 추가로 되지 않은 Django의 기본 템플릿이 'The install worked successfully ...'의 타이틀을 가지고 있기 때문입니다.)

#functional_test.py
from selenium import webdriver
import unittest


class NewVisitorTest(unittest.TestCase):

    def setUp(self):
        self.browser = webdriver.Firefox()
        self.browser.implicitly_wait(3) # 안정적인 페이지 로딩을 위한 대기

    def tearDown(self):
        self.browser.quit()

    def test_can_start_page(self):
        # 웹 사이트 확인
        self.browser.get('http://localhost:8000')

        # 웹 페이지 타이틀이 'The install'를 포함하고 있다.
        self.assertIn('The install', self.browser.title)


if __name__ == "__main__":
    unittest.main() 
        

python manage.py runserver를 이용하여 개발 서버를 실행시킨 후, 이 테스트를 python functional_test.py 명령어를 통해 실행하면 테스트를 무사히 통과하는 것을 확인할 수 있습니다.

결론

예시로 작성한 테스트가 너무 간단한 내용이기는 하지만, 이를 통해 selenium과 내부 라이브러리인 unittest를 이용하면 Django로 작성한 웹페이지의 동작을 테스트해 볼 수 있음을 확인할 수 있었습니다. 이 예시에서는 정상적으로 접속이 되었는지만 테스트했지만 같은 원리를 이용하면 다양한 기능 테스트를 추가하여 적용해볼 수 있을 것입니다.

profile
개발을 통해 다양한 세상을 경험하는 것을 즐기는 개발자입니다.

0개의 댓글