pytestに入門してみる

この辺を参照してみた。

pytestとpytest-mockでPythonのユニットテストを始めよう - Qiita

pytestのとりあえず知っておきたい使い方 - Qiita

pytest入門 - 闘うITエンジニアの覚え書き

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

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系を使っているので、必要ないと思っていた。

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

pytestの使い方と便利な機能 - Qiita

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

Packaging a python library | ionel's codelog

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

まとめと展望

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

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

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