취업 공고를 찾아보면 테스트 코드를 써본 경험이 있는 사람, 테스트 기반 개발에 익숙한 사람... 과 같은 문구를 우대사항에 쉽게 찾아볼 수 있는데, 이것이 무엇인지 또 왜 중요한지 알아보면서 drf에서는 어떻게 쓰는지 간단히 정리하고자 한다.

 

우선 테스트 기반 개발(TDD)은 소프트웨어 개발 방법론 중 하나로, 코드 작성에 앞서 테스트 케이스를 먼저 작성하고 이를 통과하는 실제 코드를 구현하는 방식이다. TDD는 다음과 같은 과정을 거친다:

  1. 실패하는 테스트 작성: 새로운 기능이나 수정이 필요한 기능에 대해 실패하는 테스트 케이스를 작성한다. 이 단계에서는 아직 해당 기능을 구현하지 않았기 때문에 테스트는 실패할 것이다.
  2. 테스트 통과를 위한 코드 작성: 작성한 테스트가 통과할 수 있도록 최소한의 코드를 작성한다. 이때, 오직 테스트를 통과하기 위한 목적으로만 코드를 작성하며, 아직 코드의 최적화나 리팩토링은 고려하지 않는다.
  3. 코드 리팩토링: 작성한 코드를 최적화하고, 중복을 제거하며, 가독성을 높이는 등의 작업을 수행한다. 이 과정에서 기존 테스트 케이스를 활용하여 리팩토링 후에도 코드가 정상적으로 작동하는지 확인할 수 있다.

 

-> 특정 조건을 통과하기까지 테스트 코드를 작성할 것, 단 테스트 결과를 지침으로 삼는다.

 

TDD의 장점은 다음과 같다:

  • 코드의 신뢰성 향상: 테스트 케이스를 먼저 작성하고 코드를 작성함으로써, 코드의 동작을 보다 정확하게 검증할 수 있다.
  • 코드 유지 관리 개선: 코드 변경 시 테스트 케이스를 통해 기존 기능이 여전히 정상적으로 작동하는지 확인할 수 있다. 이를 통해 리팩토링이나 기능 추가에 따른 사이드 이펙트를 최소화할 수 있다.
  • 개발 생산성 향상: TDD를 통해 개발자는 문제를 빠르게 인지하고 해결할 수 있다. 또한, 테스트 케이스를 통해 개발 과정에서 생길 수 있는 예상치 못한 문제를 사전에 찾아낼 수 있다.

 

-> 결국에는 디버깅과 테스트를 할거라면 테스트를 하면서, 그 결과물을 중점으로 개발하는게 맞잖아?

즉 머리로만 짜는 것은 한계가 있으니 코드를 짜고 테스트를 진행하는게 아닌 테스트를 진행하고 코드를 거기에 맞추자... 라고 나는 이해했다.

 

DRF에서 테스트를 진행하기 위해서는 아래와 같은 메서드,클래스들을 이용한다.

 

from rest_framework.test import APITestCase
from rest_framework import status
from django.urls import reverse
from faker import Faker
from myapp.models import MyModel

class MyModelAPITestCase(APITestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        cls.fake = Faker()
        cls.my_model = MyModel.objects.create(
            name=cls.fake.name(),
            email=cls.fake.email(),
        )

    def test_get_my_model_list(self):
        url = reverse('my_model_list')
        response = self.client.get(url)

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data), 1)
        self.assertEqual(response.data[0]['name'], self.my_model.name)


    - `APITestCase`: DRF 테스트를 작성할 때 사용하는 기본 클래스. Django의 `TestCase` 클래스를 상속하며, DRF에 특화된 기능들을 추가로 제공한다.
    - `setUp`: 테스트 케이스별 초기화 작업을 수행하는 메서드. 각 테스트 메서드가 실행되기 전에 호출된다.
    - `tearDown`: 테스트 케이스별 정리 작업을 수행하는 메서드. 각 테스트 메서드가 종료된 후에 호출된다.

 

@classmethod는 파이썬의 데코레이터 중 하나로, 메서드를 클래스 메서드로 변환한다. 클래스 메서드는 인스턴스 메서드와 달리 인스턴스 객체가 아닌 클래스를 첫 번째 인자로 받는다. 보통 첫 번째 인자의 이름은 관례적으로 cls로 지정한다.
클래스 메서드는 인스턴스 생성 없이 클래스에 대한 작업을 수행할 때 유용하며, 인스턴스의 상태에 영향을 주지 않는 작업을 할 때 사용된다.

    - `setUpClass`: 클래스 레벨의 초기화 작업을 수행하는 메서드로, 해당 테스트 클래스의 모든 테스트 케이스가 실행되기 전에 한 번만 호출된다.
    - `tearDownClass`: 클래스 레벨의 정리 작업을 수행하는 메서드로, 해당 테스트 클래스의 모든 테스트 케이스가 종료된 후에 한 번만 호출된다.

테스트 데이터 생성:
    - `Faker`: 가짜 데이터를 생성하는 데 사용되는 Python 라이브러리이다. 테스트에서 다양한 시나리오와 임의의 데이터를 쉽게 생성할 수 있다.

 

참고한 내용

https://hudi.blog/test-driven-development/

 

TDD (테스트 주도 개발) 에 대하여

서론 우아한테크코스를 시작하기 전에는 TDD가 좋다고 어디서 한번 들어본 정도였지, 그 전에는 테스트 코드 한줄 작성해본 적 없었다. 우아한테크코스에서는 첫번째 미션부터 TDD로 진행할 정도

hudi.blog

 

'Python > Django' 카테고리의 다른 글

DRF serializer 추가) nested field, method field  (0) 2023.04.24
DRF : ModelViewSet  (0) 2023.04.23
DRF : Serializer  (0) 2023.04.23
django : generic view  (0) 2023.04.17
django : Signal  (0) 2023.04.17
복사했습니다!