MongoDB.local SF, Jan 15: See the speaker lineup & ship your AI vision faster. Use WEB50 to save 50%
Find out more >
Docs Menu
Docs Home
/ /

튜토리얼: Python 라이브러리 테스트 및 패키징

이 튜토리얼에서는 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

튜토리얼을 시작하기 전에 다음 단계를 완료하세요.

  1. 시작하기 가이드 의 단계에 따라 PyMongo 및 해당 종속 항목을 설치하세요. 이후 단계에서 사용할 수 있도록 연결 문자열 복사해야 합니다.

  2. 다음 명령을 실행하여 환경에 pytest 를 설치합니다.

    pip install -U pytest
  3. 이전 단계에서 복사한 MongoDB 연결 문자열 찾습니다. 다음 명령을 실행하여 MDB_URI 환경 변수에 연결 문자열 저장 .

    export MDB_URI="<your connection string>"
  4. buildtwine 패키지를 설치하여 라이브러리를 패키지 하고 게시합니다. build 패키지 빌드 종속성을 설치하고 프로젝트 를 패키징하며, twine 패키지 패키지 를 PyPI에 안전하게 업로드합니다.

    python -m pip install --upgrade build twine

튜토리얼의 이 섹션에는 다음 작업이 포함되어 있습니다.

  1. MongoClient 객체 및 롤백 세션에 pytest 고정 장치 추가

  2. 이러한 고정 장치를 사용하는 테스트 작성

1

프로젝트 위한 새 디렉토리 만들고 터미널에서 해당 디렉토리로 이동합니다.

mkdir sample_application
cd sample_application
2

다음 코드 샘플 mongodb이라는 고정 장치를 보여줍니다. 이 고정 장치는 MDB_URI 환경 변수의 연결 문자열 사용하여 MongoClient 객체 만든 다음 지정된 MongoDB deployment 에 연결할 수 있는지 확인합니다. 고정 장치에는 session 범위가 있으므로 pytest 는 테스트 세션이 시작될 때 고정 장치를 실행하고 모든 테스트에 재사용합니다.

이 고정 장치는 mongodb 고정 장치를 함수 매개변수로 포함하여 사용합니다. 이는 pytestmongodb 를 고정 장치에 인수로 전달하도록 지시합니다.

conftest.py 파일 에 다음 코드를 추가합니다.

import pytest
import pymongo
import os
@pytest.fixture(scope="session")
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 ===============================
3

테스트로 인해 MongoDB 의 데이터가 수정되지만 이러한 변경 사항이 유지되지 않도록 하려면 트랜잭션 사용하여 각 테스트가 끝난 후 변경 사항을 롤백할 수 있습니다. 이렇게 하려면 고정 장치에서 다음 단계를 수행합니다.

  1. 세션 만들기

  2. 트랜잭션 시작

  3. 세션을 테스트에 양보

  4. 테스트 실행 후 트랜잭션 중단

다음 코드 예시 의 고정 장치는 이 패턴 구현합니다.

@pytest.fixture
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 라이브러리를 패키지 하는 방법을 학습 할 수 있습니다.

  1. 패키지 설명

  2. 패키지 빌드

  3. 패키지 PyPI에 게시

1

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"

추가 pyproject 설정

파일 작성에 대한 자세한 내용은 pyproject.toml pyproject.toml 작성을 참조하세요.

2

패키지 에서 배포판을 빌드 하려면 프로젝트 디렉토리 에서 다음 명령을 실행 .

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
3

빌드 후 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 패키지 및 코드에 대한 자세한 내용은 다음 리소스를 참조하세요.

돌아가기

튜토리얼: FastAPI 통합

이 페이지의 내용