티스토리 뷰

반응형

Question의 pub_date가 미래로 설정되어있다면,  미래의 그 시기가 되면 해당 질문이 게시되지만 그 전 까지는 질문이 보이지 않아야합니다. 

하지만 현재 poll 앱은 pub_date필드가 미래인 질문까지도 포함하여 게시합니다.

이것을 뷰 테스트와 함께 개선해보겠습니다. 

 

테스트 환경 및 클라이언트 세팅

Django는 뷰 레벨에서 코드와 상호 작용하는 사용자를 시뮬레이트하기위해 테스트 클라이언트 클래스 Client를 제공합니다.

이 테스트 클라이언트를 tests.py또는 shell에서 사용할 수 있습니다.

 

 

우선 Shell에서 먼저 사용해보겠습니다. 

아래 코드로 Shell을 열고 Shell에서 테스트 환경을 setup 해주세요. 

 

django.test.utils 문서를 보면 

test환경을 setup, teardown할 수 있는 함수들이 있고

 

 

 

test database를 setup, teardown 할 수 있는 함수들도 있네요

 

 

아무튼 setup_test_environment()를 사용하여 템플릿 렌더러를 설치했습니다.

이 메소드는 테스트 데이터베이스를 셋업하지 않습니다. setup_databases 메소드를 따로 불러줘야합니다. 

(나중에 tests.py에서는 테스트를 돌리면 테스트 데이터베이스를 알아서 만들어줍니다. 추후 필요하지 않습니다.)

 

 

다음으로 우리는 테스트 클라이언트 클래스를 import 해야합니다.

(나중에 tests.py에서는 django.test.TestCase 클래스에 같이 딸려오는 클라이언트를 사용할 것이므로 이것은 필요하지 않을 것입니다) 

 

 

 

 

이제 환경 세팅이 끝났고, 우리가 만든 클라이언트에게 아래와 같이 일을 시킬 수 있습니다. 

 

 

뷰 개선시키기 - IndexView

polls > views.py에 가보면 

IndexView가 이렇게 구현되어있습니다. 

get_queryset 메소드는 최근 5개 Question들을 리턴해주게 되어있네요. 

 

 

pud_date가 미래인 것빼고 최근 5개 Question을 리턴해주도록 get_queryset 메소드를 수정해주세요

 

 

오잉 저 lte가 뭐냐면 

queryset 문서를 보면 lte는 "이하" 를 뜻한다고 나와있습니다.

pud_date가 현재 이하(즉 현재거나 과거) 인 것들만 필터링해서 그중, 최근 5개를 리턴해주는 코드 입니다. 

그 외에도 gt, gte, lt 같은 것들이 있더라구요! 신기하네요 

 

 

아무튼 이렇게 코드를 수정하면 이제  pud_date가  미래인  Question 들은 안나오겠죠?!?

이것을 새로운 테스트를 작성하여 확인해봅시다

 

새로운 뷰 테스트 - IndexView

polls > tests.py 에 가줍니다. 

우선 reverse를  import해주세요. 

 

 

새로운 테스트 클래스와 함께 질문들을 생성하는 함수를 만들 것입니다. 

 

 

테스트를 돌려보면 이전 포스팅에 작성했던 테스트들과 더불어 8개의 테스트가 모두 성공했다고 나옵니다. 

참고로 테스트 데이터 베이스는 각 테스트 메소드가 돌아갈때마다 재설정된다고 합니다. 

 

 

그리고 위의 테스트 코드에서 django.test.TestCase 클래스의 assertContains() assertQuerysetEqual()  메소드를 사용했습니다. 

assertContains를 쓴 것은 잘 이해가 가는데,

assertQuerysetEqual은 assertEqual이 있는데 굳이 이걸 왜 썼지? 하는 의문이 듭니다! 

 

그래서 테스트중 하나를 assertEqual로 바꿔서 돌려보면 

 

 

이런 이유와 함께 테스트가 실패합니다!

 

 

response.context는 그냥 array가 아니라 QuerySet으로 감싸진 array를 리턴해주는데,

assertQuerysetEqual을 쓰면 QuerySet을 벗겨줘서(?) 그냥 배열과 비교할 수 있게 해주나봅니다 👍

 

 

뷰 개선시키기 & 새로운 뷰 테스트 - DetailView

 

미래의 설문들은 목록에 나타나지는 않지만, 사용자가 URL을 알고 있거나, 추측하면 접근할 수 있습니다.

그래서 우리는 DetailView에 비슷한 제약 조건을 추가할 필요가 있습니다.

 

polls > views.py에 가보면 

DetailView는 이렇게 구현되어있었는데,

 

아래와 같이 get_queryset 함수를 오버라이딩 해주세요

 

 

참고로 DetailViewListView처럼 get_queryset이라는 함수를 제공하고 있어요 : ) 

 

 

그 다음, 

polls > test.py에 가서

아래와 같이 두개의 테스트를 추가해서 위에 추가한 코드를 검증합니다. 

 

 

테스트를 돌려보면 성공하네요! 검증 끝!

 

 

 

 

마지막으로 코드 커버리지(Code coverage describes how much source code has been tested) 도 볼 수 있다고 하네요

자세한 내용은 Integration with coverage.py 를 참조해주세요!

 

 

반응형
댓글