Pytest 및 PostgreSQL: 모든 테스트를 위한 새로운 데이터베이스
모두가 선호하는 Python 테스트 프레임워크인 Pytest에서 픽스처는 테스트가 시작되기 전에 무언가를 정렬하고 종료 후에 정리하는 재사용 가능한 코드 조각입니다. 예를 들어, 임시 파일이나 폴더, 환경 설정, 웹 서버 시작 등이 있습니다. 이 게시물에서는 다음을 얻는 테스트 데이터베이스(비어 있거나 알려진 상태)를 생성하는 Pytest 픽스쳐를 생성하는 방법을 살펴보겠습니다. 정리하여 각 테스트를 완전히 깨끗한 데이터베이스에서 실행할 수 있습니다.
목표
테스트 데이터베이스를 준비하고 정리하기 위해 Psycopg 3을 사용하여 Pytest 픽스처를 생성하겠습니다. 빈 데이터베이스는 테스트에 거의 도움이 되지 않기 때문에 선택적으로 Yoyo 마이그레이션(웹사이트 작성 시 archive.org 스냅샷으로 이동)을 적용하여 채울 것입니다.
이 블로그 게시물에서 생성된 test_db라는 Pytest 픽스처에 대한 요구 사항은 다음과 같습니다.
- 테스트 데이터베이스 삭제 테스트 이전에 존재하는 경우
- 테스트 전에 빈 데이터베이스를 생성
- 선택적으로 테스트 전에 마이그레이션을 적용하거나 테스트 데이터를 생성
- 테스트 데이터베이스에 대한 연결 제공테스트
- 드롭 테스트 데이터베이스 테스트 후(실패한 경우에도)
테스트 메서드 인수를 나열하여 요청하는 모든 테스트 메서드:
def test_create_admin_table(test_db): ...
테스트 DB에 연결된 일반 Psycopg Connection 인스턴스를 받게 됩니다. 테스트는 일반 Psycopg 일반적인 사용법과 같이 필요한 모든 작업을 수행할 수 있습니다. 예:
def test_create_admin_table(test_db): # Open a cursor to perform database operations cur = test_db.cursor() # Pass data to fill a query placeholders and let Psycopg perform # the correct conversion (no SQL injections!) cur.execute( "INSERT INTO test (num, data) VALUES (%s, %s)", (100, "abc'def")) # Query the database and obtain data as Python objects. cur.execute("SELECT * FROM test") cur.fetchone() # will return (1, 100, "abc'def") # You can use `cur.fetchmany()`, `cur.fetchall()` to return a list # of several records, or even iterate on the cursor for record in cur: print(record)
저는 동일한 결과를 약속하는 pytest-postgresql을 사용해 보았습니다. 나는 내 자신의 픽스처를 작성하기 전에 그것을 시도했지만 나에게 적합하게 만들 수 없었습니다. 아마도 그들의 문서가 나에게 매우 혼란스럽기 때문일 것입니다. 또 다른 pytest-dbt-postgres는 전혀 시도하지 않았습니다.동기 부여 및 대안
데이터베이스에 의존하는 테스트를 위한 PostgreSQL 고정 장치를 약속하는 일부 Pytest 플러그인이 있는 것 같습니다. 그들은 당신에게 잘 작동할 수도 있습니다.
프로젝트 파일 레이아웃
클래식 Python 프로젝트에서 소스는 src/에 있고 테스트는 test/에 있습니다.
├── src │ └── tuvok │ ├── __init__.py │ └── sales │ └── new_user.py ├── tests │ ├── conftest.py │ └── sales │ └── test_new_user.py ├── requirements.txt └── yoyo.ini
환상적인 Yoyo와 같은 마이그레이션 라이브러리를 사용하는 경우 마이그레이션 스크립트가 migrations/:
에 있을 가능성이 높습니다.
├── migrations ├── 20240816_01_Yn3Ca-sales-user-user-add-last-run-table.py ├── ...
구성
테스트 DB 고정 장치에는 약간의 구성이 필요합니다.
- 연결 URL - (데이터베이스 없음)
- 테스트 데이터베이스 이름 - 모든 테스트마다 다시 생성됩니다
- (선택 사항) 마이그레이션 폴더 - 모든 테스트에 적용할 마이그레이션 스크립트
Pytest에는 여러 파일에서 픽스처를 공유할 수 있는 자연스러운 장소인 conftest.py가 있습니다. 고정 장치 구성도 거기에 적용됩니다:
# Without DB name! TEST_DB_URL = "postgresql://localhost" TEST_DB_NAME = "test_tuvok" TEST_DB_MIGRATIONS_DIR = str(Path(__file__, "../../migrations").resolve())
이러한 값은 환경 변수 또는 상황에 맞게 설정할 수 있습니다.
test_db 고정 장치 생성
PostgreSQL 및 Psycopg 라이브러리에 대한 지식을 바탕으로 conftest.py에 픽스처를 작성합니다.
@pytest.fixture def test_db(): # autocommit=True start no transaction because CREATE/DROP DATABASE # cannot be executed in a transaction block. with psycopg.connect(TEST_DB_URL, autocommit=True) as conn: cur = conn.cursor() # create test DB, drop before cur.execute(f'DROP DATABASE IF EXISTS "{TEST_DB_NAME}" WITH (FORCE)') cur.execute(f'CREATE DATABASE "{TEST_DB_NAME}"') # Return (a new) connection to just created test DB # Unfortunately, you cannot directly change the database for an existing Psycopg connection. Once a connection is established to a specific database, it's tied to that database. with psycopg.connect(TEST_DB_URL, dbname=TEST_DB_NAME) as conn: yield conn cur.execute(f'DROP DATABASE IF EXISTS "{TEST_DB_NAME}" WITH (FORCE)')
마이그레이션 픽스쳐 생성
저희 경우에는 Yoyo 마이그레이션을 사용합니다. yoyo라는 또 다른 픽스처로 Apply migration을 작성하세요.
@pytest.fixture def yoyo(): # Yoyo expect `driver://user:pass@host:port/database_name?param=value`. # In passed URL we need to url = ( urlparse(TEST_DB_URL) . # 1) Change driver (schema part) with `postgresql+psycopg` to use # psycopg 3 (not 2 which is `postgresql+psycopg2`) _replace(scheme="postgresql+psycopg") . # 2) Change database to test db (in which migrations will apply) _replace(path=TEST_DB_NAME) .geturl() ) backend = get_backend(url) migrations = read_migrations(TEST_DB_MIGRATIONS_DIR) if len(migrations) == 0: raise ValueError(f"No Yoyo migrations found in '{TEST_DB_MIGRATIONS_DIR}'") with backend.lock(): backend.apply_migrations(backend.to_apply(migrations))
모든 테스트 데이터베이스에 마이그레이션을 적용하려면 test_db 고정 장치에 yoyo 고정 장치가 필요합니다.
@pytest.fixture def test_db(yoyo): ...
일부 테스트에만 마이그레이션을 적용하려면 yoyo를 개별적으로 요구하세요.
def test_create_admin_table(test_db, yoyo): ...
결론
테스트에 깨끗한 데이터베이스를 제공하기 위해 자체 픽스처를 구축하는 것은 Pytest와 Postgres에 대해 더 깊이 탐구할 수 있는 보람 있는 경험이었습니다.
이 기사가 귀하의 데이터베이스 테스트 스위트에 도움이 되었기를 바랍니다. 궁금한 점은 댓글로 남겨주시고 행복한 코딩하세요!
위 내용은 Pytest 및 PostgreSQL: 모든 테스트를 위한 새로운 데이터베이스의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

Python은 게임 및 GUI 개발에서 탁월합니다. 1) 게임 개발은 Pygame을 사용하여 드로잉, 오디오 및 기타 기능을 제공하며 2D 게임을 만드는 데 적합합니다. 2) GUI 개발은 Tkinter 또는 PYQT를 선택할 수 있습니다. Tkinter는 간단하고 사용하기 쉽고 PYQT는 풍부한 기능을 가지고 있으며 전문 개발에 적합합니다.

Python은 배우고 사용하기 쉽고 C는 더 강력하지만 복잡합니다. 1. Python Syntax는 간결하며 초보자에게 적합합니다. 동적 타이핑 및 자동 메모리 관리를 사용하면 사용하기 쉽지만 런타임 오류가 발생할 수 있습니다. 2.C는 고성능 응용 프로그램에 적합한 저수준 제어 및 고급 기능을 제공하지만 학습 임계 값이 높고 수동 메모리 및 유형 안전 관리가 필요합니다.

제한된 시간에 Python 학습 효율을 극대화하려면 Python의 DateTime, Time 및 Schedule 모듈을 사용할 수 있습니다. 1. DateTime 모듈은 학습 시간을 기록하고 계획하는 데 사용됩니다. 2. 시간 모듈은 학습과 휴식 시간을 설정하는 데 도움이됩니다. 3. 일정 모듈은 주간 학습 작업을 자동으로 배열합니다.

Python은 개발 효율에서 C보다 낫지 만 C는 실행 성능이 높습니다. 1. Python의 간결한 구문 및 풍부한 라이브러리는 개발 효율성을 향상시킵니다. 2.C의 컴파일 유형 특성 및 하드웨어 제어는 실행 성능을 향상시킵니다. 선택할 때는 프로젝트 요구에 따라 개발 속도 및 실행 효율성을 평가해야합니다.

Pythonlistsarepartoftsandardlardlibrary, whileraysarenot.listsarebuilt-in, 다재다능하고, 수집 할 수있는 반면, arraysarreprovidedByTearRaymoduledlesscommonlyusedDuetolimitedFunctionality.

파이썬은 자동화, 스크립팅 및 작업 관리가 탁월합니다. 1) 자동화 : 파일 백업은 OS 및 Shutil과 같은 표준 라이브러리를 통해 실현됩니다. 2) 스크립트 쓰기 : PSUTIL 라이브러리를 사용하여 시스템 리소스를 모니터링합니다. 3) 작업 관리 : 일정 라이브러리를 사용하여 작업을 예약하십시오. Python의 사용 편의성과 풍부한 라이브러리 지원으로 인해 이러한 영역에서 선호하는 도구가됩니다.

하루에 2 시간 동안 파이썬을 배우는 것으로 충분합니까? 목표와 학습 방법에 따라 다릅니다. 1) 명확한 학습 계획을 개발, 2) 적절한 학습 자원 및 방법을 선택하고 3) 실습 연습 및 검토 및 통합 연습 및 검토 및 통합,이 기간 동안 Python의 기본 지식과 고급 기능을 점차적으로 마스터 할 수 있습니다.

Python과 C는 각각 고유 한 장점이 있으며 선택은 프로젝트 요구 사항을 기반으로해야합니다. 1) Python은 간결한 구문 및 동적 타이핑으로 인해 빠른 개발 및 데이터 처리에 적합합니다. 2) C는 정적 타이핑 및 수동 메모리 관리로 인해 고성능 및 시스템 프로그래밍에 적합합니다.
