SQL Server 사용하여 Django 앱 테스트

이 문서에서는 mssql-django 백엔드를 사용하여 Django의 테스트 프레임워크가 SQL Server 데이터베이스와 함께 작동하도록 구성하는 방법을 설명합니다.

Django 테스트가 SQL Server 작동하는 방식

실행할 python manage.py test때 Django는 별도의 테스트 데이터베이스를 만들고 모든 테스트를 실행한 다음 테스트 데이터베이스를 삭제합니다. 테스트 데이터베이스 이름의 기본값은 test_ 다음에 구성한 데이터베이스 이름이 오는 형태입니다.

테스트 데이터베이스 설정 구성

데이터베이스 구성의 사전을 TEST 사용하여 테스트 데이터베이스를 사용자 지정합니다.

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<your-database>",
        "USER": "<your-username>",
        "PASSWORD": "<your-password>",
        "HOST": "<your-server>",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
        },
        "TEST": {
            "NAME": "test_mydb",
            "COLLATION": "SQL_Latin1_General_CP1_CI_AS",
        },
    },
}

테스트 설정

설정 설명
NAME 테스트 데이터베이스의 이름입니다. 기본값: "test_" + NAME.
COLLATION 테스트 데이터베이스에 대한 데이터 정렬입니다. 기본값: 인스턴스 기본 데이터 정렬입니다.
DEPENDENCIES 여러 데이터베이스를 사용하는 경우 생성 순서 종속성입니다.
MIRROR 이 테스트 데이터베이스가 미러링해야 하는 데이터베이스의 별칭입니다.

테스트 실행

전체 테스트 도구 모음을 실행합니다.

python manage.py test

특정 앱에 대한 테스트를 실행합니다.

python manage.py test myapp

특정 테스트 클래스 또는 메서드를 실행합니다.

python manage.py test myapp.tests.ProductTestCase.test_create_product

테스트 데이터베이스 유지

테스트 실행 간에 테스트 데이터베이스를 유지하는 데 사용합니다 --keepdb . 이 방법은 데이터베이스 만들기 및 소멸을 건너뛰어 반복 테스트 실행 속도를 향상합니다.

python manage.py test --keepdb

메모

테스트 실행기는 해당 --keepdb 인증 방법으로 데이터베이스를 만들 수 없으므로 관리 ID 인증(ActiveDirectoryMsi)을 사용할 때 플래그가 필요합니다.

테스트에서 트랜잭션 격리

Django의 TestCase 클래스는 각 테스트를 트랜잭션으로 감싸고 테스트가 완료되면 해당 트랜잭션을 롤백합니다. 이 동작은 각 테스트에 대한 테이블을 만들고 삭제하지 않고 테스트 격리를 제공합니다.

트랜잭션을 커밋해야 하는 테스트(예: 트랜잭션 관련 동작 테스트)의 경우 다음을 사용합니다 TransactionTestCase.

from django.test import TransactionTestCase
from myapp.models import Product

class ProductTransactionTest(TransactionTestCase):
    def test_atomic_operation(self):
        # This test commits to the database
        Product.objects.create(name="Widget", price=9.99)
        self.assertEqual(Product.objects.count(), 1)

Tip

가능하면 TransactionTestCase이 아니라 TestCase를 사용하십시오. TestCase 는 테이블을 잘라내는 대신 트랜잭션 롤백을 사용하기 때문에 더 빠릅니다.

여러 데이터베이스로 테스트

프로젝트에서 여러 데이터베이스를 사용하는 경우 테스트 종속성을 구성합니다.

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<primary-database>",
        "USER": "<your-username>",
        "PASSWORD": "<your-password>",
        "HOST": "<your-server>",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
        },
        "TEST": {
            "NAME": "test_primary",
        },
    },
    "reporting": {
        "ENGINE": "mssql",
        "NAME": "<reporting-database>",
        "USER": "<your-username>",
        "PASSWORD": "<your-password>",
        "HOST": "<your-server>",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
        },
        "TEST": {
            "NAME": "test_reporting",
            "DEPENDENCIES": ["default"],
        },
    },
}