[DRF] UnitTest

ooknimm·2020년 10월 13일
0

DRF

목록 보기
5/5
post-thumbnail

APIRequestFactory

django의 RequestFactory 클래스를 확장한 형태이다.
인스턴스를 생성한 후 http메소드를 통해 요청 객체를 생성한다.

from rest_framework.test import APIRequestFactory

factory = APIRequestFactory()
data = {'이름' : '둘리'}
request = factory.post('url경로', data=data)
--------------------------------
request.POST['이름']
>>>둘리

force_authenticate

인증이 필요한 요청일 때 강제로 자격을 부여하는 함수이다. 권한이 필요한 테스트일 때 사용하면 된다.

from rest_framework.test import force_authenticate

force_authenticate(request, user=None, token=None)

사용자, 토큰 둘 중 하나 혹은 둘 다를 설정해 해당 request를 인증한다.




APIClient

django의 Client 클래스를 확장한 형태이다.
인스턴스를 만들고 http메소드를 통해 api에 요청한다.
login 메소드와 credentials 메소드, force_authenticate 메소드가 있다.

from rest_framework.test import APIClient

client = APIClient()
data = {'이름' : '도우너'}
response = client.post('url경로', data=data, format='json')

format=json을 사용하면 json 객체가 아닌 데이터를 알아서 변환해준다. 대신 json 객체인 데이터는 에러가 발생한다. json 객체를 사용하려면 format이 아닌 content_type='application/json를 넣으면 된다.

response = client.post('url경로', data=json.dumps(data),
           content_type='application/json')

login

세션 인증(서버 기반)을 사용하는 API를 테스트할 때 적합하다.

from rest_framework.test import APIClient

client = APIClient()
client.login(username='도우너', password='깐따삐야')
client.logout()

credentials

OAuth2 인증, 토큰 인증(토큰 기반)을 사용하는 API를 테스트할 때 적합하다.

from rest_framework.test import APIClient

client = APIClient()
client.credentials(HTTP_AUTHORIZATION='Token종류 ' + token)

HTTP_AUTHORIZATION 헤더에 토큰을 지정해준다.
토큰은 JWT 등을 이용해서 만들 수 있다.

인증된 상태에서 파라미터 없는 credentials 메소드를 사용하면 토큰 인증을 해제할 수 있다.

client.credentials()

force_authenticate

인증이 필요한 요청일 때 강제로 자격을 부여하는 메소드이다. 권한이 필요한 테스트일 때 사용하면 된다.

client = APIClient()
client.force_authenticate(user=None, token=None)

사용자, 토큰 둘 중 하나 혹은 둘 다를 설정해 인증한다.




APITestCase

django의 TestCase 클래스가 확장된 형태이다.
클래스로 상속받아 사용한다.

from rest_framework.test import APITestCase

class MyTestCase(APITestCase):
    def test_smoke_test(self):
        data = {'이름' : '고길동'}
        response = self.client.post('url경로', data=data, format='json')

self.client.login

세션 인증(서버 기반)을 사용하는 API를 테스트할 때 적합하다.


self.client.login(username='도우너', password='깐따삐야')
self.client.logout()

self.client.credentails

OAuth2 인증, 토큰 인증(토큰 기반)을 사용하는 API를 테스트할 때 적합하다.


self.client.credentials(HTTP_AUTHORIZATION='Token종류 ' + token)



pytest 설정

pytest로 테스트를 진행하면 좀 더 편리하고 직관적인 테스트가 이뤄진다. 효율적으로 사용하기 위해선 pytest 설정이나 관련 라이브러리에 대한 설정이 필요하다.
django에서 pytest를 사용하기 위해선 pytestpytest-django가 설치되어야 한다.


pytest.ini

프로젝트 루트 디렉토리에 해당 파일을 생성하고 아래와 같이 작성한다.

[pytest]

python_files = test*
DJANGO_SETTINGS_MODULE = 장고세팅파일
addopts = --nomigrations --cov=. --cov-report=html

python_files = test* test로 시작하는 파일을 유닛테스트한다.

DJANGO_SETTINGS_MODULE 장고 설정 파일을 할당한다.

addopts 여러가지 옵션을 설정한다.

--nomigrations DB 생성을 하지 않는다.

--cov=. --cov-report=html pytest-cov에 관한 설정이다.


pytest shell script

pytest를 쉘 스크립트로 관리하면 편리하다.

#!/bin/sh

cd 프로젝트루트경로 && pytest -p no:warnings -svv 테스트파일

테스트를 실행하기 위해서는 파일이 위치한 디렉토리에서 ./파일로 쉘 스크립트 파일을 실행한다.




test 관련 툴

pytest-cov

코드 커버리지 툴이다. 테스트가 얼마나 진행되었는지 UI로 출력해 보여준다.

.coveragerc

.coveragerc 파일에 적용하지 않을 파일을 설정할 수 있다.

[run]
omit =
    */__init__.py,
    *manage.py,
    *settings*.py,
    *urls.py,
    *admin.py,
    *migrations/*,
    *wsgi.py,
    *conftest.py,
    *apps.py,
    *asgi.py,
    */extra*

ipdb

ipdb.sset_trace() 해당 지점에서 테스트 실행을 멈추고 대화형 쉘이 실행된다. 쉘을 통해 테스트 코드에 접근한다.

ipdbdjango-ipdb가 설치되어야 한다.


mixer

무작위 데이터로 모델의 인스턴스를 생성한다. 빠르고 간편하게 인스턴스를 생성하는 장점이 있다.

from mixer.backend.django import mixer

mixer.blend('앱.모델', **kwarg)

각 필드의 데이터 타입에 맞게 생성된다.
키워드 인자로 특정 필드값을 지정할 수 있다.




https://www.django-rest-framework.org/

https://www.youtube.com/watch?v=8acl5bOsaUg&ab_channel=JIHUNKIM

0개의 댓글