1.はじめに
- 自分が学んだものをアウトプットして見返すためです。
- 内容は、メリットとデメリット、具体的なやり方です。
2.メリットとデメリット
メリット | デメリット |
---|---|
品質の向上 | 時間と労力 |
リファクタリングのサポート | 学習曲線 |
設計の改善 | テストの保守 |
自己文書化 | 全てのケースを網羅しきれない |
信頼性の向上 | 過度の焦点 |
バグの早期発見 | 適さない場合もある |
協力とコミュニケーション | テストケースの保守 |
自己満足感 | テストのオーバーヘッド |
つまり、品質向上や信頼性の向上など多くの利点を期待できる。しかし、時間や労力がかかること、開発者の経験によるブレ幅で効果が異なる。簡単なスクリプト、緊急性のあるプロジェクトなど向いていないものもある。
アジャイル開発みたいに、開発者やステークホルダーが密なコミュニケーションがあるもの。品質向上を求めるものには向いている。
3.一連の流れ
要件から始まる
1. テストケースの作成(Redフェーズ)
- 新しい機能の追加や既存のコードを変更を加えたい場合、それに関連するテストケースを作成する。
- テストケースは、コードが期待される動作を評価するのが目的。この段階では、まだコードがないので、テストケースは失敗(Red)するはず。
sample.py
import unittest
class TestCalculator(unittest.TestCase):
def test_addition(self):
# 2 + 3 の結果が5であることをテストします
self.assertEqual(add(2, 3), 5) # この関数addはまだ存在しない
この段階では、'add'関数がないので失敗するはず。
2. テストケースの実行(Redフェーズ)
- 作成したコードを実行する。
エラーメッセージが表示される。テストが失敗したことが示される。正常である。
3. コードの実装(Greenフェーズ)
- テストケースが失敗したと確認したら、テストが成功するようにコードを実装する。
- このコードは、最小限の機能を実装することが一般的で、まずはテストをパスさせることを優先させる。
- コードを書いたら、再度テストケースを実行し、テストが成功を確認する。
成功したら、この段階のコードは安定していると言える。
sample.py
def add(a, b):
return a + b
'add'関数を実装して、テストケースは成功するはず。
4. リファクタリング(Refactorフェーズ)
- コードがテストをパスするようになったらリファクタリングを行う。コードの品質を向上させ冗長性を削除し、可読性を高めるためにコードを改善させる。
- テストが成功した状態で行われるため、コードが壊れる心配はない。
- この例では必要なし。複雑になったら行う。
5. テストの再実行(Greenフェーズ)
- テストコードを再度実行し、リファクタリングによってコードが壊れていないかの確認をする。
6. 繰り返し(1に戻る)
- 上記の手順を必要な分だけ行う。
- 新しい機能を追加する場合や既存のコードを変更する場合、それに対応する新しいテストケースを作成し、コードを追加または変更していくサイクルです。
- 例で言うと、機能の追加や変更(三平方の定理や加減乗除など)を追加したいならテストケースを作成して(以下略
4.所感
テスト駆動開発は、荒削りしてから徐々に細かく加工して完成品に近づけるものと感じた。
ex.参考資料
ChatGPT-3.5
Recursion