名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。アクセス解析のためGAを利用、Googleに情報を送信しています。商品紹介のためAmazonアフィリエイトを利用、Amazonに情報を送信しています。記事に関しては私が書いていない引用文を除いて自由にご利用ください。

最近Qiitaに書いた記事(2019/06/09)

そんなに真面目に書いていないが、これまでやったものの追従でないものは少しづつ外出しするようにしている。(逆に言えば、追従しているものについては、はてなブログとかでやってみた、で十分と考えてるのでこちらに書いている)

暇があれば、また書いていくと思います。(最近忙しいような気がするので、余裕があるかわかりませんが)

pytestに入門してみる

この辺を参照してみた。

qiita.com

qiita.com

www.magata.net

とりあえずハマったところ

Pipenvの dev-package に書いたので、インストール忘れた

pipenv install --dev するのを忘れてはいけない(戒め)

ディレクトリ構成

[06/08 20:42:19] $ tree                                                                                  (git)-[master]
.
├── PipFile
├── Pipfile.lock
├── src
│   └── script.py
└── tests
    ├── __init__.py
    └── test_script.py

自分のローカルは最終的にこうなっているのだが、途中まで何度やっても下記エラーが出続けた。

[06/06 22:29:10] $ pipenv run pytest                                                                     (git)-[master]
================================================= test session starts ==================================================
platform darwin -- Python 3.7.3, pytest-4.6.2, py-1.8.0, pluggy-0.12.0
rootdir: /Users/yumechi/python_practice/study/pre-commit
plugins: mock-1.10.4
collected 0 items / 1 errors                                                                                           

======================================================== ERRORS ========================================================
________________________________________ ERROR collecting tests/test_script.py _________________________________________
ImportError while importing test module '/Users/yumechi/python_practice/study/pre-commit/tests/test_script.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_script.py:3: in <module>
    from src import script
E   ModuleNotFoundError: No module named 'src'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
=============================================== 1 error in 0.14 seconds ================================================

要はモジュールインストールに失敗しているのだが、これ tests/__init__.py がないことが原因だったらしい。てかなんで必要なんだ…? みたいなことを思ったが、これを足したら正しくテストが回るようになった。むずい。環境は3系を使っているので、必要ないと思っていた。

どうやら、この記事を見た限りでは、様々なユースケースに対応するため必要になるらしいということを理解した。(むずい)

qiita.com

リファレンスされてる記事はこれ。

blog.ionelmc.ro

ともあれ、 __init__.py を配置することでテストは無事に回るようになった。よし。

まとめと展望

pytest が動くようになったので、テスト駆動開発もこれで可能になりました。ということで。

最近自分自身のコードに対して感じていることとして、テスト不可なモジュール分割をしている可能性があるという可能性があり、インプット・アウトプットを変更することなくリファクタリングできました! ということが難しい状況が存在している。なので、失敗していないこと・影響していないことを保証しつつ、コードを改善していくことが難しいのである。(プログラミングスキルを上げるためには、そろそろこのあたりを自分自身で完結して出来なければいけない)。

テスト設計とか、ユニットテスト入門みたいな本を読み漁りつつ、もう少し良いコードを書けるようコード設計を考えていかなければいけないなあというのをしばらくの課題としてみたいと思った。

Pipenvとpre-commitを使ってみる

仕事でPythonを使っていることもあり、PyCharmにフォーマットを任せているが、実はFlake8通らないようなフォーマットパターンになっていたりする。

なので試しがてらやってみることとする。

またPythonの仮想環境としてはpyenv等があるが、pipでインストールしたライブラリ群が本当にそのリポジトリ内で必要なものなのか、判断がつかず実は不要…! とか、有り得そうだった。似たようなライブラリがぶつかって挙動が不安定になりそうな可能性もある。一方、Pipenvはそのリポジトリ、そのディレクトリ単位で仮想環境を作れるっぽいので( .venv フォルダがディレクトリ内にでき、そちらを参照するようだ)、これも試してみる。

Pipenvをためす

qiita.com

これを見ていれるところだけ真似する。

pipenv-ja.readthedocs.io

あとは公式ドキュメントのちょっと古い日本語版を参照してみる。結果的にこういうPipfileを書いてみた。

[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[packages]
requests = '*'

[dev-packages]
pytest = '*'
pytest-mock = '*'

[requires]
python_version = '3.7'

ここからPipfileのあるディレクトリに行って、 pipenv shell すると仮想環境がゴリゴリできた。すごい。

必要なパッケージのインストールは pipenv install とか pipenv install --dev とか出てきた。あとは python src/script.py で動いた。簡単やん。

とりあえず必要なコマンドをあまり理解できていないので、随時覚えていこうと思う。

pre-commit を使ってみる

qiita.com

ljvmiranda921.github.io

これを試してみただけ。 pre-commit は pyenv 側に入れたが、もしかしたらこれも Pipenv で管理したほうが良いのかも。

流れとしては Black でフォーマットされた後、 Flake8 でフォーマットの検査を行うという形になっている。

ほんとにフォーマットされてコミットされるが、差分が見えなかったり、うまくフォーマットされてないっぽい時もあり、原因がよくわかってない(おそらくこれは Black が何たるかのほうを理解できていない可能性が高い)

あとFlake8で落ちるとcommitが中断される。キビシイネ。まあフォーマットメチャクチャなコード投げ込まれても困るし、まあいいか。

まとめ

Pipenvは予想通り使いやすい感じだった。仮想環境がガンガンできるとローカルのディスク容量が気になるが、まあ大丈夫でしょう(私みたいにMBAの128GBとか使っていると、ちょっと意識してないといけないかも)。これまで pyenv ないし、 pyenv-virtualenv でやってきたけど、あれは高度に人間が開発環境を覚えていたりしなくてはいけなかったり、インストールしてるパッケージを覚えていないといけない問題があった。Pipenv はそのへんの人間の記憶の厳しさから開放されそうな感じがするので、良さそう。これからもう少しやってみよう。

あと pre-commit について。 1時間位でサクッとやってみて、新しいコードを書いたものに適用させてみたのだが、そんなに長いコードにかけていないので、あんまり実感がわかなかった。それと差分に対してだけ反応するのかなーとか、そういうのはちょっと気になる。途中から導入するのとか難しいとかはやだなーと。とはいえ、毎回自分がコードフォーマットかけなくても勝手にやってくれるのは良さそうだし、これももう少し設定にこだわってみてもよいのかも。うまーいこと設定できたら自分の Dot ファイルリポジトリ.pre-commit-config.yaml , .flake8 , pyproject.toml とかを追加してみてもよいのかも。(Blackの設定は pyproject.toml に書かれるけど、この辺の設定方法もコピペなのでよくわかってない)

これまで周辺ツールを使ってコード品質とか、開発環境とかの分析をサボってきましたが、なるほど~と思えることも多かったし、便利だなと感じたのでもう少し模索していきたいところです。