개요
이 튜토리얼에서는 MongoDB 에 대한 테스트를 실행 pytest 픽스처를 추가하고 트랜잭션을 사용하여 변경 사항을 롤백하는 방법을 보여줍니다. 또한 hatchling 라이브러리를 사용하여 Python 라이브러리를 패키지 하고 패키지 PyPI에 게시하는 방법도 보여줍니다.
팁
Mark를 사용한 코딩
이 튜토리얼은 "Coding with Mark" 실시간 스트림의 두 번째 에피소드를 기반으로 합니다.MongoDB YouTube 채널 에서 녹화를 시청할 수 있습니다.
비품
pytest 의 고정 장치는 단위 테스트에 사용할 리소스를 생성하는 함수입니다. 일반적으로 고정 장치는 프로젝트 디렉토리 의 conftest.py 파일 에 정의되어 있습니다. yield 성명서 사용하여 테스트 함수에 값을 반환할 수 있습니다.
각 고정 장치에는 고정 장치가 실행되는 빈도를 제어하는 범위가 있습니다. 다음 고정 장치인 sample_fixture는 기본값 범위인 function을 사용합니다. 즉, pytest 는 픽스처를 사용하는 각 테스트 함수보다 먼저 픽스처를 실행합니다. 고정 장치는 yield 성명서 사용하여 "Hello, World" 문자열을 테스트 함수에 반환합니다.
def sample_fixture(): # Code before the test runs yield "Hello, World" # Code after the test runs
전제 조건
튜토리얼을 시작하기 전에 다음 단계를 완료하세요.
시작하기 가이드 의 단계에 따라 PyMongo 및 해당 종속 항목을 설치하세요. 이후 단계에서 사용할 수 있도록 연결 문자열 복사해야 합니다.
다음 명령을 실행하여 환경에
pytest를 설치합니다.pip install -U pytest 이전 단계에서 복사한 MongoDB 연결 문자열 찾습니다. 다음 명령을 실행하여
MDB_URI환경 변수에 연결 문자열 저장 .export MDB_URI="<your connection string>" build및twine패키지를 설치하여 라이브러리를 패키지 하고 게시합니다.build패키지 빌드 종속성을 설치하고 프로젝트 를 패키징하며,twine패키지 패키지 를 PyPI에 안전하게 업로드합니다.python -m pip install --upgrade build twine
pytest 고정 장치 생성 및 테스트
튜토리얼의 이 섹션에는 다음 작업이 포함되어 있습니다.
MongoClient객체 및 롤백 세션에pytest고정 장치 추가이러한 고정 장치를 사용하는 테스트 작성
MongoClient 고정 장치 추가
다음 코드 샘플 mongodb이라는 고정 장치를 보여줍니다. 이 고정 장치는 MDB_URI 환경 변수의 연결 문자열 사용하여 MongoClient 객체 만든 다음 지정된 MongoDB deployment 에 연결할 수 있는지 확인합니다. 고정 장치에는 session 범위가 있으므로 pytest 는 테스트 세션이 시작될 때 고정 장치를 실행하고 모든 테스트에 재사용합니다.
이 고정 장치는 mongodb 고정 장치를 함수 매개변수로 포함하여 사용합니다. 이는 pytest 이 mongodb 를 고정 장치에 인수로 전달하도록 지시합니다.
conftest.py 파일 에 다음 코드를 추가합니다.
import pytest import pymongo import os def mongodb(): client = pymongo.MongoClient(os.environ["MDB_URI"]) assert client.admin.command("ping")["ok"] != 0.0 yield client client.close()
고정 장치를 테스트하려면 test_mongodb_fixture.py 파일 에 다음 코드를 추가합니다.
def test_mongodb_fixture(mongodb): """This test passes if `MDB_URI` is set to a valid connection string.""" assert mongodb.admin.command("ping")["ok"] > 0
터미널에서 다음 명령을 실행하여 테스트를 실행합니다.
pytest test_mongodb_fixture.py
테스트가 성공적인 하면 다음과 유사한 메시지가 출력됩니다.
============================= test session starts ============================== collected 1 item test_mongodb_fixture.py . [100%] ============================== 1 passed in 0.XXs ===============================
롤백 세션 고정 장치 추가
테스트로 인해 MongoDB 의 데이터가 수정되지만 이러한 변경 사항이 유지되지 않도록 하려면 트랜잭션 사용하여 각 테스트가 끝난 후 변경 사항을 롤백할 수 있습니다. 이렇게 하려면 고정 장치에서 다음 단계를 수행합니다.
세션 만들기
트랜잭션 시작
세션을 테스트에 양보
테스트 실행 후 트랜잭션 중단
다음 코드 예시 의 고정 장치는 이 패턴 구현합니다.
def rollback_session(mongodb): session = mongodb.start_session() session.start_transaction() try: yield session finally: session.abort_transaction()
앞의 고정 장치는 기본값 function 범위를 사용하므로 각 테스트 함수 후에 abort_transaction 이 실행됩니다.
고정 장치를 테스트하려면 test_update_mongodb.py 파일 에 다음 코드를 추가합니다.
def test_update_mongodb(mongodb, rollback_session): my_collection = mongodb["sample_db"]["sample_collection"] my_collection.insert_one( { "_id": "bad_document", "description": ( "If this still exists, then transactions are not working." ), }, session=rollback_session, ) assert ( my_collection.find_one( {"_id": "bad_document"}, session=rollback_session ) is not None )
참고
session Argument
모든 쿼리에 session 인수를 전달합니다. 이렇게 하면 해당 항목이 트랜잭션 의 일부임을 확인할 수 있습니다.
터미널에서 다음 명령을 실행하여 테스트를 실행합니다.
pytest test_update_mongodb.py
테스트가 성공적인 하면 다음과 유사한 메시지가 출력됩니다.
============================= test session starts ============================== collected 1 item test_update_mongodb.py . [100%] ============================== 1 passed in 0.XXs ===============================
Python 라이브러리 패키징
이 섹션에서는 다음 조치를 수행하여 샘플 Python 라이브러리를 패키지 하는 방법을 학습 할 수 있습니다.
패키지 설명
패키지 빌드
패키지 PyPI에 게시
패키지 설명
pyproject.toml 파일 에 프로젝트 설명합니다. 다음 파일 hatchling 빌드 백엔드 사용하는 패키지 대해 설명합니다.
[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "sample_application" version = "0.0.1" authors = [{ name = "<your name>", email = "<your email address>" }] description = "An example application to demonstrate packaging a Python project." requires-python = ">=3.10" dependencies = ["pymongo>=4.15.5"] classifiers = [ "Programming Language :: Python :: 3", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Development Status :: 1 - Planning", "Intended Audience :: Developers", "Topic :: Database", ] [tool.hatch.build.targets.wheel] packages = ["sample_application"] [project.urls] Homepage = "https://github.com/mongodb"
패키지 빌드
패키지 에서 배포판을 빌드 하려면 프로젝트 디렉토리 에서 다음 명령을 실행 .
python3 -m build
이전 단계에서는 패키지 에 대한 휠과 gzip으로 압축된 tarball을 만듭니다. 빌드 작업이 성공적인 하면 다음과 유사한 출력이 인쇄됩니다.
* Creating isolated environment: venv+pip... * Installing packages in isolated environment: - hatchling * Getting build dependencies for sdist... * Building sdist... * Building wheel from sdist * Creating isolated environment: venv+pip... * Installing packages in isolated environment: - hatchling * Getting build dependencies for wheel... * Building wheel... Successfully built sample_application-0.0.1.tar.gz and sample_application-0.0.1-py3-none-any.whl
PyPI에 게시
빌드 후 twine를 사용하여 휠과 gzip으로 압축된 tarball을 업로드할 수 있습니다. 이러한 파일을 업로드하려면 프로젝트 디렉토리 에서 다음 명령을 실행 .
python3 -m twine upload dist/*
업로드에 성공적인 다음 메시지와 유사한 출력이 생성됩니다.
* Uploading distributions to https://upload.pypi.org/legacy/ * Enter your username: * Enter your password: * Uploading sample_application-0.0.1-py3-none-any.whl * Uploading sample_application-0.0.1.tar.gz * View at: https://pypi.org/project/sample_application/0.0.1/
자세한 정보
이 튜토리얼에 사용된 Python 패키지 및 코드에 대한 자세한 내용은 다음 리소스를 참조하세요.