인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

pplkjh2님의 프로필 이미지
pplkjh2

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)

13-17 ModelViewSet pytest 오류

작성

·

78

0

안녕하세요 어제에 이어 강의 내용을 따라 가고 있는데요. 강의 내용대로 PostModelViewSet을 선언하고 (영상기준 8분30초까지 진행) pytest를 실행앴더니

test_unauthenticated_user_cannot_create_post

에서 assert 403 == 400

test_non_author_cannot_update_post

에서 assert 403 == 200

test_nonauthor_cannot_delete_post

에서 assert 403 == 204

 

오류가 각기 발생합니다.

 

강의를 따라가고 있는데 이런식으로만 오류가 발생하니 원인이 어디인지 찾기가 너무 힘든거 같습니다. 원인이 뭐고 이런 오류를 잡으려면 어떻게 해야할까요?

 

 

답변 4

1

이진석님의 프로필 이미지
이진석
지식공유자

방금 장고 pytest 테스트를 디버깅 시연을 촬영해봤습니다. 테스트 과정을 이해하시는 데에 도움이 되셨으면 합니다. ;-)

https://youtu.be/j0SGx9C_11A

1

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

보내주신 코드를 살펴보니, PostModelViewSet 코드에서 권한 설정에서 오타가 있었습니다.

image.png

permission_classes 인데 permission_class 로 코드를 쓰셔서, 해당 권한 설정이 작동되지 않은 것이구요. 그러니 디폴트 권한인 AllowAny 로 처리되었을 것입니다.

그래서 인증되지 않은 CREATE 요청은 IsAuthorOrReadOnly 권한에 걸려서 403 Forbidden 응답을 받아야 하는 데, AllowAny 정책으로 권한은 통과되고, 빈 요청 데이터로 PostSerializer를 통한 유효성 검사가 수행되고, 빈 요청 데이터이기에 유효성 검사에 실패하게 되어, 400 Bad Request 응답을 받으시게 된 것입니다. 나머지 두 개 테스트도 동일한 문제 같습니다.

이와 같은 오타는 쉽게 인지할 수 없는 데요. 이러한 설정도 IDE 자동완성을 자주 활용하게 되는 데요. 자동완성 부분은 파이참이 vscode 보다는 좀 더 똑똑하게 동작해서, 저는 주로 파이참에서 개발하고 cursor (AI 개발툴) 도움이 필요할 때에만 잠시 cursor로 코드를 생성하는 방식으로 활용하고 있습니다.

그리고, 실패하는 테스트를 아래의 IDE 기능으로 한 줄씩 실행해보시면 빠르게 원인을 파악하실 수 있습니다. 상상만 해서는 원인을 찾기는 어렵거든요. 테스트 시에는 클라이언트 요청과 서버 요청이 서로 분리되지 않고, 한 번에 수행이 되거든요. 그러니 ViewSet 코드에도 break point를 걸어두시면 한 번에 디버깅을 할 수 있으니 편리합니다.

image.png

오류를 만나시는 상황이 많이 답답하시겠지만, 오류를 만나고 해결해보시는 과정을 쌓아가시면, 그만큼 성장하시는 좋은 기회가 되시리라 생각합니다. 오류 상황을 같이 고민해보며 같이 차근차근 성장해나가보시죠.

살펴보시고 댓글 부탁드립니다.

화이팅입니다. :-)

pplkjh2님의 프로필 이미지
pplkjh2
질문자

말씀해 주신대로 수정하니 정상적으로 문제는 해결되었는데요. 일부로 똑같이 문제를 발생시키고 디버거로 step마다 확인해도 에러를 잡기가 힘듭니다. 일단 response 인스턴스의 request와 header 그리고 data.serializer에 제가 정의한 내용들이 들어가는 것은 같은데 request.method에 permission과 관련된 내용이 있어야하는게 아닌가요? 디버거로 따라가도 어떤 것을 봐야할지 모르겠는데, 많이 경험하는 수 밖에 없을까요?

0

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

테스트가 예상한 대로 동작하지 않을 때, 코드 만으로 파악이 어려울 때 정확한 파악을 위해서는 편집기의 디버거를 활용해보시는 방법이 정도이고 정확한 방법입니다. // 강의와 어딘가 다른 포인트가 있을 것입니다.

일단 현재 프로젝트를 압축해서 help@pyhub.kr 메일로 보내주시면, 제가 바로 코드를 확인해보겠습니다.

화이팅입니다. :-)

pplkjh2님의 프로필 이미지
pplkjh2
질문자

메일 드렸습니다

0

안녕하세요, 인프런 AI 인턴입니다. pplkjh2님.

테스트를 진행하다 보면 예상했던 HTTP 상태 코드와 실제로 반환된 HTTP 상태 코드가 맞지 않아 오류가 발생하는 경우가 종종 있습니다. 일단 표면적인 오류는 테스트에서 기대했던 결과(403 Forbidden)와 실제 결과(400 Bad Request, 200 OK, 204 No Content) 사이의 불일치입니다.

각 테스트 케이스에 대해 간단히 설명드리겠습니다:

  1. test_unauthenticated_user_cannot_create_post:

    • 403이 기대되는 이유는 인증되지 않은 사용자가 포스트를 생성할 수 없어야 한다는 것입니다. 하지만 실제로 400이 반환되고 있다는 것은 잘못된 요청(Bad Request)이라는 의미입니다. 이 경우, 요청 형식이나 데이터가 잘못되었을 가능성이 있습니다.
  2. test_non_author_cannot_update_post:

    • 403이 기대되는 이유는 작성자가 아닌 사용자가 포스트를 수정할 수 없어야 한다는 것입니다. 그러나 200이 반환되고 있다는 것은 수정이 성공적으로 이루어졌다는 뜻입니다. 이 문제는 권한 설정에 누락 또는 오류가 있을 수 있음을 시사합니다.
  3. test_nonauthor_cannot_delete_post:

    • 403이 기대되는 이유는 작성자가 아닌 사용자가 포스트를 삭제할 수 없어야 한다는 것이지만, 204가 반환된다는 것은 포스트가 성공적으로 삭제되었다는 것입니다. 이 역시 권한 설정이 제대로 이루어지지 않았을 가능성을 나타냅니다.

이러한 결과를 해결하기 위한 몇 가지 조치 사항은 다음과 같습니다:

  • Permissions 설정 확인: 사용 중인 Permission 클래스가 올바르게 설정되어 있는지 확인하세요. 특히, IsAuthenticated 또는 IsAuthorOrReadOnly 등의 커스텀 퍼미션이 제대로 작동하고 있는지 확인이 필요합니다.

  • URL 및 API 엔드포인트 확인: 테스트에서 호출하고 있는 URL 및 관련 엔드포인트가 올바른지 확인하세요. 잘못된 경로를 호출하고 있을 가능성도 있습니다.

  • Request Payload 및 Headers 확인: 각 테스트에서 보내고 있는 요청의 payload와 headers가 제대로 구성되어 있는지 확인하세요.

  • Log 및 Debugging: 서버 로그를 확인하여 어떤 요청이 어떻게 처리되고 있는지 확인해 보세요. 필요한 경우 print 문이나 pdb 등의 디버깅 툴을 사용하여 문제점을 파악하세요.

관련된 기존 질문과 답변을 확인하고 추가적인 정보를 얻고 싶으시다면 아래의 링크를 참고해 주세요:
- assertion error at /public/이 뜹니다
- 13-16) UpdateAPI test 에러

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

pplkjh2님의 프로필 이미지
pplkjh2

작성한 질문수

질문하기