💯

GitHub ActionsでPythonのLintとTest(テスト)をとりあえず実行

2023/07/04に公開

自動化の第一歩

ずっとやろうと思いつつ、なかなかできないLintやTestの自動化。VS Codeエディタで設定すれば検出してくれますが、うっかり忘れたりチームで開発していると、人によって設定が違ってうぎゃーってなったり、よくありますよね。

そんなときは、GitHub Actions使えば、PR(Pull Request)するたびに、LintチェックやTestを自動でやってくれたりします。

この記事ではPythonでLintとかTestをとりあえず最短で導入する方法の覚書です。GitHub Actions、テストに関してはここでは詳しく説明しませんので、以下の書籍やWeb情報を参照ください。

https://amzn.to/3PJi566

https://amzn.to/3PCloMg

とりあえず試験的に作ったリポジトリです。

https://github.com/karaage0703/python_test

GitHub Actionsの設定

GitHubのActionsというところからNew workflowをクリックしましょう。

そこで出てくる、Python applicationというやつが、LintもTestもあって良い気がします。

とりあえずほぼそのまま使っています。

https://github.com/karaage0703/python_test/blob/main/.github/workflows/python-app.yml

少し説明すると、Lint部分は以下です。

# stop the build if there are Python syntax errors or undefined names
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics

2行目は、--selectオプションあるので、E9,F63,F7,F82のみチェックしています。4行目は--selectオプションないので、全項目チェックしますが--exit-zeroオプションがついているので結果によらず正常終了します。これは、警告のみするという意味です。

より厳しくするなら、以下あたりを初めてプロジェクトに応じて変えていくのが良いかもしれません。

flake8 . --count --max-complexity=10 --max-line-length=127 --statistics --show-source

Lint設定

GitHub Actionsの設定に合わせてエディタの設定も変更しておいた方がよいです。VS Codeエディタの場合は、以下のようになります。

https://zenn.dev/karaage0703/books/80b6999d429abc8051bb/viewer/d77acd#lint

手動で設定していますが、後述するpysenを使うと、自動で設定ファイルを出力できたりします。

Test

テストはpytestを使います。テスト重要ですよね。と思いながら、自分がGitHubで公開している趣味プロジェクトでは一切テスト書いてないですね。

testsディレクトリを作って、その中にテストパターンごとにテストのプログラムを作って実行するというのが結構よくみるパターンな気がします。

もう少し知りたいという人は、以下記事や書籍を参照ください。

https://zenn.dev/karaage0703/articles/d52b4cdca3b896

https://zenn.dev/onigiri_w2/articles/5e6cf4d3ba9ed5

https://pycon-jp-2020-tutorial-slackbot.readthedocs.io/ja/latest/pytest.html

バッジ

バッジつけれるとおしゃれでよいですよね。GitHubのアクションからコピペで以下のようなバッジをつけることができます。

Python application

よいですね。以下ページ参考にしました。

https://qiita.com/akameco/items/e474691964703033e18d

とにかくたくさんバッジつけたい人は、以下のサイトを使うとよいかもしれません。

https://shields.io/

pysen

PFNさんのpysenを使うと、複数のlintチェックを選択できたり、自動整形できたり、VS Codeエディタの設定を生成できたりと色々便利で、比較的簡単に使えて良い感じです。

実際に少し使ってみましたが、最初戸惑ったのはgitで管理していないとlintチェックがかからないところです。ドキュメントに記載ないので、気づかない人結構いそうです(分かれば問題ないですが)。

個人的にはわりと致命的なのが、VS Codeエディタ向けの拡張機能pysen-vscodems-pythonと競合する点ですね。これさえ無ければ何も迷いもなく導入できそうなのですが

以下が参考になります。
https://zenn.dev/hiroya_w/articles/c13f2153fe8bd16dd947

サンプルとなるリポジトリも作成しました。GitHub Actionsでpysenが走ります。
https://github.com/karaage0703/pysen_test

まとめ

自動化、いきなり理想の自動化を導入しようとするより、まずはちょっとずつ入れて、徐々にパワーアップしていくのがうまくいくような気がしています。というわけで、まずは最低限のところを書いてみました。

https://amzn.to/3PJi566

https://amzn.to/3PCloMg

参考リンク

https://github.com/github-actions-up-and-running

https://speakerdeck.com/komofr/pyconjp2020

https://zenn.dev/pinto0309/scraps/c6413eb15a1b2a

https://zenn.dev/tk_resilie/articles/python_test_template

https://speakerdeck.com/ponkio_o/ci-cd-test-night-number-7

関連記事

https://karaage.hatenadiary.jp/entry/2017/12/27/073000

Discussion