Overview
このチュートリアルでは、 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
前提条件
チュートリアルを開始する前に、次の手順を完了してください。
スタートガイドの手順に従って、 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
Python に関する修正の作成とテストに関する修正
チュートリアルのこのセクションには、次のタスクが含まれています。
MongoClientオブジェクトとロールバック セッションへのpytest修正の追加これらの修正を使用する書き込みテスト
MongoClient 修正を追加する
次のコードサンプルには、mongodb という名前のフィックスが示されています。この修正は、MDB_URI 環境変数の接続文字列を使用して MongoClientオブジェクトを作成し、指定されたMongoDBデプロイに接続できるようにします。この修正のスコープは 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
上記の手順では、パッケージ用の 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
PyPI に公開
ビルド後、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パッケージとコードの詳細については、次のリソースを参照してください。