名もなき未知

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

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 が動くようになったので、テスト駆動開発もこれで可能になりました。ということで。

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

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