programing

어떻게 장고의 테스트 데이터베이스를 메모리에서만 실행할 수 있습니까?

procenter 2022. 9. 21. 22:33
반응형

어떻게 장고의 테스트 데이터베이스를 메모리에서만 실행할 수 있습니까?

장고 유닛 테스트는 시간이 오래 걸리기 때문에 속도를 높일 수 있는 방법을 찾고 있습니다.SSD를 장착하려고 생각하고 있습니다만, 그것에도 단점이 있는 것은 알고 있습니다.물론 제 코드로 할 수 있는 일이 있긴 하지만 구조적인 해결책을 찾고 있습니다.매번 데이터베이스를 재구축하거나 남쪽으로 이행해야 하기 때문에 단일 테스트 실행 시에도 시간이 걸립니다.제 생각은 이렇습니다

테스트 데이터베이스는 항상 매우 작기 때문에 테스트 데이터베이스 전체를 항상 RAM에 보관하도록 시스템을 구성할 수 없습니다.디스크를 절대 만지지 마십시오.장고에서는 어떻게 설정합니까?MySQL을 계속 사용하고 싶습니다.MySQL은 프로덕션에서 사용하는 것이기 때문에 SQLite 3 또는 다른 것으로 쉽게 사용할 수 있다면 그렇게 하겠습니다.

SQLite 또는 MySQL에는 메모리만으로 실행할 수 있는 옵션이 있습니까?RAM 디스크를 구성하고 테스트 데이터베이스를 구성하여 데이터를 저장할 수 있지만, Django/MySQL이 특정 데이터베이스에 대해 다른 데이터 디렉토리를 사용하도록 어떻게 지시해야 할지 모르겠습니다. 특히 매번 실행이 지워지고 다시 작성되기 때문입니다(Mac FWIW를 사용 중입니다).

테스트 실행 시 데이터베이스 엔진을 sqlite3으로 설정하면 Django는 메모리데이터베이스를 사용합니다.

이런 코드를 사용하고 있습니다.settings.py테스트를 실행할 때 엔진을 sqlite로 설정하려면:

if 'test' in sys.argv:
    DATABASE_ENGINE = 'sqlite3'

또는 장고 1.2의 경우:

if 'test' in sys.argv:
    DATABASES['default'] = {'ENGINE': 'sqlite3'}

그리고 마지막으로 장고 1.3과 1.4:

if 'test' in sys.argv:
    DATABASES['default'] = {'ENGINE': 'django.db.backends.sqlite3'}

(백엔드로의 풀 패스는 Django 1.3에서는 반드시 필요한 것은 아니지만, 설정과의 호환성이 있습니다.)

South 마이그레이션에 문제가 있는 경우 다음 행을 추가할 수도 있습니다.

    SOUTH_TESTS_MIGRATE = False

보통 테스트용으로 별도의 설정 파일을 생성하여 테스트 명령어로 사용합니다.

python manage.py test --settings=mysite.test_settings myapp

두 가지 이점이 있습니다.

  1. 체크할 필요가 없습니다.test또는 sys.sysv에 있는 마법의 단어,test_settings.py간단히 말하면 될 수 있다

    from settings import *
    
    # make tests faster
    SOUTH_TESTS_MIGRATE = False
    DATABASES['default'] = {'ENGINE': 'django.db.backends.sqlite3'}
    

    또는 필요에 따라 추가로 조정하여 테스트 설정을 프로덕션 설정과 완전히 분리할 수 있습니다.

  2. 또 다른 장점은 sqlite3가 아닌 실제 가동 데이터베이스 엔진으로 테스트를 실행하여 미묘한 버그를 회피할 수 있기 때문에 사용법을 개발할 수 있습니다.

    python manage.py test --settings=mysite.test_settings myapp
    

    코드를 커밋하기 전에 한 번 실행합니다.

    python manage.py test myapp
    

    모든 시험에 합격했는지 확인하려고요

MYSQL)에서수 "MEMORY 엔진을 합니다.settings.pyㄹ 수 있다, 하다, 하다, 하다, 하다.

    'USER': 'root',                      # Not used with sqlite3.
    'PASSWORD': '',                  # Not used with sqlite3.
    'OPTIONS': {
        "init_command": "SET storage_engine=MEMORY",
    }

열을 MEMORY를 사용하는 BLOB/텍스트 열을 지원하지 .django.db.models.TextField이건 너한테 안 통할 거야

당신의 주요 질문에 대답할 수는 없지만, 일을 가속화하기 위해 당신이 할 수 있는 몇 가지 방법이 있습니다.

먼저 MySQL 데이터베이스가 InnoDB를 사용하도록 설정되어 있는지 확인합니다.그런 다음 트랜잭션을 사용하여 각 테스트 전에 DB 상태를 롤백할 수 있으며, 이는 내 경험상 엄청난 속도 향상으로 이어졌습니다.database init 명령어는 settings.py에서 전달할 수 있습니다(Django 1.2 구문).

DATABASES = {
    'default': {
            'ENGINE':'django.db.backends.mysql',
            'HOST':'localhost',
            'NAME':'mydb',
            'USER':'whoever',
            'PASSWORD':'whatever',
            'OPTIONS':{"init_command": "SET storage_engine=INNODB" } 
        }
    }

둘째, 매번 남쪽 이행을 실행할 필요가 없습니다. ★★SOUTH_TESTS_MIGRATE = False설정을 지정합니다.syncdb를 사용하다이거는 모든 이행을 실행하는 것보다 훨씬 빠릅니다.

이중 조정을 수행할 수 있습니다.

  • 트랜잭션 테이블 사용: TestCase마다 데이터베이스 롤백을 사용하여 초기 고정 상태를 설정합니다.
  • 데이터베이스 데이터를 ramdisk에 저장합니다.데이터베이스 작성에 관한 한 많은 것을 얻을 수 있으며 테스트 실행도 빨라집니다.

나는 두 가지 방법을 모두 사용하고 있고 매우 행복하다.

Ubuntu에서 MySQL용으로 설정하는 방법:

$ sudo service mysql stop
$ sudo cp -pRL /var/lib/mysql /dev/shm/mysql

$ vim /etc/mysql/my.cnf
# datadir = /dev/shm/mysql
$ sudo service mysql start

테스트용이므로 주의해 주십시오.리부트 후 메모리에서 데이터베이스가 손실됩니다.

또 다른 접근법은 RAM Disk를 사용하는 tempfs에서 MySQL의 다른 인스턴스를 실행하는 것입니다. 블로그 투고에서의 절차: Django에서의 테스트를 위한 MySQL의 속도를 높입니다.

장점:

  • 프로덕션 서버가 사용하는 것과 동일한 데이터베이스를 사용합니다.
  • 기본 mysql 설정을 변경할 필요가 없습니다.

Anurag의 답변에 따라 동일한 test_settings를 생성하고 다음을 추가하여 프로세스를 간소화했습니다.화이

if len(sys.argv) > 1 and sys.argv[1] == "test":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.test_settings")
else:
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

sys는 이미 Import되어 관리되고 있기 때문에 깨끗해 보입니다.py는 명령줄에서만 사용되므로 설정을 복잡하게 만들 필요가 없습니다.

하세요.setting.py

DATABASES['default']['ENGINE'] = 'django.db.backends.sqlite3'

언급URL : https://stackoverflow.com/questions/3096148/how-to-run-djangos-test-database-only-in-memory

반응형