유용한 TDD 개념

  • User Story : 사용자 관점에서 어떻게 어플리케이션이 동작해야 하는지 기술한 것
  • Expected failure: 의도적으로 구현한 테스트 실패

단위테스트와 기능테스트의 차이점

차이점 1) 기능테스트 : 사용자 관점에서 애플리케이션 외부를 테스트하는 것 2) 단위테스트 : 프로그래머 관점에서 내부를 테스트하는 것

Django 테스트 실행

기능테스트

from selenium import webdriver

browser = webdriver.Firefox()
browser.get('http://localhost:8000')

assert 'Django' in browser.title

unittest 모듈을 이용한 기능 테스트 확장

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import unittest

class NavigationTest(unittest.TestCase):
  
  def setUp(self):
    self.browser = webdriver.Firefox()
    # 브라우저 실행 후 3초를 기다리도록 명령. 렌더링 속도 혹은 사이트에 따라 3초를 맞춰 어떤 동작을 실행할 경우 정확히 의도한 동작을 실행하기 어려울 수 있음.
    self.browser.implicitly_wait(3)

  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)
    header_text = self.browser.find_element_by_tag_name('h1').text
    self.assertIn('To-Do', header_text)

    inputbox = self.browser.find_element_by_id('id_new_item')
    self.assertEqual(inputbox.get_attribute('placeholder'), 'add new item')

    inputbox.send_keys('Buy shoes')
    inputbox.send_keys(Keys.ENTER)

    table = self.browser.find_element_by_id('id_list_table')
    rows = table.find_elements_by_tag_name('tr')
    self.assertTrue(any(row.text == '1: Buy shoes' for row in rows),)

    self.fail('Finish the test!!')

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

기능테스트 명령어 실행

$ python functional_test.py