はじめに
東ルビ、ありがとうございました!1 nikkieです。
先日emi-reをリリースしました。
この開発でHatchを使っての雑感を綴ります。
今回はテストに関するものになります
目次
HatchでPythonプロジェクト開発
全体感を掴むには、Python Monthly Topicsの記事がオススメです2
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のバージョンを指定
--allはpyproject.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から実行するpytestはpyproject.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とは別の選択肢を知るために)触っていきます
- 東京リベンジャーズ -> 東リベ。すなわち、東京Ruby会議 -> 東ルビ↩
- 他の記事としては、手前味噌ですが ↩
- 過去に比較した記事 ↩
-
Hatchが用意する
pyproject.tomlはpytestやRuff、mypyを使うように設定されます。この点でPython開発のプラクティスが適用されるツールと私は感じます(対してuvだとツールの選定から必要です) https://ftnext.github.io/2024-slides/pyconjp/pep723-inline-script-metadata-world.html#/19/1↩ - PyCon JP 2019 ビギナーセッションより↩
- 例 https://github.com/ftnext/sphinx-new-tab-link/blob/v0.6.1/.github/workflows/testing.yml#L12-L15↩
-
matrixを書いて、
hatch testに--allはつけない案も浮かんでいます。toxを使ってる感じかも ref: https://github.com/PyCQA/flake8/blob/7.1.1/.github/workflows/main.yml↩ -
実装を眺めた感じ、
hatch testの可変長位置引数が渡っていきそうでした https://github.com/pypa/hatch/blob/hatch-v1.14.0/src/hatch/cli/test/__init__.py↩ -
↩俺はハッチポッチ2に行きたいから、もうなりふりかまっていられないhttps://t.co/MP259At8Iz
— nikkie(にっきー) / にっP (@ftnext) 2025年1月1日
Pythonの環境構築ではHatch(ハッチ)を推して、当選確率アップを狙うぜ!
みなさんはいまと変わらずuvと仲良くなさっていてください。
Hatch派に転向されるとチケット倍率上がっちゃうんでどうかそのまま