Pythonのpytest-watchモジュールでテスト駆動開発が捗った

## 概要

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``` を利用して仮想環境を用意していますが、なくてもおｋです。
環境が構築できたら、pytestとpytest-watchをインストールします。

```sh
> python --version
Python 3.6.6

> mkdir 任意のディレクトリ
> cd 任意のディレクトリ
> python -b venv venv
> . venv/bin/activate
> pip install pytest pytest-watch
```

適当に実装とテストを用意します。

```sh
> 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``` でテストを実行してみます。

```sh
> 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``` でもよいみたいです。

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


``` python:hoge.py
def hoge():
  return 'hoge!!!!'

```

```sh

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