Docker 및 Pytest-Django로 테스트 환경 설정: PostreSQL 스키마 문제

6155 단어 sqldjangopythondocker
상품이 많은 핀테크 프로젝트를 진행하고 있습니다. 전체 프로젝트는 Django를 기반으로 구축되었으며 제품은 자체 로직이 있는 애플리케이션일 뿐이지만 모두 핵심 애플리케이션에 의존합니다.
이 핵심 응용 프로그램은 다른 응용 프로그램에서 동일한 논리가 반복되기 때문에 인증, 조직 생성 및 지갑 트랜잭션과 같은 작업을 실제로 처리합니다. 이로 인해 실제로 스키마를 사용하여 데이터베이스에서 동일한 구조를 미러링하게 되었습니다.
프로젝트의 각 애플리케이션에는 자체 스키마가 있습니다.
그러나 pytest로 테스트하는 경우 상황이 약간 까다롭습니다.
또한 Docker를 사용하고 있으며 Docker를 사용하여 테스트를 실행하고 있습니다.

문제



Pytest를 사용하여 테스트 데이터베이스에 스키마를 생성하는 것은 간단하지 않습니다. 개발 환경과 테스트에 동일한 데이터베이스 컨테이너를 사용하고 있으므로 테스트 데이터베이스가 생성됩니다. 당연히 훌륭합니다.
Dev 데이터베이스용 스키마가 이미 생성되어 있고 Postgres에서 SQL 문을 사용하여 정확한 데이터베이스용 스키마를 생성할 방법이 없기 때문에 테스트가 계속 실패했습니다.

return self.cursor.execute(sql, params)
E               django.db.utils.ProgrammingError: relation "core.user" does not exist
E               LINE 1: INSERT INTO "core"."user" ("password", "last_login", "public...



별로 흥미롭지 않죠? 여기 내 해결책이 있습니다.

해결책



간단한 해결책은 내 docker-compose.dev.yaml 파일에 테스트 데이터베이스 컨테이너를 추가하는 것입니다.

  db_test:
    container_name: test_optimus_db
    image: postgres:14.3-alpine
    environment:
      DATABASE_NAME: test_optimusdb
      DATABASE_USER: test_optimus
      DATABASE_PASSWORD: Qinsjhgvv45LJSD
      DATABASE_HOST: test_optimus_db
      DATABASE_PORT: 5432
      POSTGRES_USER: test_optimus
      POSTGRES_PASSWORD: Qinsjhgvv45LJSD
      POSTGRES_DB: test_optimusdb
    volumes:
      - postgres_data_test:/var/lib/postgresql/data/
      - ./db/db_test_init.sql:/docker-entrypoint-initdb.d/1-init.sql

db_test_init.sql 파일은 다음과 같습니다.

GRANT ALL PRIVILEGES ON DATABASE test_optimusdb TO test_optimus;

CREATE SCHEMA IF NOT EXISTS core AUTHORIZATION test_optimus;
CREATE SCHEMA IF NOT EXISTS optimus AUTHORIZATION test_optimus;


init SQL 스크립트가 준비되면 이 함수를 conftest.py 파일 구성에 추가하기만 하면 됩니다.

import pytest

from django.conf import settings


@pytest.fixture(scope="session")
def django_db_setup():
    settings.DATABASES["default"] = {
        "ENGINE": "django.db.backends.postgresql",
        "HOST": "test_optimus_db",
        "NAME": "test_optimusdb",
        "PASSWORD": "Qinsjhgvv45LJSD",
        "USER": "test_optimus",
        "PORT": 5432,
    }


그리고 우리는 끝났습니다. 지금 테스트를 실행하면 통과됩니다.

docker-compose -f docker-compose.dev.yml exec -T web pytest -s -v --traceconfig


그리고 짜잔. 이 솔루션이 작동하고 테스트 환경에 대한 많은 제어 기능을 제공하더라도 저는 여전히 자동화된 솔루션을 찾고 있습니다. 따라서 이미 이 문제에 직면한 적이 있다면 자유롭게 의견을 추가하고 토론해 봅시다.

좋은 웹페이지 즐겨찾기