✅ 오늘 배운 것
pytest에서 그저께 작업한 내용을 바탕으로 pytest 명령어를 실행하였는데, 예상 외로 잘 되지 않았다. monkey patching을 통해서 해당 부분 코드를 스킵하는 부분이 잘 동작하지 않는 것 같았다. 나는 monkeypatch의 setattr 함수를 사용해서 해당 함수의 반환값을 None으로 바꾸려고 의도했었는데, 생각해보니 해당 함수를 호출하는 것 까지는 막을 수 없었을 수 있겠다.
그러니까 이런 식이다.
# conftest.py
@pytest.fixture(autouse=True)
def patch_send_push_notification_device(monkeypatch):
monkeypatch.setattr('todos.firebase_messaging.send_push_notification_device', lambda: None)
즉 해당 함수의 리턴값은 None이 될 수 있다고 해도, 해당 함수를 호출하는 코드는 실행되고 있어서 해당 'request.auth.get("device")' 부분에서 에러가 나는 것 같다. 어떻게 하면 해당 코드를 아예 무시하고 호출되지 않도록 할 수 있을까? 그러니까 해당 함수(send_push_notification_device)의 인자로 들어가는 request.auth.get('device') 코드에서 문제가 발생하고 있었다.
그래서 해결 방법을 알아보았다. 팀원의 조언을 들어보니 모든 테스트에서는 create_user와 authenticated_client라는 pytest fixture를 사용하고 있었다. 그래서 해당 authenticated_client fixture의 내용을 다음과 같이 수정해 주었더니 문제가 해결되었다.
@pytest.fixture
def authenticated_client(create_user):
# 원래 token={'device': None} 부분이 없었는데 추가해 주었음
client.force_authenticate(user=create_user, token={"device": None})
yield client
client.force_authenticate(user=None) # logout
여기서 client의 force_authenticate 메소드를 사용하면 해당 인자로 주어진 user와 token 값으로 강제로 인증을 시도한다. 내가 이해한 바로는 request 객체의 request.user 값과 request.auth 값을 주어진 값으로 강제로 바뀌게끔 한다.
위와 같이 코드를 바꿔 주었더니 아래와 같이 기존엔 모두 fail하던 테스트 케이스들이 거의 다 통과되었다.
일부 fail이 난 테스트 케이스는 비동기 뷰를 호출하는 테스트 케이스였다. 구체적인 로그는 다음과 같았다. coroutine과 관련된 에러가 나는 이유는 동기 상황을 가정하면 httpRequest를 리턴하기를 예상하는데, 비동기 뷰에서는 coroutine을 리턴해서 에러가 나는 것 같았다.
팀원이 말해주길 'pytest asyncio'라는 라이브러리가 있다고 한다. 그래서 해당 라이브러리를 통해서 비동기 뷰를 테스트해보면 좋겠다. 일단 이 이슈는 따로 티켓을 파서 진행하자.
✅ 궁금한 점
- 비동기 뷰의 동작 원리가 궁금하다. 나는 지금까지 def를 async def로 바꾸면 모든 문제가 해결! 되는 줄 알았는데 비동기 뷰의 동작 원리는 생각보다 복잡하더라... Celery는 왜 써야 할까? 그리고 왜 비동기 뷰가 있으면 비동기 요청을 핸들링할 수 있는 미들웨어가 있어야 효율적으로 동작할까?
- monkey patching의 원리가 궁금하다.
- mock이랑 stup이 있다고 한다. stup은 뭘까
- pytest에서는 DRF의 authentication backend를 지나지 않는 걸까? 흐름이 궁금하다.
'개발 일기장 > SWM Onestep' 카테고리의 다른 글
20241017 TIL: React Native에서 애플 로그인 기능 개발하기 [진행중] (3) | 2024.10.17 |
---|---|
20241015 TIL: React Native에서 Django로 end-to-end test 작성하기 [진행중] (3) | 2024.10.15 |
20241012 TIL: pytest에서 특정 함수 우회하기 (1) | 2024.10.12 |
20241011 TIL: 개발서버 오류 수정하기 [보류] (2) | 2024.10.11 |
20241010 TIL: 다국어 처리 지원하기 [끝] (0) | 2024.10.09 |