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 を使用してテストを実行する について学ぶことができます。