本記事向けの方
- Pipenvを使ったPythonパッケージのリポジトリを見てみたい。
- Pytestを使った単体試験を行いたい。
- Yahoo気象情報APIを使いたい。
概要
本記事はPipenvを使った開発とPytestを使った単体試験を組み込んで、Yahoo気象情報API用のライブラリを作成してみた記事である。
※本記事は実際のリポジトリ内での使われ方や調査した中で自分が分かったことを記述した。実際のPipenvやPytest自体の使い方は先人の方の記事が山ほどあるので最下部の「参考にしたリンク」をご参考に。
作成したライブラリのリポジトリは下記となる。
https://github.com/doara-developer/weatherlib
Pipenv
Pythonの仮想環境を作成するためのツール。
https://pipenv-ja.readthedocs.io/ja/translate-ja/#
Pipenvだけでパッケージ管理はダメ?
実際にコードを動作させる環境が限定されていて、その中でPipenvを使える状況ならばPipenv(Pipfile)のみでも良いが、そうでないならば通常のパッケージのようにsetup.py/setup.cfgを用意するべき。
それなら何故Pipenvを利用するのか?
Pipenvを利用することで、開発時の動作環境を保証することが出来る。よくある「開発環境で動くが、実際の環境で動作しない。」という類の不具合を防止することが出来る。便利。
pipenv installを介してライブラリをインストールすることで、Pipfileに環境が書き込まれる。また、そのPipfile通りの実行環境を別環境でも容易に構築することが出来る。
Pipfile
[dev-packages]
flake8 = "*"
autopep8 = "*"
pytest = "*"
pytest-cov = "*"
pytest-mock = "*"
pytest-randomly = "*"
[packages]
requests = "*"
(参考)Pipenvか、Poetryか
「最近ならPipenvじゃなくてPoetryじゃないの?」という人がいるかもしれない。しかし、今回の記事にあたりいくつか調べたところ現在は「今後はPoetryが流行っていくかもだが、まだPipenvが主流」という状況だと思っている。今後自分の中で比較するためにも今回はPipenvを採用した。
Yahoo気象情報APIの使い方
下記の手順で利用可能、特に難しいことはない。
- Yahooアカウントを取得する
- アプリケーションIDを取得する
https://www.yahoo-help.jp/app/answers/detail/p/537/a_id/43397 - アプリケーションIDをparameterに入れて気象情報APIを叩く
https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/weather.html
Pytest
Pythonのテストフレームワーク。
https://docs.pytest.org/en/latest/
本リポジトリでは、Pipfile内で定義してある下記スクリプトで実行可能。
[scripts]
test = "pytest -v --cov=weatherlib --cov-report=html"
利用したプラグイン
pytest-mock
試験したいモジュールが利用するライブラリの返り値を操作することで様々な試験が可能。本リポジトリではYahoo APIから返ってくるレスポンスをモックしている。
pytest-cov
テストするモジュールのテスト網羅率(カバレッジ)を計測することが出来る。基本的に100%網羅するテストコードを書くべき。
pytest-randomly
記述されているテストの実行順番を毎回ランダムで実行してくれる。これによりテストの実行順番によっては全てPassしてしまうようなモジュールの不具合を検知することが出来る。(今回程度のテスト量ではあまり意味はないが、、、)
実行時のseed値をメモしておけば、失敗した手順の試験を再実行可能。
https://pypi.org/project/pytest-randomly/
(参考)Pytest vs Nose
noseを別プロジェクトで使ったことがあり、今回比較の意味でも利用してみた。、が今回利用した機能ぐらいでは大きな差は感じなかった。強いて言うならばPytestの方が書いたコード量が少し少なかったかな・・・。
まとめ
今回の背景には、Google Nest Hub+ラズベリーパイ+Yahoo気象情報APIを使って、「雨が降りそうになったら通知する」を組んでみようと思い立ち、ただ組むだけでなく、せっかくなのでモダンなPythonライブラリの開発スタイルを勉強してみたい、というところから始まった。
その勉強の中で、PipenvやPytest自体の記事は結構あるが、「じゃあ実際にリポジトリ内でどんな感じで管理しているの?」というのを示しているのは、そこまで多くない気がしたので、今回本記事を書いてみた。
リポジトリのリンクをもう一度貼っておく。
https://github.com/doara-developer/weatherlib
参考にしたリンク
とても勉強になりました、感謝いたします。
Pythonのパッケージ周りのベストプラクティスを理解する
https://www.m3tech.blog/entry/python-packaging
2019年に向けてPythonのモダンな開発環境について考える
https://techblog.asahi-net.co.jp/entry/2018/11/19/103455
Pipenvを使ったPython開発まとめ
https://qiita.com/y-tsutsu/items/54c10e0b2c6b565c887a
pytestのとりあえず知っておきたい使い方
https://qiita.com/kg1/items/4e2cae18e9bd39f014d4
pytest-mock を使ってみた #python
https://su-kun1899.hatenablog.com/entry/2019/03/11/020000
すぐに使えるpytestによるカバレッジ計測のコマンド
https://qiita.com/kg1/items/e2fc65e4189faf50bfe6