Python/Advanced

[Pytest] 4. Pytest with Django (Feat. pytest-Django)

yubi5050 2022. 11. 6. 05:11

pytest-django 설치

Django 프레임워크에서 Pytest를 진행 하기 위해선 pytest-django 패키지 설치가 필요하다.

 

$ pip install pytest-django

https://pytest-django.readthedocs.io/en/latest/

 

pytest-django Documentation — pytest-django documentation

© Copyright 2022, Andreas Pelme and contributors. Revision 1f3708ab.

pytest-django.readthedocs.io

 

django 셋팅

1. Django 프로젝트 생성

2. Django APP 생성

3. Settings.py에 DB 정보 및 APP 등록 (만약에 DOT_ENV를 사용하여 환경변수를 Load 하는 경우 다음과 같이 Flag 작성하여 구분 가능

IS_TESTING_MODE = True

if IS_TESTING_MODE:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': '<YOUR DB SCHEMA>', # Schema Name
            'USER': 'postgres', 
            'PASSWORD': '<YOUR PASSWORD>', # PASSWORD
            'HOST': '127.0.0.1', 
            'PORT': '5432', 
        }
    }
# NOT TESTING MODE
else:
    DATABASES = {
        'default': {
            'ENGINE': os.environ.get("DB_ENGINE"),
            'NAME': os.environ.get("DB_NAME"), # Schema Name
            'USER': os.environ.get("DB_USER"),
            'PASSWORD': os.environ.get("DB_PASSWORD"), # PASSWORD
            'HOST':os.environ.get("DB_HOST"),
            'PORT':os.environ.get("DB_PORT"),
        }
    }

4. Pytest.ini 작성

[pytest]
DJANGO_SETTINGS_MODULE = LookupService.settings
python_files = tests.py test_*.py *_tests.py

 

5. TEST CODE 작성

import pytest
from sharedb.models import Category

@pytest.fixture
def create_Categories():
    Category.objects.bulk_create([
    	# Category Table Field : (id, name, image:path임)
        Category(1, 'coffee', '<your img path>'),
        Category(2, 'meat', '<your img path>'),
    ])

# 결함 TEST
# 1. Category 값 중 누락된건 없는지
# - 모든 Rows에 name과 image값이 다 있는지
@pytest.mark.django_db
def test_CategoryRowsValidation(create_Categories):
    queryset = list(Category.objects.all())
    assert len(queryset)==2, "Num of Category Rows is Failed"
    assert all([obj.name for obj in queryset if obj.name is not None]) # 모두 True면 통과
    assert all([obj.image for obj in queryset if obj.image is not None]) # 모두 True면 통과

 

fixture와 @pytest.mark.django_db 사용 없이 (pytest에서 제공하는 db 인자 적어도 가능

def test_CategoryRowsValidation(db):
    queryset = list(Category.objects.all())
    assert len(queryset)==2, "Num of Category Rows is Failed"
    assert all([obj.name for obj in queryset if obj.name is not None]) # 모두 True면 통과
    assert all([obj.image for obj in queryset if obj.image is not None]) # 모두 True면 통과

 

bulk_create 대신 아래와 같이 params를 이용해서도 가능

import pytest
from sharedb.models import Category

@pytest.fixture(params=("abd", "efgh", "klji"))
def create_Categories(db, request):
	# Category Table Field : (id, name)
    return Product.objects.create(name=request.param)

 

 

6. Pytest Command 실행

$ pytest -rA # 모든 TEST Case 결과 출력

 

결과 화면