TIL

[삽질 기록] Unit test 자동화하기 step1

비아 VIA 2021. 8. 27. 17:03

작은 규모의 회사이다보니 아직 unit test가 없다.

규모가 더 커지기 전에 만들기 시작하는게 좋은 것 같다는 의견은 항상 있었지만

막상 우선 순위가 있는 task들을 하다보면 unit test를 만들기가 쉽지 않았다.

큰 규모의 업데이트가 끝나고 각자 해보고 싶은 프로젝트에 대한 이야기를 나눴는데

나는 아무래도 해본 적이 없었던걸 배워보고 싶어서 Unit test라고 말했다.(막상 해보니 넘나 어려운 것...또르르...)

테스트 코드를 작성해본 경험이 없고

몇달 전 사수분이 이직하셔서 회사에 백엔드가 나밖에 없는 상황에서

조언을 구할 곳이 많이 없는 점이 어려웠다.

그래도 다행히 이직한 사수분이 일주일에 한번씩 멘토링을 해주셔서 궁금한 점들을 여쭤볼 수 있었다.

 

FYI. Django, python, rest framework의 test를 활용했다

 

목표: Unit test 코드 작성

기간: ?

 한번도 해본 적이 없던 일이다보니 목표 기간을 정하기가 쉽지 않았다.

우선 한 프로젝트를 세분화 해서 기존 코드에서는 account 관련 url들 먼저 작성해보고

만약 앞으로 새로운 view를 작성하게 된다면  unit test코드를 함께 작성하기로 했다.

 

세분화된 목표: account 폴더 안에 있는 코드들을 위한 unit test 작성

기간: 우선 2주(다른 task들도 함께 하지만 unit test의 우선 순위를 조금 더 높게 잡았다)

 

궁금했던 점 1.

처음에 헷갈렸던 점은 unit test 의 범위다.

test에는 unit test, integration test, functional test가 있는데 정의를 살펴보기 위해 아래의 글을 참고했다.

https://www.softwaretestinghelp.com/the-difference-between-unit-integration-and-functional-testing/

 

궁금했던 점 2.

dependency는 어떻게 해소해야 하나?

예를 들어 current-user를 불러오는 view는 로그인을 해야 제대로 불러와지고

로그인을 안한 상태면 401(Auth error)이 뜬다.

그러면 APIClient().get(url) 의 값이 401일텐데 이렇게 하는게 맞는건가?

더 찾아보니(위의 링크에  있는 글에서도 나온다)

Unit test means testing individual modules of an application in isolation (without any interaction with dependencies)

-> Unit test에서는 각각의 모듈을 독립적으로(의존성 없이) test해야 하는 거였다.

 

이직하신 사수분과 이야기를 해보다가

우선 end point의 response 부분만 테스트 하는 것을 자동화 해보고 

그 이후에 차근차근 build up 해보는건 어떻겠냐는 제안을 해주셨다.

view 하나하나마다 test 클래스를 만드는게 막막했는데

우선 자동화 해두면 편할 것 같고 다른 프로젝트에도 사용할 수 있을 것 같아서

그렇게 해보기로 했다.

 

새로운 목표: 프로젝트 전체의 end point의 response를 테스트를 자동화 하기.

예를 들어 

urlpatterns = [
	path('crrent-user/', general.current_user_view),
    path('languages/', general.language_view),
  ]

이런식의 url들이 있다면

1. 새로운 test file을 만들고

2. response를 받아오는 test class를 만드는 것까지만 우선 자동화하는 것이다.

class TestCurrentUserView(APITestCase):
 	print("CurrentUserView")
    url = "/current-user/"
 	get_response = APIClient().get(url)
 	patch_response = APIClient().patch(url)

    def test_status_code(self):
        self.assertEqual(self.get_response.status_code, 401)
        self.assertEqual(self.patch_response.status_code, 401)

코드블럭 안에 인덴트가 안맞는게 매우 거슬리지만ㅠㅠ

우선 위와 같은 결과를 목표로 했다.

글이 너무 길어지는 것 같아서 이후의 이야기는 다음편에 이어서 작성해야겠다.

'TIL' 카테고리의 다른 글

도커 레지스트리  (0) 2021.09.06
Week3 도커 이미지  (0) 2021.09.03
week2 도커엔진  (0) 2021.08.19
도커 기초 week 1  (0) 2021.08.11
Django model on_delete  (0) 2021.04.22