PyConKR2020-DjangoORM icon indicating copy to clipboard operation
PyConKR2020-DjangoORM copied to clipboard

QuerySet 커버하는 테스트케이스

Open KimSoungRyoul opened this issue 5 years ago • 0 comments


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)


KimSoungRyoul avatar Sep 19 '20 05:09 KimSoungRyoul