up:: Programming

Test Driven Develop。テストを中心にして開発していく方法。

  1. 網羅したいテストシナリオのリスト(テストリスト)を書く
  2. テストリストの中から一つだけ選び出し、実際に、具体的で、実行可能なテストコードに翻訳し、テストが失敗することを確認する
  3. プロダクトコードを変更し、今書いたテスト(と、それまでに書いたテスト)を成功させる。(その過程で気づいたことはテストリストに追加する)
  4. 必要に応じてリファクタリングを行い、実装の設計を改善する
  5. テストリストが空になるまでステップ2に戻って繰り返す

これとは違う方法で上手くいっているならそれでいい。

概要

TDDは以下にシステムを導くための物。

  • それまで動作していたものは全て動作する
  • 新しい振る舞いは期待通りに動作する
  • さらなる変更の準備が出来ている
  • プログラマ及び同僚がその点に自信を持っている

インターフェイスと実装の分離

設計は二種類ある

  • ある振る舞いはどのように呼び出されるべきか
  • システムはその振る舞いをどう実装すべきか

前者が論理設計、後者が物理設計と呼ばれる。
物理設計をより洗練するのがリファクタリング。

1. テストリスト

新しい振る舞いに対し、プログラムに期待される動作をリストアップする
内部実装は後で。

2. ひとつテストを書く

準備、実行、検証(アサーション)が備わった、自動化されたテストを一つ書く。
時にはアサーションから書き始めてもいい。
この時点では失敗していい。

テストコードを書いている時の設計判断は主にインターフェイスの設計。
実装の設計判断は後で。

アサーションは絶対必要。
テストリストから一つだけ選ぶこと。いきなりテストリスト全部のテストを書いてはならない。

3. テストを成功させる

システムを変更し、テストを成功させる。

成功判断はアサーションに頼ること。アサーションを削除して成功したことにしてはいけない。

テスト対象を動かしたときの値を、テスト内の期待値に使ってはいけない。
テストはチェックのためにある。変更すべきはシステム。

この過程にリファクタリングを混ぜてはならない。
一度に一つのことだけをシンプルに。

この過程で新たなテストの必要性が出たら、テストリストに追加。
その気づきがこれまでの作業を無駄にしてしまう場合は、状況に応じて進めるか初めからやり直すか選ぶ。
(やり直す場合は、別のテストを選ぶといい)

テストが成功したらチェックを付けてリストから消す。

4. 必要に応じてリファクタリング

ここでようやく実装の設計判断。
テストに応じて変更を入れた部分を整頓する。

必要以上のリファクタリングをしてはいけない
次のテストが待っている。

早すぎる抽象化は良くない。
重複はヒントであって、指令ではない。

切っていいプロセスではない。
小さなリファクタリングを続ける。

5. テストリストが空になるまで2. に戻って繰り返す

コードの動作に対するフランが退屈に変わるまで、
テストとコーディングを続ける。

捕捉

以下はTDDの必要条件だが十分条件ではない。

  • テスティングフレームワークを使ってテストするのは自動テスト。
  • 開発者が自分でテストするのは開発者テスト。
  • テストコードを実装よりも前に書くのはテストファースト。

効果が大きいのは自動テストと開発者テスト。
テストファーストやTDDはオマケ。

構造的結合に注意

テスト対象の構造に強く依存したテストを書いてはならない。

品質保証としては物足りない

誤りが無いことは保証しない。

時間が経つとテストを書く難易度は上がる

実装を知らないとテストできない。
その為、最も楽なのは実装前にテストを書くこと、つまりテストファースト。
こうでもしないとテストは書けない。

考えすぎ、やりすぎに注意

不要なものを詳細に設計してはならない。スコープクリープという。

修正性(変更可用性)は保証しない

試験性はばっちり。

インクリメンタル・イテレーティブ

繰り返し、少しずつ書く

大きな視野を忘れず

大きなものを小さく分割できる、目の前に集中できるやり方だが、
その分だけ要らないものが増えるかもしれない。
リファクタリングで適宜消していく。

【翻訳】テスト駆動開発の定義 - t-wadaのブログ
保守しやすく変化に強いソフトウェアを支える柱 自動テストとテスト駆動開発、その全体像 ~Software Design 2022年3月号「そろそろはじめるテスト駆動開発」より | gihyo.jp

テスト・設計研修【MIXI 24新卒技術研修】

これを降霊して(t_wada の TDD で進めてください)PRレビューしてもらう方法がある。(t_wada さんになってこの PR を確認し、テストケースが充分かをレビューしてください [PR URL])

降霊術で t_wada を AI に降ろして PR レビューして貰うテクニックが伸びたのでその裏側記事を書きました!|Ryo@VibeCoder