Test Driven Development
테스트 주도 개발(Test-driven development TDD)은 매우 짧은 개발 사이클을 반복하는 소프트웨어 개발 프로세스 중 하나이다. 우선 개발자는 바라는 향상 또는 새로운 함수를 정의하는 (초기적 결함을 점검하는) 자동화된 테스트 케이스를 작성한다. 그런 후에, 그 케이스를 통과하기 위한 최소한의 양의 코드를 생성한다. 그리고 마지막으로 그 새 코드를 표준에 맞도록 리팩토링한다. 이 기법을 개발했거나 ‘재발견’ 한 것으로 인정되는 Kent Beck은 2003년에 TDD가 단순한 설계를 장려하고 자신감을 불어넣어준다고 말하였다.
출처: 위키피디아
Test Driven Development에서 항상 가장 먼저 해야할 일은 테스트 코드를 짜는 것이다.
먼저 작은 기능을 수행하는 테스트 코드를 짜서 실행해본 다음 테스트 코드를 에러 없이 실행할 수 있도록 실제 앱에 대한 코드를 짜는 것이다.
이 과정을 한 번에 한 단계씩 반복해나가는 것이 TDD의 기초이다.
기능 테스트 (Functional Test)
이 TDD 튜토리얼에서는 장고와 셀레니움을 이용해서 테스트 환경을 구축할 것이다.
먼저 장고가 잘 설치되어 있고, 작업을 시작할 준비가 되어있는지를 확인할 것이다.
이를 확인하기 위해서는 장고의 개발용 서버가 로컬 PC에서 잘 실행되는지를 확인해야한다.
개발용 서버가 잘 실행되는지 확인하기 위해 셀레니움을 사용한다.
프로젝트 파일에 functional_test.py
파일을 만들고 다음의 코드를 입력한다.
# functional_test.py
from selenium import webdriver
browser = webdriver.Chrome('chromewebdriver 경로')
browser.get('http://localhost:8000')
assert 'Django' in browser.title
이 코드는 우리가 만들 장고 프로젝트에 대한 기능 테스트 (Functional Test, FT)
를 수행한다.
Functional Testing
기능 테스트(Functional testing)는 품질 보증 프로세스의 한 과정이며, 테스트 대상 컴포넌트의 명세로부터 도출된 테스트 케이스에 기반하여 수행되는 블랙박스 테스트 기법의 일종이다. 프로그램에 입력을 주고, 그에 해당하는 출력을 조사함으로써 테스트를 수행하게 된다. 이 때 프로그램의 내부 구조에는 거의 관심을 가지지 않는다. (이러한 점이 화이트박스 테스트와 다른 점이다.)[1] 기능 테스트는 대부분의 경우 해당 시스템이 무엇을 하는지를 기술한다.
출처: 위키피디아
이 코드가 하는 일은:
- 크롬드라이버를 이용해서 Python으로 제어 가능한 크롬 브라우저를 실행한다.
- 브라우저를 통해 로컬 서버 주소인
http://localhost:8000
에 접속한다. - 접속한 페이지의 타이틀에
Django
라는 문자열이 있는지 검사한다.
터미널에서 이 코드를 실행하여 기능 테스트를 실시해본다.
python functional_test.py
실행하면 크롬 브라우저 창이 하나 뜨면서, 아래와 같은 AssertionError
가 발생한다.
Traceback (most recent call last):
File "functional_tests.py", line 6, in <module>
assert 'Django' in browser.title
AssertionError
Django
라는 문자열이 http://localhost:8000
의 페이지 타이틀에 없다는 내용이다.
이 에러를 통해 장고 프로젝트가 로컬 서버에서 작동하지 않는다는 것을 확인할 수 있다.
이제 에러를 확인했으므로, 이 테스트를 통과하기 위한 코드를 작성한다.
장고 프로젝트 시작하기
이 튜토리얼에서는 To-Do list
앱을 만들어볼 것이다. 장고 프로젝트를 시작하기 위해 다음 코드를 입력한다. 프로젝트 이름은 superlists
이다.
django-admin startproject superlists
superlists
라는 폴더가 생성된 것을 확인할 수 있다. 그 폴더로 이동해서 manage.py
가 있는 것을 확인하자.
manage.py
는 장고 개발을 위한 여러가지 편의 기능을 제공한다. 그 중 하나인 개발용 로컬 서버를 실행시켜 보자.
./manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
You have unapplied migrations; your app may not work properly until they are
applied.
Run 'python manage.py migrate' to apply them.
Django version 1.8, using settings 'superlists.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
서버를 실행시켜 놓은 다음, 새 터미널 창을 열어서 functional_test.py
파일이 있는 경로로 이동해서 기능 테스트를 다시 실행시켜 보자.
python functional_test.py
이번에는 AssertionError
가 뜨지 않으면서, 아래와 같은 페이지가 브라우저에 뜨는 것을 확인 할 수 있다.
처음으로 기능 테스트를 통과한 순간이다.
Reference
Test-Driven Development with Python, Harry Percival: http://chimera.labs.oreilly.com/books/1234000000754/ch01.html