概要
Pythonのテストツールの定番のpytestですが、watch
オプションがないので、実装するたび、コマンドをせっせと実行する必要があって面倒だったので、調べてみたら、pytest-watchという素敵ツールがありました。
pytest: helps you write better programs
https://docs.pytest.org/en/latest/
pytest-watch -- Continuous pytest runner
https://github.com/joeyespo/pytest-watch
pytest-watch a zero-config CLI tool that runs pytest, and re-runs it when a file in your project changes. It beeps on failures and can run arbitrary commands on each passing and failing test run.
テストに失敗するとビープ音を鳴らしたり、テスト後にコマンド実行もできたりするみたいです。
使い方
実行環境を用意します。Pythonは3.6.6を利用しています。
ここではpyenv
を利用して仮想環境を用意していますが、なくてもおkです。
環境が構築できたら、pytestとpytest-watchをインストールします。
> python --version
Python 3.6.6
> mkdir 任意のディレクトリ
> cd 任意のディレクトリ
> python -b venv venv
> . venv/bin/activate
> pip install pytest pytest-watch
適当に実装とテストを用意します。
> cat <<EOF > hoge.py
def hoge():
return 'hoge!!!'
EOF
> cat <<EOF > hoge_test.py
from hoge import *
def test_hoge():
assert hoge() == 'hoge!!!'
EOF
まずはpytest
でテストを実行してみます。
> pytest
======================================= test session starts ========================================
platform darwin -- Python 3.6.6, pytest-3.8.2, py-1.7.0, pluggy-0.7.1
rootdir: 任意のディレクトリ, inifile:
collected 1 item
hoge_test.py . [100%]
===================================== 1 passed in 0.15 seconds =====================================
はい。
次にpytest-watchで実行してみます。
ptw
でもpytest-watch
でもよいみたいです。
> ptw
[Sat Oct 13 14:57:58 2018] Running: py.test
======================================= test session starts ========================================
platform darwin -- Python 3.6.6, pytest-3.8.2, py-1.7.0, pluggy-0.7.1
rootdir: 任意のディレクトリ, inifile:
collected 1 item
hoge_test.py . [100%]
===================================== 1 passed in 0.04 seconds =====================================
はい。こちらは、コマンド実行が終了せずに待ち受け状態になります。
テキストエディタでhoge.py
を編集してみます。
def hoge():
return 'hoge!!!!'
Change detected: hoge.py
[Sat Oct 13 14:58:22 2018] Running: py.test
======================================= test session starts ========================================
platform darwin -- Python 3.6.6, pytest-3.8.2, py-1.7.0, pluggy-0.7.1
rootdir: 任意のディレクトリ, inifile:
collected 1 item
hoge_test.py F [100%]
============================================= FAILURES =============================================
____________________________________________ test_hoge _____________________________________________
def test_hoge():
> assert hoge() == 'hoge!!!'
E AssertionError: assert 'hoge!!!!' == 'hoge!!!'
E - hoge!!!!
E ? -
E + hoge!!!
hoge_test.py:4: AssertionError
===================================== 1 failed in 0.45 seconds =====================================
ファイルの変更検知後、テストを実行してくれました。
素敵です。
参考
pytest: helps you write better programs
https://docs.pytest.org/en/latest/
pytest-watch -- Continuous pytest runner
https://github.com/joeyespo/pytest-watch