웹프로그래밍/Django

[Django] ORM CookBook, ORM 코드를 테스트하는 방법

ssung.k 2020. 8. 28. 23:46

해당 포스팅은 Django ORM CookBook 을 공부하며 새로 알게된 사실이나 더 나아가 추가적으로 같이 알면 좋을 내용을 정리하고 있습니다.

 

 

1. 질의 횟수 확인

Django 단위 테스트 클래스에 assertNumQueries() 메서드를 사용하여 데이터베이스에 발생하는 질의 횟수를 검증할 수 있습니다.

def test_number_of_queries(self):
    User.objects.create(username='testuser1')
    # 위 ORM 명령으로 질의 횟수가 1 번 일어나야 한다.
    self.assertNumQueries(1)
    
    User.objects.filter(username='testuser').update(username='test1user')
    # 질의 횟수가 한 번 증가해야 한다.
    self.assertNumQueries(2)

 

2. 테스트 시 데이터베이스 재사용

Django에서는 아래와 같은 명령어로 테스트를 수행합니다.

python manage.py test

 

이 때 기본적으로는 본래의 데이터베이스에 영향을 미치지 않게 하기 위해 데이터베이스를 새로 생성하게 되는데 이 때 적지 않은 시간이 소요됩니다.

이 시간을 단축하기 위해서 테스트 시, 이전에 생성한 데이터베이스를 유지할 수 있습니다.

python manage.py test --keepdb

 

 

3. 모델 객체를 데이터베이스에서 다시 읽기

refresh_from_db() 메서드를 사용하여 데이터베이스에서 모델을 다시 읽어들일 수 있습니다.

값을 갱신하는 테스트를 작성할 때 유용한 기능입니다.

다음 예를 살펴보세요.

class TestORM(TestCase):
    def test_update_result(self):
        userobject = User.objects.create(username='testuser')
        User.objects.filter(username='testuser').update(username='test1user')
        # 이 때, userobject 인스턴스의 username은 'testuser' 입니다.
        # 그러나 데이터베이스에서는 'test1user'로 수정되었습니다.
        # 모델 인스턴스의 속성이 데이터베이스와 맞지 않으므로 다시 읽어들입니다.
        userobject.refresh_from_db()
        self.assertEqual(userobject.username, 'test1user')