APITestCase를 활용한 API 테스트 실무 패턴
DRF APITestCase를 활용하여 성공/실패 케이스를 포함한 견고한 API 테스트 작성 방법
API 테스트의 중요성
안정성 확보: 새로운 기능 추가나 리팩토링 시 기존 API의 회귀 테스트 보장
명확한 문서: 테스트 코드 자체가 API 동작 방식과 요구사항을 설명하는 문서 역할
자신감 있는 배포: 탄탄한 테스트 스위트로 변경 사항 배포 시 심리적 안정감 제공
협업 효율 증대: 동료 개발자의 API 세부 동작 파악과 변경 영향 예측 지원
AAA 패턴 (Arrange-Act-Assert)
Arrange (준비): 테스트에 필요한 사전 조건 설정 (유저 생성, 테스트 데이터 저장)
Act (실행): 테스트할 코드 실행 (API 엔드포인트에 HTTP 요청)
Assert (검증): 실행 결과와 예상 결과 일치 확인 (상태 코드, 응답 데이터, DB 변경사항)
기본 설정 및 setUp
class PostAPITestCase(APITestCase):
def setUp(self):
# 유저 생성
self.user = User.objects.create_user(username='testuser', password='password123')
# 테스트용 게시글 생성
self.post = Post.objects.create(author=self.user, title='Test Title', content='Test Content')
# URL patterns (reverse 활용)
self.post_list_url = reverse('post-list')
self.post_detail_url = reverse('post-detail', kwargs={'pk': self.post.pk})
# 클라이언트 인증
self.client.force_authenticate(user=self.user)생성(Create) API 테스트
성공 케이스: 올바른 데이터 전송 시 201 CREATED 상태 코드와 생성된 데이터 반환, DB 저장 확인
실패 케이스 (유효성): 필수 필드 누락이나 잘못된 형식 데이터 시 400 BAD REQUEST와 명확한 에러 메시지 반환
실패 케이스 (인증/권한): 비로그인 사용자나 권한 없는 사용자 요청 차단
조회(Read) API 테스트
목록 조회: 200 OK 응답, 리스트 형태 데이터, 페이지네이션 키 존재 확인
상세 조회: 존재하는 pk로 요청 시 200 OK와 객체 데이터 반환, 존재하지 않는 pk로 요청 시 404 NOT FOUND 에러 반환
수정(Update) API 테스트
성공 케이스 (PATCH): 올바른 데이터로 요청 시 200 OK와 수정된 내용 반환, DB의 실제 데이터 변경 확인
실패 케이스 (권한): 다른 유저의 게시글 수정 시도 시 403 FORBIDDEN 에러 반환
삭제(Delete) API 테스트
성공 케이스: 삭제 요청 후 204 NO CONTENT 상태 코드 반환, DB에서 실제 데이터 삭제 확인
실패 케이스 (권한): 다른 유저의 게시글 삭제 시도 시 403 FORBIDDEN 에러 반환
실무 핵심 팁
URL 네이밍: reverse() 사용으로 URL 변경에 유연한 대처
테스트 독립성: 각 테스트는 서로 영향을 주지 않도록 설계
명확한 네이밍: test_기능_시나리오_결과 형식으로 테스트 메서드명 작성
구체적인 단언: status 모듈 사용과 에러 메시지 내용까지 구체적 검증
최소 테스트: 성공 케이스 하나, 대표적인 실패 케이스 하나씩 필수 작성
Last updated
