취업 공고를 찾아보면 테스트 코드를 써본 경험이 있는 사람, 테스트 기반 개발에 익숙한 사람... 과 같은 문구를 우대사항에 쉽게 찾아볼 수 있는데, 이것이 무엇인지 또 왜 중요한지 알아보면서 drf에서는 어떻게 쓰는지 간단히 정리하고자 한다.
우선 테스트 기반 개발(TDD)은 소프트웨어 개발 방법론 중 하나로, 코드 작성에 앞서 테스트 케이스를 먼저 작성하고 이를 통과하는 실제 코드를 구현하는 방식이다. TDD는 다음과 같은 과정을 거친다:
- 실패하는 테스트 작성: 새로운 기능이나 수정이 필요한 기능에 대해 실패하는 테스트 케이스를 작성한다. 이 단계에서는 아직 해당 기능을 구현하지 않았기 때문에 테스트는 실패할 것이다.
- 테스트 통과를 위한 코드 작성: 작성한 테스트가 통과할 수 있도록 최소한의 코드를 작성한다. 이때, 오직 테스트를 통과하기 위한 목적으로만 코드를 작성하며, 아직 코드의 최적화나 리팩토링은 고려하지 않는다.
- 코드 리팩토링: 작성한 코드를 최적화하고, 중복을 제거하며, 가독성을 높이는 등의 작업을 수행한다. 이 과정에서 기존 테스트 케이스를 활용하여 리팩토링 후에도 코드가 정상적으로 작동하는지 확인할 수 있다.
-> 특정 조건을 통과하기까지 테스트 코드를 작성할 것, 단 테스트 결과를 지침으로 삼는다.
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 |