tox vs nox:Python のテスト自動化を比較
tox はテスト環境を INI で宣言的に構成します。nox はそれらを Python で構成し、宣言的なシンプルさとプログラム的な柔軟性を引き換えにします。
どちらも複数の Python バージョンと隔離された環境をまたいでテストスイートを実行します。tox は tox.ini(宣言的)を使い、nox は noxfile.py(命令的な Python)を使い、複雑なマトリクスにより柔軟です。
| tox | nox | |
|---|---|---|
| Config の形式 | tox.ini(宣言的) | noxfile.py(Python) |
| 柔軟性 | config 駆動、factors/条件分岐 | 完全な Python のロジック |
| 学習コスト | 標準的なマトリクスならシンプル | Python で考えるなら容易 |
| 成熟度 | 長く確立している | 確立済み、より新しい |
| バックエンド | virtualenv | virtualenv / conda / venv |
tox が優れている点
「py39..py312 でテストを実行する」といった標準的なマトリクスでは、tox.ini は簡潔で宣言的であり、このツールは非常に広く使われ、ドキュメントも豊富です。その factor 構文は、コードを書かずに多くのマトリクスの組み合わせを扱えます。要件が従来型であれば、tox が最もシンプルに合います。
nox が優れている点
session が条件分岐のロジック、動的なパラメータ化、あるいは INI では扱いにくいステップを必要とする場合、それらを Python(noxfile.py)で表現する方がすっきりします。nox の session は単なる関数であり、多くの開発者にとって考えやすく、再利用しやすいと感じられます。
CI では
どちらも CI のマトリクスとよく組み合わさります。CI の runner にインタプリタを用意させ、tox/nox にバージョンごとの環境を管理させるか、あるいはマトリクス全体を 1 つの job の中で実行します。作成した環境を config のハッシュで cache して再実行を高速化しましょう。
結論
従来型の宣言的なテストマトリクスと最大限の使い慣れが欲しいなら tox を、session をプログラム的に制御したいなら nox を選びましょう。どちらもバージョンをまたぐ Python テストにしっかり対応します。