pytest でTDDっぽいことをしてみる
ことのはじまり
この辺を見て, ちょっと真似てみようかなって思った.
後者で扱っていた fizzbuzz 問題を pytest で解いてみた.
リポジトリは ここ .
設定
$ pip install pytest
で, pytest を取得する
[pytest]
addopts = -v --ff
python_classes = T_*
python_functions = case_*
動画では, テストを日本語で書くことを推奨していた(一種のドキュメントだから).
てなると, デフォルトの識別名はちょっとあわなかったのでその辺も書き換えておく.
これで,
$ py.test
====================================================================================== test session starts =======================================================================================
platform darwin -- Python 3.7.5, pytest-5.3.5, py-1.8.1, pluggy-0.13.1 -- /Users/kaito/Playground/Python/TDD_Tutorial/src/.venv/bin/python3
cachedir: .pytest_cache
rootdir: /Users/kaito/Playground/Python/TDD_Tutorial/src, inifile: pytest.ini
plugins: cov-2.8.1
collected 5 items
run-last-failure: rerun previous 2 failures first
test_fizzbuzz.py::T_その他::case_1を渡したら文字列1を返す PASSED [ 20%]
test_fizzbuzz.py::T_その他::case_2を渡したら文字列2を返す PASSED [ 40%]
test_fizzbuzz.py::T_3の倍数::case_3を渡したらFizzを返す PASSED [ 60%]
test_fizzbuzz.py::T_5の倍数::case_5を渡したらBuzzを返す PASSED [ 80%]
test_fizzbuzz.py::T_15の倍数::case_15を渡したらFizzBuzzを返す PASSED
という感じでテストが行えるようになった
Fixture の利用
pytestでは, fixture でDIしつつ, 初期化を共通化できるのでその辺も使った
@pytest.fixture
def fizzbuzz():
return FizzBuzz()
class T_3の倍数:
def case_3を渡したらFizzを返す(self, fizzbuzz):
assert fizzbuzz.convert(3) == "Fizz"
便利〜
githooks
おまけにローカルで自動テスト回るようにしてみた.
.githooks/pre-push
#!/bin/bash
git rev-parse --show-toplevel && cd src && py.test
これで, push 前に自動テストが走るので安全.