ToxによるPythonのマルチ環境テスト自動化:「自分の環境では動くのに」という問題を解消する

Python tutorial - IT technology blog
Python tutorial - IT technology blog

なぜToxはPython開発者の救世主なのか?

「自分のPCではスムーズに動作するのに、サーバーにデプロイした途端にエラーが頻発する」という厄介な状況に直面したことはありませんか?その原因の多くは、Pythonのバージョン違いやライブラリの不足にあります。例えば、最新のPython 3.12の機能を使って開発していても、実際のサーバーが古い3.9で動作しているようなケースです。

200行程度の小規模な自動化プロジェクトであれば、pytestを叩くだけで十分でした。しかし、プロジェクトが2000行を超え、WindowsとLinuxの両方をサポートする必要が出てくると、事態は複雑になります。Python 3.8、3.9、3.10などの仮想環境(virtualenv)を一つずつ手動で作成してテストするのは、それだけで午前中が終わってしまう作業です。そこで出会ったのがToxでした。

Toxは、あなたのコードのための「有能な執事」のような存在です。手動でコマンドを打ち込む代わりに、チェックが必要なPythonバージョンのリストを渡すだけで、Toxが以下のステップを自動的に実行してくれます。

  • 各Pythonバージョンごとに独立した仮想環境を自動作成する。
  • 必要なライブラリ(依存関係)を正確にインストールする。
  • テストスイート(pytestやunittestなど)を実行する。
  • どのバージョンで成功し、どのバージョンで失敗したかのレポートをまとめる。

30秒でできるToxのインストール

Toxを効果的に動かすためには、対象となるPythonバージョンがマシンにインストールされている必要があります。私は通常、pyenvを使用して、3.9から3.13までの複数のバージョンを同じマシン上で管理しています。

Toxのインストールは、pipを使って非常に簡単に行えます。

pip install tox

インストールが完了したら、バージョンを確認して準備ができているか確かめましょう。

tox --version

ターミナルに4.x.xといったバージョンが表示されれば、プロジェクトの設定を開始できます。

標準的なtox.iniファイルの設定

tox.iniファイルは、プロセス全体を制御する「脳」にあたります。このファイルをプロジェクトのルートディレクトリ(requirements.txtと同じ階層)に作成します。

以下は、私が最高の安定性を確保するために普段適用している標準的な設定です。

[tox]
envlist = py39, py310, py311, py312
isolated_build = True

[testenv]
deps =
    pytest
    pytest-cov
    -rrequirements.txt
commands =
    pytest --maxfail=2 -rf

この設定にはどのような意味があるのでしょうか?

  • envlist: テストが必要なPythonバージョンのリストです。Toxはこれら4つのバージョンを順番に実行します。
  • isolated_build: 新しいパッケージング規格(PEP 517)に準拠するためにTrueに設定します。これにより、ビルド時の細かなエラーを防げます。
  • deps: テストをサポートするツールです。ここではコード網羅率(coverage)を測定するためにpytest-covを追加しています。
  • commands: メインの実行コマンドです。--maxfail=2パラメータを指定することで、エラーが多発した場合にテストを早期中断し、待ち時間を節約できます。

推奨されるプロジェクトのディレクトリ構造

Toxを最適に動作させるために、以下のようなディレクトリ構成にすることをお勧めします。

my_project/
├── src/                # アプリケーションのメインコード
├── tests/              # テストファイル
├── requirements.txt    # ライブラリのリスト
├── tox.ini             # Toxの設定ファイル
└── pyproject.toml      # プロジェクトのパッケージング情報

実行と結果の確認

いよいよ成果を確認する時です。ターミナルを開き、一つのコマンドを入力するだけです。

tox

Toxは自動的にpy39の環境を構築し、ライブラリをインストールしてテストを実行し、リストの最後までこれを繰り返します。手動で15〜20分かかっていた作業が、放置している間のわずか2〜3分で完了します。

特定バージョンで素早くテストを実行するコツ

バグ修正の過程で、時間を節約するためにPython 3.12だけで個別にチェックしたい場合は、-e(environment)パラメータを使用します。

tox -e py312

「赤色(エラー)」が表示された時の対処法

特定の環境でエラーが出ても、慌てる必要はありません。最後にあるSummaryセクションまでスクロールしてください。Toxは各環境の状態を一覧表示します。もしpy310: failedとなっていれば、そのバージョン固有のログに集中して、構文の違いやライブラリの互換性を調査すればよいのです。

CI/CDでプロジェクトをレベルアップ

Toxが真に真価を発揮するのは、GitHub ActionsやGitLab CIに組み込んだ時です。クラウド上で環境をセットアップするために何十行もの複雑なスクリプトを書く代わりに、toxコマンドを呼び出すだけで済みます。これにより、コードの引き渡しプロセスがプロフェッショナルになり、本番環境へのデプロイ時の環境エラーのリスクを最小限に抑えることができます。

結論として、Toxは単なるテストツールではありません。それは、あなたのPythonソフトウェアがどこでも安定して動作することを保証するためのスタンダードです。退屈な繰り返し作業から自分を解放するために、今日からToxを導入しましょう。

Share: