nikkie-ftnextの日記

イベントレポートや読書メモを発信

HatchでPythonプロジェクト開発体験記(テスト篇)

はじめに

東ルビ、ありがとうございました!1 nikkieです。

先日emi-reをリリースしました。

この開発でHatchを使っての雑感を綴ります。
今回はテストに関するものになります

目次

HatchでPythonプロジェクト開発

全体感を掴むには、Python Monthly Topicsの記事がオススメです2

Hatchは、Pythonプロジェクトの管理を支援するコマンドラインツールです。

uv同様、プロジェクトだけでなくPython処理系も管理できます3
またuvとの差分は(執筆時点では)Hatchの方が手厚いと感じます4

Hatchでテスト実行

hatch testを使います。
https://hatch.pypa.io/latest/cli/reference/#hatch-test

hatch test --randomize --all -vv --doctest-modules

出力を見るにpytestが使われていますね

ランダムに実行

--randomize指定により、テストの実行順をランダムにします。
pytest-randomly5を使っているようです

Pythonのバージョンを指定

--allpyproject.tomlの記載と合わさります。

[[tool.hatch.envs.hatch-test.matrix]]
python = ["3.9", "3.10", "3.11", "3.12", "3.13"]

Pythonバージョンのmatrixに沿って、emi-reでは5つのバージョンでテストが流れます。

Hatchを導入していないプロジェクトでは、GitHub ActionsのmatrixでPythonのバージョンを変えていました6
HatchだとGitHub Actionsでmatrixを書かなくてよくなるのかもしれません7

pytestに引数を渡す(verboseやdoctest実行)

doctestを実行しようとして少しハマりました。

pytest --doctest-modulesとして、doctestで書かれたテストもpytest(ランナー)で実行できます。
https://docs.pytest.org/en/stable/how-to/doctest.html
pytestはpyproject.tomlでも設定できるので、はじめは以下のように書きました。

[tool.pytest.ini_options]
addopts = "--doctest-modules"

ところが、hatch testから実行するpytestpyproject.tomlに書いたini_options無視します

issueから、workaround hatch test --doctest-modulesを知ります。
どうやら、pytestの引数もhatch testで渡せるようです8
そこで--doctest-modulesの他に-vvも指定しました(落ちたときにdiffが詳しく出る設定)

終わりに

Pythonプロジェクトの開発でHatchを試しました。
結果、テストについて以下に気づきました

  • HatchにPythonバージョンのmatrixを渡せる
    • GitHub Actionsのmatrixは不要になるかも
  • pytestの引数は(pyproject.tomlではなく)hatch testに指定して渡せる

GitHub Actionsがスッキリしたのは嬉しかったですが、Hatchから実行するpytestをpyproject.tomlで設定できないのは意外でした。

なお、hatch testも全て体験したわけではなく、カバレッジなどが宿題です。
引き続き(ハッチポッチ2の座席を得るため9 uvとは別の選択肢を知るために)触っていきます


  1. 東京リベンジャーズ -> 東リベ。すなわち、東京Ruby会議 -> 東ルビ
  2. 他の記事としては、手前味噌ですが
  3. 過去に比較した記事
  4. Hatchが用意するpyproject.tomlはpytestやRuff、mypyを使うように設定されます。この点でPython開発のプラクティスが適用されるツールと私は感じます(対してuvだとツールの選定から必要です) https://ftnext.github.io/2024-slides/pyconjp/pep723-inline-script-metadata-world.html#/19/1
  5. PyCon JP 2019 ビギナーセッションより
  6. https://github.com/ftnext/sphinx-new-tab-link/blob/v0.6.1/.github/workflows/testing.yml#L12-L15
  7. matrixを書いて、hatch test--allはつけない案も浮かんでいます。toxを使ってる感じかも ref: https://github.com/PyCQA/flake8/blob/7.1.1/.github/workflows/main.yml
  8. 実装を眺めた感じ、hatch testの可変長位置引数が渡っていきそうでした https://github.com/pypa/hatch/blob/hatch-v1.14.0/src/hatch/cli/test/__init__.py