Django - testing API

메린·2024년 2월 28일

DRF를 이용해서 API를 만들었다면 테스트 과정이 필수적이다.

해당 강의 이전에는 수동으로 데이터를 전송해서 POST, DELETE, PUT, GET 메소드가 정상적으로 실행되는지 확인했다.
이렇게 하면 몇 테스트는 하지 않는 실수가 발생할 수 있다. 때문에 django를 이용해 test를 해야 안전하다.

How To Use

각 앱마다 tests.py 파일을 만들어 안에 작성했다.

Import

from rest_framework.test import APITestCase

모든 테스트 클래스는 APITestCase의 확장이다.

Rules

django에서 하나의 명령어로 자동 테스트를 진행하기 위해서는 APITestCase Class의 method명명 규칙을 숙지해야 한다.

  • 테스트 코드는 test_ 로 시작하는 메소드 안에 작성되어야 한다.
  • self 파라미터에는 여러 assert 기능이 들어가 있다.

Run

python manage.py test

example

class TestCalculation(APITestCase):
    def test_two_plus_two(self):
        self.assertEqual(2+2, 5, "wrong")
  • assertEqual은 1, 2번째 파라미터가 같은지 확인한다. 같다면 터미널에 OK를 반환하고, 틀리다면 어디에서 왜 틀렸는지 아래와 같이 알려준다.

self.client

self.client는 API로 get / put / post / delete request를 보낼 수 있게 도와준다.

example

class TestGet(APITestCase):
	def test_get(self):
    	response = self.client.get("get요청을 보낼 path")
        print(response.json())

response.json()을 출력해보면 empty list가 반환될 것이다.

  • 즉, test는 실제 DB에서 테스트하지 않기 때문에 테스트 데이터베이스에서 생성해서 확인한다.
  • 현재 아무 데이터도 생성하지 않았기에 empty list가 반환된 것이다.

setUp(self)

setUp메소드는 다른 test들이 실행되기 전에 실행된다. 여기서 테스트 데이터를 생성하는 작업 등을 하면 된다.

example

from rest_framework import APITestCase
from . import models

class TestClass(APITestCase):
	def setUp(self):
    	models.ModelName.objects.create(
        	name="testName"
            description="testDesc"
        )
    def test_setup(self):
    	response = self.client.get("해당path")
        print(response.json())

출력해보면 setUp에서 만든 데이터가 반환될 것이다.


테스트의 목적은 잘 작동하는지, 잘못된 경우 제대로 오류가 표시되는지 확인하는 것이기에 의도적으로 잘못된 데이터를 전송해서도 테스트를 해야 한다.

docs
https://docs.djangoproject.com/en/5.0/topics/testing/overview/

0개의 댓글