[TDD] Test-Driven Development with Python 2장

SUNGJIN KIM·2022년 6월 26일
0

tdd-with-python

목록 보기
2/7
post-thumbnail

˗ˋˏ♡ˎˊ˗ Extending functional tests using the Unit test module

  • functional_test.py 코드 내 스토리 추가
  • unittest 모듈 사용하기

실습 - 코드 추가 및 테스트 실패

functional_test.py

from selenium import webdriver

browser = webdriver.Firefox()

# 에디스(Edith)는 멋진 작업 목록 온라인 앱이 나왔다는 소식을 듣고
# 해당 웹 사이트를 확인하러 간다.
# browser.get('http://127.0.0.1:8000/')
browser.get('http://localhost:8000')

# 웹 페이지 타이틀과 헤더가 'To-Do'를 표시하고 있다.
assert 'To-Do' in browser.title

# 그녀는 바로 작업을 추가하기로 한다

# "공작깃털 사기" 라고 텍스트 상자에 입력한다
# (에디스의 취미는 날치 잡이용 그물을 만드는 것이다)

# 엔터키를 치면 페이지가 갱신되고 작업 목록에
# "1: 공작깃털 사기" 아이템이 추가된다

# 추가 아이템을 입력할 수 있는 여분의 텍스트 상자가 존재한다.
# 다시 "공작깃털을 이용해서 그물 만들기" 라고 입력한다 (에디스는 매우 체계적인 사람이다)

# 페이지는 다시 갱신되고, 두 개 아이템이 목록에 보인다
# 에디스는 사이트가 입력한 목록을 저장하고 있는지 구감하다
# 사이트는 그녀를 위한 특정 URL을 생성해준다
# 이때 URL에 대한 설명도 함께 제공된다

# 해당 URL에 접속하면 그녀가 만든 작업 목록이 그대로 있는 것을 확인할 수 있다

# 만족하고 잠자리에 든다.

browser.quit()

코드 내 스토리를 추가하고, 실행 시 아래와 같은 오류가 발생한다면 올바른 기대결과값을 얻은 것이다.

Traceback (most recent call last):
	File "functional_test.py", line 10, in <module>
    	assert 'To-Do' in browser.title
AssertionError

Unittest 모듈 사용하기

python 에 모듈에 대해 단위테스트를 할 수 있는 방법으로 unittest 모듈을 사용하면 된다.

functaional_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_a_list_and_retrieve_it_later(self):
        # 에디스(Edith)는 멋진 작업 목록 온라인 앱이 나왔다는 소식을 듣고
        # 해당 웹 사이트를 확인하러 간다.
        self.browser.get('http://localhost:8000')

        # 웹 페이지 타이틀과 헤더가 'To-Do'를 표시하고 있다.
        self.assertIn('To-Do', self.browser.title)
        self.fail('Finish the test!')

        # 그녀는 바로 작업을 추가하기로 한다

        # "공작깃털 사기" 라고 텍스트 상자에 입력한다
        # (에디스의 취미는 날치 잡이용 그물을 만드는 것이다)

        # 엔터키를 치면 페이지가 갱신되고 작업 목록에
        # "1: 공작깃털 사기" 아이템이 추가된다

        # 추가 아이템을 입력할 수 있는 여분의 텍스트 상자가 존재한다.
        # 다시 "공작깃털을 이용해서 그물 만들기" 라고 입력한다 (에디스는 매우 체계적인 사람이다)

        # 페이지는 다시 갱신되고, 두 개 아이템이 목록에 보인다
        # 에디스는 사이트가 입력한 목록을 저장하고 있는지 구감하다
        # 사이트는 그녀를 위한 특정 URL을 생성해준다
        # 이때 URL에 대한 설명도 함께 제공된다

        # 해당 URL에 접속하면 그녀가 만든 작업 목록이 그대로 있는 것을 확인할 수 있다

        # 만족하고 잠자리에 든다.

if __name__ == '__main__':
    unittest.main(warnings='ignore')

코드를 수정하고 실행해보면 아래와 같이 결과값이 나온다.

$ python3 functional_test.py
F
======================================================================
FAIL: test_can_start_a_list_and_retrieve_it_later (__main__.NewVisitorTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "functional_test.py", line 19, in test_can_start_a_list_and_retrieve_it_later
    self.assertIn('To-Do', self.browser.title)
AssertionError: 'To-Do' not found in 'The install worked successfully! Congratulations!'

----------------------------------------------------------------------
Ran 1 test in 2.909s

FAILED (failures=1)

이전에 나왔던 결과값이랑은 다른 결과값이 노출된다.
확실히 이런식으로 결과가 나온다면 테스트 결과를 한 눈에 알 수 있게된다.

해당 작업에 추가적으로 암묵적 대기 (implicitly_wait) 기능을 setUp에 추가해주면 2장은 끝이 난다.

implicitly_wait는 필요에 따라 지정한 시간(초 단위)만큼 동작을 대기 상태로 둘 수 있다.

Git commit

2일차 실습 내용 :
https://github.com/woonmong712/wm-tdd


마무리

진행하면서 발생한 특이 사항은 아래와 같다.

1) MacBook 내 동일 환경 셋팅

집에 있는 iMac 으로 셋팅을 마쳤고, 이어 평소에도 맥북으로도 작업할 수 있도록 동일한 환경을 셋팅해 주었다.

셋팅 중, 계속 selenium을 설치하는 과정에서 아래와 같은 에러가 발생하였다.

DEPRECATION: Configuring installation scheme with distutils config files is deprecated and will no longer work in the near future. If you are using a Homebrew or Linuxbrew Python, please see discussion at https://github.com/Homebrew/homebrew-core/issues/76621

열심히 구글링 해본 결과, python 내부에서 여러 버전이 충돌되서 발생한 것으로 추측되었고 이에 여태까지 하던 환경셋팅을 포기하고 새로 셋팅하니 정상적으로 되는 것 확인하였다.

참고 도서 : 클린 코드를 위한 테스트 주도 개발 (비제이퍼블릭,2015)

profile
#QA #woonmong

0개의 댓글