오늘의 주제와 너무 잘어울리는 내 사랑 짤
두 번째 면접 당시, 나로 하여금 가장 큰 충격이었던,
뭔가 밥상 걷어 차버린 느낌이 들게 했던,
프로젝트 내에서 구현하였던 Kakao 소셜 로그인 API에 대하여
작성했던 test code를 설명하라는 면접 질문.
"본인이 작성하셨나요?"
"네 직접 작성하였습니다."
"설명해보시겠어요?"
"ㅏㅁ이러ㅏㅣㅇ;ㅓ 먼ㅇ;ㅣ럼ㄴ아ㅣ;어님;라ㅓㅇ마ㅓㄹ ㅏㅁ이너라ㅣㄴ어ㅣ라 죄송합니다."
"이렇게 이렇게 해서 이렇게 이렇게 값을 비교 하도록 짜신 거죠?"
"네 맞습니다"
그래서
망했어요 두 번째는
software testing 세션 다시 듣기였다.
(왜 다른 기수 세션이 더 재밌는것 같지. 기분탓인가)
이미 한차례 블로깅을 한 적이 있었는데,
이번엔 망했어요임
세션 내용 & unittest와 함께 했던 총 5개 썰 중 두 가지 썰로 구성
(아 이제 이거까지 육썰이구나 흫 ^^)
What is Software Testing?
코드를 작성하고 -> 기대하는 결과가 나옴 -> 호출을 해보거나 테스트 해봄 -> 성공 또는 실패 -> 수정
목적
Manual Testing
Automation Testing
<시스템 테스트 전략 3가지>
End to End(E2E) Tests
Integration Tests(통합테스트)
Unit Tests(단위테스트)
UnitTest 구조
(추가)Fixture
테스트를 위한 사전 준비 작업을 할 필요가 있다.
또한 테스트가 끝난 후 테스트를 하기 위해 만든 리소스들을 정리 해야 하는 경우도 있음
사전 준비 작업을 위해 setUp()
이라는 메서드를,
clean up 처리를 하기 위해 tearDown()
이라는 매서드를 제공
Client()
요청을 해주는 역할이 필요하고 응답을 받아줘야 하는 역할이 필요함 get
, post
, http method
들이 있다
client = Client()
response = client.get('/just')
# Client 클래스를 활용하기 위해 client 객체로 만듬
# '/just' endpoint로 get메소드로 요청하겠다
http처럼 내부적으로 view를 호출해주는 역할이 필요함
프론트 역할을 대신한다!
소셜 로그인 유닛테스트
@patch
requests를 사용하는 곳을 만나면 이걸로 대체 해라
mocking
요청한걸로 친다!
response = requests.get(self.user_url, headers = headers, timeout = 3)
view 안에서 request를 요청하는 곳에 도착을 하면,
호출했다고 치고, 그에 대한 응답(내가 정한, 원하는 값)을 response
에 넣는다
그러니까,
@patch("core.utils.KakaoAPI.requests")
requests
라이브러리를 쓰는 곳에다가 적용하겠다
특정 범위 내에서 mocking
patch
가 붙은 requests -> mocked_requests
로 들어옴
requests.get
처럼 mocked_requests.get
에 MagicMock
을 활용해서 return_value에 내가 미리 세팅해 놓은 MockedResponse
를 넣어줘라
라고 말을 못하니 왜 말을 못해
그도 그럴 것이
그 때도 어느 때인가 처럼 error를 만나 고생을 하고 있었고,
그 당시의 디버깅 쪼랩이었던(지금은 그냥 십랩(욕 아님)) 나로써는
해결하기 힘들었던 카카오에서 보내준 리스폰스 메세지를 그대로 가져오는 로직과 그 로직을 통과하는 유닛테스트를 SH
님도 시간을 엄청 쏟아주셔서 해결을 하고 있었다.
그리고 이미 블로깅은 한 적이 있.....지.....? 유닛테스트 썰
결론은 두 갈래로 나뉘어졌다
지금의 나는 아니 지금 알고 있는 TDD는 테스트코드를 먼저 작성하고 그것을 통과하는 코드를 짜는 것이고, 그만큼 피드백을 바로 적용하여 개발하는 방법으로써 이 사건을 반추 해본다면 1번 스승님 말이 답에 가깝지 않나...
인턴십을 하는 동안 unittest를 하기 위해 초반부터 애를 쓰고 있었다.
아니 중요하다길래. 아니 근데 당시의 프로젝트의 성격상
특히 RDS 에서 가져오는 데이터들을 테스트 하려면, 테스트 코드 내에 코드를 생성하고 티어다운 하는 과정 없이 하는 그런 뭐 코드가 있어서 그걸로 적용하려고 했지만(아니 그리고 아는 선생님이 아무도 없네?)
이건 나중나중 아주 나중에 또 써보기로!