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 に公開する方法も示します。

Tip

マークを使用したコーディング

このチュートリアルは、「マークを使用したコーディング」ライブストリームの 2 番目の回構成に基づいています。この記録は、 MongoDB Youtube チャンネルで見ることができます。

pytest の修正は、ユニット テストで使用するリソースを作成する関数です。通常、修正はプロジェクトディレクトリ内の conftest.py という名前のファイルで定義されます。テスト関数に値を返すには、yield ステートメントを使用します。

各フィックスには、フィックスの実行頻度を制御するスコープがあります。次の修正、sample_fixture はデフォルトのスコープ function を使用します。つまり、pytest は、それを使用する各テスト関数の前に修正を実行します。このフィックスは、yield ステートメントを使用して string "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デプロイに接続できるようにします。この修正のスコープは 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"

Tip

その他の pyproject 設定

ファイルの書き込みの詳細については、「 pyproject.tol の書き込み 」を参照してください。pyproject.toml

2

パッケージからディストリビューションを構築するには、プロジェクトディレクトリで次のコマンドを実行します。

python3 -m build

上記の手順では、パッケージ用の wire と 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 を使用して wire と 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 統合

項目一覧