쉽게 쉽게 생각해, 깊게 깊겐 피곤해
[ Clover, "An Oppa I Know" ]
드높게 늘어선 빌딩숲 사이로 다시금 눈꽃이 흩날렸다. 서울와서 벌써 두번째 눈이다. 부산에선 몇 년에 한번도 보기 힘든 눈이지만, 지금은 반가워할 겨를이 없는게 문제다. 협업 3주차, 평일로만 따진다면 출근일이 6일밖에 안남았다. 한달동안 DRF에 대해서 확실하게 기초 개념을 잡을 수 있겠지라고 생각했던게 2주전이란 뜻인데... 이쯤에서 스멀스멀 피어오르는 자기비판을 억누르며 출근길에 올랐다.
RoadPic. 현재 우리가 개발중이고 베타버전으로 배포중인 앱 이름이다(앱 이름 정도는 홍보차원에서 말해도 괜찮지 않을까). 오후에는 이 앱에 대해서 전체 회의가 있었는데, 영업팀에서 보내준 피드백 자료도 같이 보면서 자유롭게 의견을 나눴다. 직원분들이 착하셔서 그런건지 진짜 의미가 있는 의견이었는지는 모르지만, 우리들이 낸 의견도 잘 경청해주시고 좋은 의견이다라거나 전에 한번 나왔다가 보류중인 건이다 라는 식으로 적극 소통해주셨다. 마치 1, 2차 프로젝트 때처럼 편안한 분위기에서 자유롭게 의견을 주고받는게 신기하면서도 상당히 재밌는 시간이었다.
Figma 라는 그래픽툴로 여러가지 형태의 레이아웃과 추가될 기능들의 위치를 대략적으로 잡은 뒤 회의내용을 요약한 후 2시간에 걸친 회의는 끝이 났다. 회의가 있기전까지 프론트와 통신을 하면서 postman으로 필요한 키 값들을 정리한 API문서를 각자 만들고 통합했다. 그리고 어제부터 매달린 Test Code 짜기에 남은 시간을 모두 투자했는데, 도무지 진전이 없었다. 사수님도 여기서 Test Code를 만들어 본 적이 없으셨고, 레거시 코드마저도 없는 상황이라 꽤나 막막했다. 하루 종일 구글을 헤엄쳐다니고, 여러 깃헙들을 파고들었지만 어제보다 코드가 나아지질 않았다. 그래서 사수님과 긴급회의를 한 결과, 위코드데이인 내일까지 한번 연구해보고 정 안된다면 다른 기능을 해보는 걸로 하자고 결론을 내렸다.
아래는 온라인강의를 들으면서 참고한 Testcode 이다. DRF에서 제공하는 APITestCase를 사용했고, Factoryboy 나 Faker, Baker와 같은 라이브러리는 사용하지 않았다. 특이한 점으로는 'token'을 위한 fake model을 만든 것인데, 아직 'auth.user' 와 'auth.token'의 개념이나 사용법을 정확히 몰라서 완전히 이해하지는 못했다. 또한 settings.py
에 'rest_framework.authtoken'
,을 INSTALLED_APPS
에 추가해 줘야한다. 참고한 StackOverflow 에서는 migration도 해야한다고 했지만, 안해도 딱히 상관은 없었다.
models.py
from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
Token.objects.create(user=instance)
Tests.py
class StreamPlatformTestCase(APITestCase):
def setUp(self):
self.user = User.objects.create_user(username="example", password="Password@123")
self.token = Token.objects.get(user__username=self.user)
self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.token.key)
self.stream = models.StreamPlatform.objects.create(name="Netflix",
about="#1 Platform", website="https://www.netflix.com")
def test_streamplatform_create(self):
data = {
"name": "Netflix",
"about": "#1 Streaming Platform",
"website": "https://netflix.com"
}
response = self.client.post(reverse('streamplatform-list'), data)
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
def test_streamplatform_list(self):
response = self.client.get(reverse('streamplatform-list'))
self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_streamplatform_ind(self):
response = self.client.get(reverse('streamplatform-detail', args=(self.stream.id,)))
self.assertEqual(response.status_code, status.HTTP_200_OK)
아래는 어제와 같은 실패한 테스트 코드이다.
def test_school_create(self):
data = {
'school_name' : '서울대',
'address' : '서울시 강남구',
'description' : '서울대입구 역에서 3Km'
}
response = self.client.post(reverse('institution/school'), data)
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
APITestCase를 사용할 때 APIRequestFactory 를 사용하는 방법도 있어서 한참 RequestFactory에 대해 찾아보다가 회의에 들어가게 되어서 마무리는 짓지 못했다. 게다가 reverse
메소드에서 발목이 단단히 잡혔는데, 우선 이 메소드의 역할과 기본 형태에 대해서부터 알아봐야 할 것 같다. 참고하고 있는 사이트 몇 가지를 남긴다. 내일의 나는 좀 더 낫기를.
APITestCase 에서 API 를 요청하는 두가지 방법
endcode github: DRF의 각종 기능별 예제 코드가 많은 곳
APIRequestFactory 사용 예제 github
우리 사이는 특별해, 스타들보다 스페셜해
[ 클로버, "An Oppa I Know" ]