Nox でテストを実行する#

Nox は、複数の Python バージョン間でテストを実行し、分離されたテスト環境を管理するための Python ベースの自動化ツールです。 TOML よりも Python ベースの構成を好む場合、または複雑な自動化ワークフローが必要な場合は、Nox が最適な選択肢です。

For more information about Nox, see the official Nox documentation or the Scientific Python guide to testing.

なぜノックスなのか?#

Nox が優れた自動化ツールである理由は次のとおりです:

  • Python ベースなので、Python をすでに知っていれば利用しやすい

  • ワークフローを実行するための隔離された環境を作成する

  • 標準テストを超えた複雑なカスタム自動化をサポート

  • 複雑なビルドおよびテストのシナリオに柔軟かつ強力です

nox はテスト環境の作成と管理を簡単にします。nox を使うと、仮想環境をセットアップし、好みの環境マネージャを使って Python のバージョンをまたいだテストをコマンド一つで実行できます。

Noxをセットアップする#

Nox を使い始めるには、プロジェクトディレクトリのルートに noxfile.py ファイルを作成します。そして、Python の関数を使ってコマンドを定義します。

注釈

Nox のインストール

異なる Python バージョン間でテストを実行するために Nox をインストールして使用する場合、Nox は Nox 関数で指定した Python バージョンごとに個別の venv 環境を作成して管理します。Nox は各環境をそれぞれ独立して管理します。

Nox は、ドキュメントのビルド、パッケージ配布物の作成、PyPI 関連の環境 (venv や virtualenv など) と conda (conda-forge など) の両方にわたるインストールのテストなど、その他の開発タスクにも使用できます。

テスト環境#

デフォルトでは、nox は Python 組み込みの venv 環境マネージャを使用します。仮想環境 (venv) は自己完結型の Python 環境で、異なる Python プロジェクトの依存関係を分離して管理できます。プロジェクト固有のライブラリやパッケージが互いに干渉しないようにし、クリーンで整理された開発環境を促進します。

venv環境のnox#

以下は、Python に組み込まれている環境マネージャーである venv を使ってテストを実行するように Nox をセットアップする例です。

以下の例では、project.optional-dependencies を使ってテストの依存関係を pyproject.toml に宣言していることを前提としていることに注意してください:

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "pyosPackage"
version = "0.1.0"
dependencies = [
  "geopandas",
  "xarray",
]

[project.optional-dependencies]
tests = ["pytest", "pytest-cov"]

この設定ができていれば、session.install(".[tests]") を使ってテストの依存関係をインストールできます。以下のように、1つの Nox セッションで4つの異なる Python 環境 (Python 3.9、3.10、3.11、3.12) でテストを実行できることに注意してください。

注釈

これを実行するには、コンピューターに python3.9、python3.10、python3.11、および python3.12 がインストールされている必要があります。それ以外の場合、nox は不足しているバージョンのテストの実行をスキップします。

# This code would live in a noxfile.py file located at the root of your
# project directory
import nox

@nox.session(python=["3.9", "3.10", "3.11", "3.12"])
def test(session):
    # Install dependencies
    session.install(".[tests]")
    # Run tests
    session.run("pytest")

上の例では、@nox.session デコレーターを使って関数の形で Nox セッションを作成しています。デコレーターの中で、実行したい Python のバージョンを宣言していることに注意してください。

上記を実行するには、--session (-s と短縮されることもある) でセッションを指定し、以下のコマンドを実行します。上記の関数は test という名前なので、セッション名は test です:

nox --session test

conda / mamba による nox#

以下は、Nox が環境マネージャーに mamba (または conda) を使うように設定する例です。venv と違って、conda は必要な Python のさまざまなバージョンを自動的にインストールできます。conda/mamba を使う場合は、venv のように4つの Python バージョンをすべてインストールする必要はありません。

注釈

nox で conda を動作させるには、コンピュータに conda か mamba のどちらかがインストールされていることを確認する必要があります。

# This code should live in your noxfile.py file
import nox

# The syntax below allows you to use mamba / conda as your environment
# manager. If you use this approach, you don't have to worry about installing
# different versions of Python

@nox.session(venv_backend='mamba', python=["3.9", "3.10", "3.11", "3.12"])
def test_mamba(session):
    """Nox function that installs dev requirements and runs tests on Python
    3.9 through 3.12.
    """
    # Install dev requirements
    session.conda_install(".[tests]")
    # Run tests using any parameters that you need
    session.run("pytest")

上記のセッションを実行するには、次のようにします:

nox --session test_mamba

ハッチvsノックス#

Hatch と Nox のどちらを選択するか迷っている場合は、メインのテスト ページの比較と推奨事項 を参照してください。

要約すれば#

  • すでにパッケージングに Hatch を使用していて、すべてを 1 か所にまとめたい場合は、Hatch を選択してください

  • 最大限の柔軟性が必要な場合、Python ベースの構成を好む場合、または複雑な自動化ワークフローが必要な場合は、Nox を選択してください

次のステップ#

Nox を使用してローカルでテストを実行する方法を理解したので、継続的インテグレーションを使用してテストを自動的に実行する または Hatch を使用してテストを実行する について学ぶことができます。