PyConKR2020-DjangoORM
PyConKR2020-DjangoORM copied to clipboard
QuerySet 커버하는 테스트케이스
from django.test.utils import CaptureQueriesContext
from rest_framework.test import APIClient
# django 기본 프로젝트에서 벗어나는 pytest , drf 를 제가 사용해서 복붙으로 동작하는 테스트 케이스가 아니긴 하지만
# with CaptureQueriesContext(connection) as expected_num_queries: 이거 사용하는 느낌만 알면 될 것 같아서
# 추가 설명 첨부 안했습니다
def test_check_n_plus_1_problem():
from django.db import connection
# Given: 주문이 2개더 추가되기전 API에서 발생하는 SQL Count (expected_num_queries)
with CaptureQueriesContext(connection) as expected_num_queries:
APIClient().get(path="/restaurants/")
Order.objects.create(
total_price=9800,
comment="주문데이터가 N개 생성되었다고 SQL이 N개 더 생상되면 안된다1."
)
Order.objects.create(
total_price=8800,
comment="주문데이터가 N개 생성되었다고 SQL이 N개 더 생상되면 안된다2."
)
# When: 주문이 2개 더 추가된 이후 API에서 발생하는 SQL Count (checked_num_queries)
with CaptureQueriesContext(connection) as checked_num_queries:
APIClient().get(path="/restaurants/")
# Then: 주문이 2개더 추가된다고 동일 API에서 SQL이 추가발생하면 안된다.
assert len(checked_num_queries.captured_queries) == len(expected_num_queries.captured_queries)