22
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

テスト駆動開発(TDD)

Posted at

TDD(テスト駆動開発)

image.png

最近、テスト駆動開発で有名なt_wadaさんのワークショップに参加しました。
テスト駆動開発?いまさら?と思うでしょうが、自分にとっては新しい知識だったので、まとめてみました。

TDD(テスト駆動開発)とはなにか

wikipediaより

プログラム開発手法の一種で、プログラムに必要な各機能について、最初にテストを書き(これをテストファーストと言う)、そのテストが動作する必要最低限な実装をとりあえず行った後、コードを洗練させる、という短い工程を繰り返すスタイルである。

TDD(テスト駆動開発)の何がいいか?

image.png

目指すべきコードが、

  • 動作する
  • 綺麗なコード

であった場合。そこに到達する方法は2通りある。

  1. しっかり設計してから、実装する。(赤い矢印) → 従来の手法
  2. 汚くてもいいから実装から入り、コードを洗練させていく。(青い矢印) 

それぞれ罠がある!!!

<1の場合の罠>

  • 「きれいで動かない」という状態から抜けられない。

    → つまり、「きれいな設計にしたい」という欲求から抜けられない。完璧を求めてしまう。
  • システム開発にはスケジュールがある。
  • コードを書き始めてから、いろいろ分かり始める。

    → 「ここまで設計する必要は無かった」とか「きれいな設計だけど遅すぎて使えない」とかが分かり始める。
  • ソフトウェア開発は登場人物が多すぎるので、予測が立ちにくい。

    → 手を動かしてみて初めてわかる。

<2の場合の罠>

  • 動くけど汚いシステムが出来上がる。
  • 綺麗にするのは、後回し。とりあえず動いたんだからいいじゃん。という怠慢が生まれる。
  • 新しい機能の追加が優先される。
  • 結果、とんでもなく保守性の低いコードが出来上がる。
  • 最初はまだいいが、膨れ上がると手をつけられなくなる。
TDDは、黄金の回転を細かく早く回すことで、心理的な苦痛であった、綺麗なコードに直すというところを突破する(黄色矢印)

黄金の回転

image.png

TDDのサイクル(黄金の回転)
・TDDでは、テストコードとプロダクトコードを交互に書きながら進めていく。
・TDDとは、サイクル。
・まず、「やることリスト」を作る。
・そこから1つだけ、やりたいことをピックアップする。
・そのテストコードを書く。
・テストコードを動かすと、プロダクトコードを実装してないので絶対に失敗する。(赤色になる)
・目的のコードを書く。テストを通すことを第一に考える。
・さっき書いたテストが成功する。(緑色になる)
・目標を満たす状態になったので、今度はコードの方をきれいに直すフェーズになる。それがリファクタリング。

TDDの基本テクニック

テストファースト

仮実装(テストのテスト)

いきなり本格的なコードから入ると、テストに失敗した時にテスト自体がおかしいのか?、それとも実装したコードがおかしいのか?、判別できなくなる場合があるので、必ず仮実装をして、テストを通過させる。

三角測量(Triangulation)

そのテストがたまたま通過したということが起こらないように、状況によって、2つ以上の値を使用しテストを書く。
先ほどの仮実装は、この三角測量でテストに落ちるはず(想定内のエラー)なので、明白な実装へと進む。

明白な実装(Obvious Implementation)

仮実装で、テストのテストが済んだら、
本格的な実装に入っていく。

実際どう書くか?

22
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?