몰입공간

[Django] pytest로 django view 테스트 하기(Test and debugging django view with pytest in vscode) 본문

Programming/Django

[Django] pytest로 django view 테스트 하기(Test and debugging django view with pytest in vscode)

sahayana 2022. 2. 18. 14:44


#1. TDD

 

좀 더 심화된 장고의 REST api를 공부하다보니, 개발 실무에 많이 쓰인다는 TDD(Test Driven Development)
살짝 경험해봤습니다.

TDD(Test Driven Development), 즉 테스트 주도 개발을 의미합니다.

TDD는 보통 대규모 프로젝트나 서비스를 제공하는 비즈니스 실무에서 필수로 가져가야할 개발 방식입니다.

 

만약 대규모 프로젝트를 구현하는 와중에 오류가 발생한다면 방대한 양의 코드와 모듈, 함수간의 호환성 등을
모두 염두해 두고 고통의 디버깅을 해야합니다.
오류가 발생할 때마다 많은 시간과 수고를 필수적으로 수반해야하죠.

(물론 서비스 단위로 앱을 구성하다보니 디버깅 할 때 모든 부분을 봐야하는 것은 아니지만, 그래도 치명적임에는 틀림없습니다.)

 

TDD는 이러한 최소 단위의 기능 구현과  오류 해결에 극강의 효율성을 부여하기위해 탄생하였습니다.

TDD는 대게 실패하는 test_view -> 기능 view -> 리팩토링의 과정으로 진행합니다.

즉, 실패하는 테스트를 미리 짜놓고 그 테스트가 성공할때까지 기능 view를 채우거나 수정합니다.

자세한 방법은 이 내용을 참고하는게 좋습니다.

 


#2. Pytest와 pytest-django

 

 

Pytest는 python 전용 test 툴입니다.
unittest라는 내장 테스트 모듈이 있지만, pytest는 unittest를 포함하는 것 외에 다양한 옵션을 제공합니다.

 

pytest-django는 django application test를 위한 pytest 플러그인 입니다.

django projects 위에서 흩어진 여러 테스트 케이스들을 쉽게 찾아 실행해주는 플러그인입니다.

 

pip으로도 설치가 가능하나, 현재 poetry를 기반으로 실습을 진행중이라 다음과 같이 설치가 가능합니다.

poetry add pytest pytest-django

 

이후 manage.py가 있는 root 디렉토리에 pytest.ini 파일을 생성 후 다음과 같이 정의합니다.

[pytest]
DJANGO_SETTINGS_MODULE = config.settings  # settings의 모듈과 동일 <project_name>.settings
python_files = tests.py test_*.py *_tests.py

 


#3. Pytest in VScode

 

 

파이참의 경우 파이썬 전용 에디터이다보니 파이썬과 관련된 여러 패키지의 configuration의 설정을
에디터 자체에서 제공하는 경우가 많습니다.

Django의 경우도 파이참 자체에서  테스트설정을 포함한 여러 설정들을 서포트 합니다.

 

그러나 VScode의 경우 설정에서 직접 test 모듈을 지정해야 합니다.
Preference -> settings에서 pytest를 검색하고 enable에 체크합니다.

 


#4.  실습

 

먼저 간단한 기능을 작성합니다.
단순히 HttpResponse로 "Hello, World!"를 노출합니다.

위에서 서술한 TDD 방식을 따르기 위해 일단 pass 합니다.

# config/views.py
from django.http import HttpResponse


def hello(request):
    pass

 

# config/urls.py
from config import views
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/', views.hello, name='hello'),
]

 

 

이후 test_views.py 파이썬 파일을 생성하고 TestView를 작성합니다.
pytest에 test를 위한 파이썬 파일을 설정했기 때문에 어느 폴더든 알아서 테스트 파일들을 끌고 옵니다.

 

# test_views.py
from django.test import TestCase

class TestView(TestCase):
    def test_hello_view(self):
        # When
        client = self.client.get("/hello/")
        
        # Then        
        self.assertEqual(200, client.status_code)        
        self.assertEqual(b'Hello, World!', client.content)

GET 방식으로 "/hello/" url을 가져오면:

 

1. OK를 뜻하는 http status code 200이 나와야 합니다.

2. bytesrting으로 표현된 HttpResponse의 content는 "Hello, World!" 입니다.

 

먼저 테스트를 돌려보면 당연히 실패합니다.

$ pytest

이런식으로 로그를 터미널에 노출하거나,

 

하얀 펜으로 체크한 부분을 클릭하여 test/debug가 가능합니다.

 

 

이제 테스트가 통과하도록 hello view에 내용을 채우거나 수정하는 리팩토링 과정을 거칩니다.

# config/views.py
from django.http import HttpResponse

def hello(request):    
    return HttpResponse("Hello, World!")

다시 테스트를 돌려보면,

성공합니다.

 

이런식으로 기능 구현에 오류 발생이 가능한 예외들을 미리 상정하고, 미리 테스트를 거쳐 기능을 구현하는 TDD방식이 자원관리와 효율성 면에서 굉장히 강력한 도구임을 알 수 있습니다.


#4.  출처

 

- 장고공식문서 Testing tools (https://docs.djangoproject.com/en/4.0/topics/testing/tools/)

- Pytest-django 공식문서 (https://pytest-django.readthedocs.io/en/latest/)

- TDD의 소개 (https://velog.io/@velopert/TDD%EC%9D%98-%EC%86%8C%EA%B0%9C)

Comments