概要
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
を編集してみます。
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