본문 바로가기

Posts/Python

파이썬을 이용한 클린 코드를 위한 TDD - 2장 unittest 모듈

반응형

Chapter 2. unittest 모듈 기능 확장

TDD 학습 겸 정리를 위한 내용입니다.


1. 기능 테스트를 이용한 최소 기능의 애플리케이션 설계

챕터 1에서 셀레늄을 이용한 테스트는 실제 브라우저에 실행해 애플리케이션이 어떻게 동작하게 되는지 사용자 관점에서 테스트를 진행하였습니다.

이런 테스트를 기능 테스트라고 부르며 사용자 스토리라는 개념으로 사용자가 어떤 행동을 했을때

애플리케이션이 어떻게 동작해야하는지 기대하며 확인하는 방식입니다.

1-1. 기능 테스트 스토리라인

기능테스트는 스토리를 가지고 있어야 하기에 주석으로 정의를 기록합니다.

애플리케이션 요구사항과 특징을 기능 테스트로만으로도 확인이 가능해야합니다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

service = Service('/usr/local/bin/chromedriver')
# John은 새롭고 재밌는 온라인웹서비스 런칭 소식을 듣고 사이트에 접속한다.
browser = webdriver.Chrome(service=service)
browser.get('http://localhost:8000')

# 웹페이지 접속 후 타이틀에 To-do를 나타낸다.
assert 'To-do' in browser.title

# 서비스에 바로 Todo 작업을 추가하고자 한다.

# 텍스트 input에 운동하기 입력한다.

# 엔터를 치면 페이지가 갱신되면서 제일 상단에 해당 항목이 추가된다.

# 값을 입력했던 텍스트 칸을 비운다.

# 다시 추가로 독서하기를 입력하고 엔터를 친다.

# 페이지가 갱신되며 입력한 2개의 항목이 목록에 보인다.

# 해당 페이지의 url을 공유하여도 같은 데이터의 모습이 보여야한다.

browser.quit()

위 테스트를 실행하면 테스트에 실패하게 됩니다.

테스트가 실패하는 것은 정당한 이유가 있기에 염려하지말고 하나씩 해결해나가며 이 과정을 지속적으로 반복해나가면 됩니다.

테스트가 실패한 것에 대한 내용을 조금 더 효율적으로 보기위해선 assert 명령에 인수를 추가하여 확인할 수 있습니다.

하지만 더 유용하게 unittest를 이용해 테스트 코드를 작성할 수 있습니다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
import unittest


class NewVisitorTest(unittest.TestCase):
    # start test
    def setUp(self):
        service = Service('/usr/local/bin/chromedriver')
        self.browser = webdriver.Chrome(service=service)

    # end test
    def tearDown(self):
        self.browser.quit()

    def test_can_start_a_list_and_retrieve_it_later(self):
        self.browser.get('http://localhost:8000')

        self.assertIn('To-Do', self.browser.title) # 테스트 어센셜을 위한 unittest 함수
        self.fail("finish test") # 강제 에러 메세지 출력

# 커맨드라인을 통해 실행된 것을 확인용 (자동으로 파일내 테스트 클래스 및 메소드를 실행)
if __name__ == '__main__':
    unittest.main(warnings='ignore')

위처럼 작성하게 되면 assert에 인수를 추가하지 않아도 unittestassertIn 함수를 이용해

몇개의 테스트와 몇개가 실패했는지등 유용한 디버깅 정보를 확인할 수 있습니다.

image


2. 암묵적 대기

셀레늄 테스트에 있어 기본적 로직으로 지정한 시간(초단위)만큼 동작을 대기 상태로 둘 수 있습니다.

셀레늄은 페이지가 로딩 후 테스트되도록 실행하지만 완벽하지 않기에 암묵적 대기를 걸어두는 것을 권장합니다.

setUp함수에 self.browser.implicitly_wait(3) 로 구현한다면 3초간 대기 후 실행시키는 의미입니다.


3. 유용한 TDD 개념

  • 사용자 스토리 : 사용자 관점에 애플리케이션이 어떻게 동작할지 기술
  • 예측된 실패 : 의도적으로 구현된 실패 테스트


Reference

반응형