[이케아 프로젝트] unittest

hyuckhoon.ko·2020년 7월 10일
0

What I learned in wecode

목록 보기
84/109

장바구니 기능의 각 엔드포인트에 대한 unittest 작업중이다.

JsonResponse 각각에 대한 unittest를 만들어야 하니
앞으로 14개가 남았다.

좀전에 1개 통과(success) 케이스에 대한 ok 결과를 받았으니 말이다.

1. What was the 'blocker'?

그것은 바로 '로그인 데코레이터'

장바구니에 1) 제품을 추가하거나
2) 수량을 증감시키거나
3) 장바구니의 제품 리스트를 보기 위해서

stateless한 HTTP통신 특성상,
해당 유저의 토큰값을 매번 확인해야 한다.

문제는

[1] 로그인 담당은 내가 아니다. 다른 팀원이다.
-> 아직 git push한 것이 아무것도 없기에
스스로 유저 모델, 유저 뷰 등을 작성해야 했다.

[2] 유닛테스트를 위한 tests.py 작업시,
내가 요청하는 모든 엔드포인트엔 로그인 데코레이터 함수를 거쳐야 했다.
이게 가장 큰 문제였다.

"장바구니에 제품을 추가하는 함수를 호출시,

어떻게 request 객체 헤더(headers)에

토큰값을 넣을 것인가"

왜냐하면! 일단 tests.py의 함수 정의부분을 먼저 보자.

 from django.test    import (
			      TestCase,
			      Client
                             )


               ... 중략 ...


 def test_push_item_post_success(self):

내가 테스트하려는 함수의 파라미터에는
request객체가 없다.

그렇다고 self 우측에 request 파라미터를 추가하면 에러가 발생한다.
Postman을 사용할 때처럼 내 로컬서버를 통한 'post'를 하는 것이 아니기 때문이다.

(참고) 유닛테스트를 할 때, 로컬 서버를 이용하지 않는다.
또한, 내 데이터베이스 또한 이용하지 않는다.

5시간 동안 헤매고, 수많은 구글링을 통해 다음의 문서를 찾을 수 있었다.
장고문서.....당신은 도덕책
출처 : https://docs.djangoproject.com/en/2.2/topics/testing/tools/

테스트를 위해 선언했던 Client 클래스를 통해
request의 헤더값을 지정할 수가 있다!

마치, Postman의 헤더에 토큰값을 미리 넣어두고
다른 엔드포인트들을 테스트할 때처럼 말이다.

client = Client(HTTP_Authorization='내 토큰값')



2. 테스트 결과

  • 첫 OK

원리를 알았으니,
이제 나머지 14개에 대한 유닛테스트 작성은 시간문제다.

주말 동안 장바구니 앱의 유닛테스트를 완료하고
월요일 위코드에 도착하자마자 git push하고 merge가 되는
행복회로를 돌려본다.

0개의 댓글