St_Hakky’s blog

Data Science / Human Resources / Web Applicationについて書きます

【Python】テスト駆動開発(TDD)について

こんにちは。

最近、「テスト駆動Python」という本を読んで、「弊社の開発チームでは取り入れていませんが、そういえばテスト駆動開発とかもあるなぁ」、と思って、ぼんやりとは知っていたものの、ちゃんと調べたことがなかったので、調べてみました*1

f:id:St_Hakky:20200503131351p:plain

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

テスト駆動開発とは、テストファーストなプログラムの開発手法のことです。プログラムの実装前にテストコードを書き、そのテストコードに適合するように実装とリファクタリングを進めていく方法を指します。

テスト駆動開発には、そこから派生したものもあるようで、BDD*2とかもあるようです*3

テスト自体は、「ちゃんと動くか」を確認し、保証するため*4に行うものですが、それが満たされるようにプログラムの実装を行い、最後にリファクタリングをすることで、「ちゃんと動いて、綺麗なコード」を実現することができます。

実践のサイクル

テスト駆動開発には、「Red -> Green -> Refactor」の3つのステップがあります。それぞれここで紹介していきます。

Red:テストケースの設計

ここでは、求められている機能を満たすためには、どのようなテストが通るべきかを洗い出します。

「Red」というのは、テストが失敗した時の状態のことをさし、テストケースを作成して、実行した時にエラーが起きている状態が正常で、これを確認することから始めます。

ちゃんと書けていれば、実際の機能を書く実装に入ってないので、テストケースは失敗すると思いますが、それを確認することで、テストコードが正常だというテストもできるという感じです。

Green:実装してテストを通す

最初にテストだけを設計して、「Red」になった状態から「Green」な状態にします。

ここでは、実装の綺麗さは問わず、前に設計したテストが通ることだけを考えて、実装します。

Refactor:テストが通る状態を維持してリファクタリング

「Green」の状態で、テストが通った状態になりますが、ここで「Refactor」のフェーズに入ります。ちゃんとコードを綺麗な状態にしていくという感じです*5

参考

以下の和田さんの動画がわかりやすかったです。動画の中で、ライブコーディングも行なっているのですが、テスト駆動開発の参考としてすごくわかりやすかったです。

特に、テスト駆動で開発する時の機能要件の詳細化のところとかは、テスト駆動で開発することで、機能をブレイクダウンして開発することが自然とできるんだなとなりました。

TDDに関する議論

いろんな記事

この手の開発手法は、議論の火種になりがちですが、調べていく過程でいくつかそういった記事を見かけました。

ケースによって向き不向きはあるような無いような、、、実際にやってみながらかなぁ。

やってみた感想

テスト駆動開発の流れ自体は、普通に自分一人でコードを書く時にも始められるので、今のプロジェクトでも普通にテストは書きますし、先日機能を書いた時にやってみたのですが、テストコードをを最初に書くことで、「テスト書くのめんどくせぇ」みたいな気持ちにもなりにくいですし、仕様の整理がちゃんとできて、問題のスコープを小さく区切ることもできて、コードも書きやすかったです。なんか、脳みそをステップに分解してやることができる気がします。

あと、色々書いて、最後テストが通ると「イェーイ」ってなりますした笑*6

デメリットとしては、TDDに限らずですが、テストコードのメンテナンスにがっつり時間が取られるところとかぐらいかな、と思うので、普通にほそぼそとやってみようと思います笑。

以下の記事では、ミクシィのTDDの事例ですが、メリットやデメリット、適するプロジェクトとそうでないプロジェクトなどが紹介されていて、とても参考になりました。

他にも以下の記事に紹介されているところをみて、もっとテストコード周りの理解を深めていこうかなと。


それでは。

*1:N番煎じな記事ですが、自分でまとめた方が頭に残るので

*2:Behavior Driven Development、振る舞い駆動開発

*3:私はあまり知らないですが

*4:テスト設計に抜け漏れはどうしても出てくるのですが、少なくとも設計して試験した範囲では

*5:あとで綺麗にするって結構アレになることが多いので、都度綺麗にしないといけないんだろうなぁという小並感

*6:まぁ、別にテストコード通るようにするのはいつものことなんですが笑