Unit test(2)

wltjs10645·2020년 10월 8일
0

django

목록 보기
13/15
post-thumbnail
  • TextCase: Unittest 프레임워크의 테스트 조직 기본 단위
  • Fixture: 테스트 진행 시 필요한 테스트용 데이터 혹은 설정
  • Assertion: 테스트 시 검증이 제대로 진행되었나 확인하는 부분

**유닛 테스트 작성 과제💡
**
views.py

class AuthorBookView(View):
    def get(self, request, title):
        try:
            if Book.objects.filter(title = title).exists():
                book = Book.objects.get(title = title)
                authors = list(AuthorBook.objects.filter(book = book).values('author'))
                return JsonResponse({'authors':authors}, status = 200)
            return JsonResponse({'message':'NO_BOOK'}, status = 400)
        except KeyError:
            return JsonResponse({'message':'INVALID_KEYS'}, status = 400)

1. test_authorbook_get_success
response 에 데이터를 담아서 전달해주는 경우는 실제 get 메소드에서 보내 줄 동일한 형식의 데이터(json type) 를 test 함수에도 넣어서 확인해야 한다! post 메소드 test함수에서 생성한 fixture에 맞는 data를 넣어주면 됨

2. test_authorbook_get_fail
해당하는 데이터가 없는 경우 response 를 보내줄 수 없다. 이에 해당하는 유닛 테스트함수 작성.

3. test_authorbook_not_found
예외 처리 테스트 함수. 여기서 좀 시간이 걸렸던 게,

  • path parameter 로 title 값을 전달 받는데, key error를 어떻게 발생시킬 지 감이 안와서 url 부분을 계속 바꿔봤는데
  • 어떻게 하든 404 에러만 발생이 되고, view 에는 key error & 400 으로 작성이 되어있어서 처리 방법이 안떠올랐다.
  • 테스트 코드 돌려보니 response 가 제이슨 형식이 아니고 <HttpResponseNotFound status_code=404 content_type="text/html"> <- 이렇게 발생이 되길래 HttpResponse 객체(?)로 뭔가 해보려고 했는데 검색해도 뭐가 안나오고 해결이 안됐다...
  • 결론은 그냥 status code 만 비교하면 테스트 되는 것이었다🙃

tests.py

def test_authorbook_get_success(self):
        client = Client()
        response = client.get('/book/author-book/python')
        self.assertEqual(response.json(),
            {
                'authors': [
                    {'author' :1},
                    {'author' :2}
                    ]
            }
        )
        self.assertEqual(response.status_code, 200)  

    def test_authorbook_get_fail(self):
        client = Client()
        response = client.get('/book/author-book/c-language')
        self.assertEqual(response.json(),
            {
                'message':'NO_BOOK'
            }
        )
        self.assertEqual(response.status_code, 400)

    def test_authorbook_get_not_found(self):
        client = Client()
        response = client.get('/book/author-book?name=python')
        self.assertEqual(response.status_code, 404)

profile
BACKEND DEVELOPER☁️

0개의 댓글