Jasmineを使ってTDDをやってみる
はじめに
テスト駆動開発(TDD)が実際にどんな感じか知りたくて、実際にやってみることにした。仕事では直接やっていないし、コード書いてたのもだいぶ昔なので、イチから調べつつ、やってみる。まだコードが未完成だけど、忘れないようにメモしておこう。
言語とかFWとか
- 言語はJavaScript。
- テスティングフレームワークは、Jasmine。なんとなく。
- せっかくなので、Githubにてコード管理。
やったこと
- Github登録
- Jasmineインストール
- Gitインストール
- 2つFunctionを作ってみる(題材:オセロ、Function:オセロを置く、ひっくりかえす(途中))
わかったこと
まだ1つのファンクションしか作ってないけど、一連のテストコード書いて、テスト実行して、実装して、ということをやってみたので、所感を書こうと思う。
結論として、実際に試してよかったと思う。書籍やサイトに情報はあるけど、実際いやってみたほうがどんなものかを理解するのが早いと思う。
環境準備系はググれば何とかなる
- 1~3は、ネットでやり方がたくさんでてるので、簡単にできた。最近は、プログラミング始めるまでの障壁がだいぶ低いな~と実感。
言語と題材選定間違えたかも
- 今回の趣旨はTDDをやってみるだったのだが、JavaScriptをやったことがなかったので、言語の調査で時間がとられている気がする。
- 題材も、雰囲気でオセロにしてみたけど、今回の趣旨からすると、UIがない、もうちょっとシンプルなものでもよかった。
もう少し考えればよかったところはあったけど、今回の目的は達成したし、個人でやっていることだからこれでよしとする。
テストコードを先に考えるということ
- 先にテストコードを考えるという思考になかなか慣れない。テストコードというか、実際は「そのファンクションに何の値を入れたら、どういう結果が返ってくるはず?」ということを先に考えるということなのだけど。本来なら決められないはずがないのだけど、考え込んでしまう。ファンクションの役割や設計がふわっとしているということなのだろうと思う。
- 重複排除と新規機能追加を同時にやりたくなる。本当ならば、重複排除⇒既存のテストコード実行(OK)⇒新規機能のテストコード書く⇒テストコード実行(NG)⇒新規機能の実装⇒テストコードの実行(OK)というようにテストコードが先に書かれるプロセスなのだろうと思うが、ソースをいじっていると、一気に直したくなる。
- 実装書く前に考え込む時間が少ない気がする。キチンとテストコードを書いてからこのテストコードが通る実装をしようと思えば、実装するコードは単純になる。この処理は外だししたほうが良いかも、とか、重複してるからまとめないと、とか、コードを書く前に考え込むことが少なくなる。この辺はリファクタリングでやればよい、という整理ができる。
- 早く動くものを作ろう、ということなのだなと思った。作っている側も、精神衛生上、小さい達成感が得られるので、気分が安定する。
- テストコード書く⇒テスト実行する⇒実装する⇒テスト実行するを早く回したくなる。リズムがうまれる。
テストコード自体の品質
- テストコードのメンテ(特にテストデータの部分)は気を付けないと、煩雑になりそう。ただ、それもテスト対象の作りによるかもしれない。
- これは、実務ではそんなことはないと思うが、開発する人がテストコードを書くときに、「テストをする」という意識で考えるのは難しいかもしれないと思った。プログラミングの一環として、仕様としてこうなるはずということは書ける。ただ、さらに踏み込んで、プログラム構造を意識したテストとか、ブラックボックステストの中でも境界値のテストみたいなところは、ちゃんとそういうテストが必要だと思ってないと、意識から抜けてしまうかもしれない。まあ、そういうテストを開発のフェーズでやるかどうかということも、ポイントではあるけど。
次やること
- ローカル環境にCI環境を作って、Jasmineを自動実行してみる
- UIテストの自動実行をしてみる
CI環境の構築は絶対やります。UIテストはちょっと時間かかりそうだけど、やりたいな。