はじめに
数か月前に新しいメンバーが加わり、テスト駆動開発を一緒にやったので振り返りを兼ねて簡単にまとめてみます。
テスト駆動開発についてはこちらの動画を参考にしています。
やってみた所感
- 開発初期段階でやることの共通認識をとれる点が良い!新しいメンバーも置いてけぼりにしない!
- やることが決まっている&テスト駆動開発の手順も決まっているので、ペアプロ、モブプロとの相性が良い!
- 後からテストを入れないといけない…と考える必要がないので安心感がある!
- たまにテストより先にメソッドを実装しようとしてしまい、メンバーからストップがかかる
テスト駆動開発の流れ
TODO(目標)を考える
ここでは簡単なテストケースを実装していきたいと思います。
- 正しいデータを取得できること
テストを実装する①
以下のようなテストケースを先に実装します。
この時点でget_users()は実装していないため、テストを実行してundefinedエラーが出ればOKです。
app/tests/test_methods.py
def test_get_users():
response = get_users()
assert reaponse == 1
メソッドを実装する①
次にget_users()を実装します。
app/folder/methods.py
import requests
def get_users(token: str):
return 1
忘れずにテスト側でメソッドを呼び出してあげましょう。
app/tests/test_methods.py
from folder.methods import get_users
def test_get_users():
response = get_users()
assert reaponse == 1
この状態でテストを実行するとundefinedエラーは解決され、テストも通ります。
テストを実装する②
最低限のメソッドを実装し、テストを通したところで再びテストから実装していきます。
今回は「外部APIからデータを正しく取得できているか」、のテストを実装します。
app/tests/test_methods.py
from unittest.mock import patch
from folder.methods import get_users
@patch('requests.get')
def test_get_users(mock_post):
mock_post.return_value = [
{
"id": "1",
"name": "taro"
},
{
"id": "2",
"name": "hanako"
}
]
response = get_users('token')
assert response[0]["id"] == "1"
assert response[1]["id"] == "2"
assert response[0]["name"] == "taro"
assert response[1]["name"] == "hanako"
この状態でテストを実行すると、assertionエラーが出ると思います。
メソッド側では1を返しているのに対して、テスト側で期待している値と異なるためです。
メソッドを実装する②
テストを実装したらそのテストが通るようにメソッドを実装していきます。
app/folder/methods.py
import requests
def get_users(token: str):
url = f"https://hogehoge"
response = requests.get(url=url, headers=set_headers(token))
return response
この状態でテストが通ることを確認できればOKです。
リファクタリング
最低限の実装でテストが通るようになったら、最後にリファクタリングを行います。
(本記事では割愛します)
おわりに
テスト駆動開発は楽しいので好きです。何事も最初が肝心ですね。