클린 코드를 위한 테스트 주도 개발 1.3

전호종·2021년 3월 5일
0

TDD

목록 보기
4/6

첫 Django 애플리케이션과 첫 단위 테스트

Django는 코드를 app 형태로 구조화한다.
하나의 프로젝트는 여러 앱을 가질 수 있으며 다른 사람이 만든 외부 앱도 사용할 수 있다.
또한 다른 프로젝트에서 만든 자신의 앱을 재사용할 수도 있다.

$ python manage.py startapp lists

단위 테스트는 무엇이고, 기능 테스트와 어떤 차이가 있을까?

  • 기능 테스트 : 사용자 관점에서 애플리케이션 외부를 테스트
  • 단위 테스트 : 프로그래머 관점에서 그 내부를 테스트

작업 순서

  • 기능 테스트를 작성해서 사용자 관점의 새로운 기능성을 정의하는 것부터 시작한다.
  • 기능 테스트가 실패하면 어떻게 코드를 작성해야 테스트를 통과할지를 생각한다.
    이 시점에서 하나 또는 그 이상의 단위 테스트를 이용해서 어떻게 코드가 동작해야 하는지 정의한다.
  • 단위 테스트가 실패하고 나면 단위 테스트를 통과할 수 있을 정도의 최소한의 코드만 작성한다.
    기능 테스트가 완전해질 때까지 반복한다.
  • 기능 테스트를 재실행해서 통과하는지 또는 제대로 동작하는지 확인한다.

Django에서의 단위 테스트

Django는 특수한 TestCase 버전을 사용한다. 기본 unittest.TestCase의 확장 버전으로 Django 특화 기능이 추가되어 있다.

고의적인 실패 테스트

실행

$ python manage.py test

오류 확인

커밋

커밋하기에 적절한 시점이다. git diff 명령어로 항상 커밋전에 변경 내용을 확인하자.

Django의 MVC, URL, 뷰 함수

Django workflow : MVC(Model - View - Controller)

  • 특정 URL에 대한 HTTP 요청을 받는다
  • Django는 특정 큐칙을 이용해서 해당 요청에 어떤 뷰 함수를 실행할지 결정한다.
  • 이 뷰 기능이 요청을 처리해서 HTTP 응답으로 반환한다.

테스트

  • URL의 사이트 루트('/')를 해석해서 특정 뷰 기능에 매칭시킬 수 있는가?
  • 이 뷰 기능이 특정 HTML을 반환라게 해서 기능 테스트를 통과할 수 있는가?

에러 확인
ImportError : 아직 존재하지 않는 것을 임포트하려고 했다.

마침내 실질적인 애플리케이션 코드를 작성한다

현재 실패 테스트
lists.views에서 home_page를 임포트할 수 없는 상태다.

테스트 실행 및 에러 확인
Traceback을 확인해 보면 '/'를 확인하려고 할 때 Django가 404 에러를 발생시키고 있다는 것을 알았다. 즉, Django가 '/'에 해당하는 URL맵핑을 찾을 수 없다는 것이다.

urls.py

'/'에 해당하는 URL을 작성하고 다시 실행

오류 확인
단위 테스트가 URL과 lists/views.py에 있는 home_page = None 사이의 링크를 만들었지만 home_page를 호출할 수 없다는 오류를 확인할 수 있다. home_page가 함수가 아니기 때문이다.

함수 작성

테스트 결과 확인
첫 단위 테스트 성공 및 커밋
git commit -m '첫 단위 테스트와 url 맵핑 그리고 임시 뷰'

뷰를 위한 단위 테스트

현재 뷰에는 빈 함수가 있다. HTML 형식의 실제 응답을 반환해야 한다.
HTML을 반환하는지 확인하는 테스트를 작성해보자.

코드 설명

  • HttpRequest 객체를 생성해서 사용자가 어떤 요청을 브라우저에 보내는지 확인한다.
  • home_page 함수에 인자로 넣어 응답을 취한다.
  • 응답 내용이 < html >로 시작하고 </ html >로 끝나는지 확인한다.
  • response.content는 byte형 데이터로 b''구문을 사용해서 비교한다.
  • 반환 내용의< title >태그에 'To-Do lists'라는 단어가 있는지 확인한다. 기능 테스트에서 확인한 것이기 때문에 단위 테스트도 확인해야 한다.

결과 확인
함수에 request 인자를 설정하지 않은 것이다.

단위 테스트 - 코드 주기
1. 터미널에서 단위 테스트를 실해해서 어떻게 실패하는지 확인한다.
2. 편집기상에서 현재 실패 테스트를 수정하기 위한 최소한의 코드를 변경한다.
그리고 이것을 반복한다.
?코드 품질을 높이고 싶다면 코드 변경을 최소화해야 한다. 또한 최소화한 코드는 하나하나 테스트에 의해 검증돼야 한다.

  • 최소한의 코드 변경
  • 테스트
  • 코드
  • 다시 테스트
  • 다시 코드
  • 테스트
  • 마지막으로 개발 서버를 실행하고 기능 테스트를 해보자.
    테스트는 성공적이다. 작업 완료 메세지를 출력하기 위한 self.fail('Finish the test!')가 실행되었다.
  • 커밋
    git commit -m '최소 HTML을 반환하는 기본 뷰'

0개의 댓글