Showing posts with label TDD. Show all posts
Showing posts with label TDD. Show all posts

Saturday, 30 June 2012

Test Double について

TDD, BDDは使い慣れていない用語や普段使っている言語とは異なるソフトウェアサイエンスでの用法があるので、用語の理解が一つのハードルであると感じます。

この辺りはかなりソフトウェアエンジニアリングではなく、ソフトウェアサイエンスの領域に入ってくるんでしょうね。最近はビジネスに関連してソフトウェアエンジニアリングのアプリケーションばかりをしていますが、学生の頃にはサイエンスの方をしていたのが懐かしく感じます。

"Test Double"もその一つではないでしょうか?"Test Double" G. Meszarosという人が考えた言葉なそうです。本人の書いた記事にその内容が書かれています。是非オリジナルを当たってください。個人的に著者の言葉の使い方にはprecisionが欠けている箇所がある気がしますが。



Doubleというのは英語ではいわゆるそっくりさんのことですね。G. Meszarosの原文ではスタントマンを例にとってきています。上の図に表される様にG. Meszarosの定義では、Test DoubleにはTest Stub, Test Spy, Mock Object, Fake ObjectとDummy Objectが含まれます(このDummy Objectは正確にはTest Doubleには含まれないそうですが)。要は"Test Double"とはこれらの用語を総称した言葉ですね。

用語
SUT: System Under Test テスト対象のシステム
DOC: depended-on component 異存しているコンポーネント
indirect output: 公開APIでは見れないが、他のコンポーネントに送られているSUTからのアクション

以下、それぞれの意味というか使い方です。

- Test Stub: SUTから送られてくるメッセージを受け取るために使用。indirect outputを正常に受け取らないとSUTが正常に動作しないなどの場合に使用。

- Test Spy: SUTから送られてくるメッセージを受け取るために使用というのはTest Stubと同様だが、Test SpyはSUTから送られてきたindirect outputの内容を記録して、後でバリデーションに使用できるようにする。

- Mock Object: Test Spyと同様に使用。原著からは私はTest StubとTest Spyの違いが見つけられませんでした。

- Fake Object: 実際のDOCの疑似コンポーネント。実際のDOCと似た動きをするが、まだ実際のDOCが用意できていない時に使用する。また、実際のDOCではデータベースの読み込みに時間がかかりテストに適していないという場合には、Fake Objectのハッシュオブジェクトにデータを収納してテストに用いる。

- Dummy Object: SUTがパラメータにオブジェクトを必要とするときに渡すオブジェクト。中身の無いメソッドを実装したnull object 参照でも問題無い。Dummy Objectは原著では厳密にはTest Doubleではなく、Literal Value、Derived Value、Generated Valueに属するとされている。

Wednesday, 27 June 2012

RoR開発環境でのTDD, BDD導入書籍

TDDはとても良さそうだと思い、RoRのDSL (Domain Specific Language) であるRSpecを調べていくうちに書籍の紹介ブログを経てBDD (Behaviour Driven Development) に行き当たりました。TDDに関する書籍はJavaのコードを用いているものが多く、Rubyを主に使っている私にはとても便利です。RubyやRailsを使っている人が書いている本だけに文体もポップです。

BDDとは、もっと人間の目線をプログラム開発に導入していくということなのでしょうか?TDDがプログラムの挙動を予想、テスト、リファクターするのに対して、BDDはあるユーザの行動を予測、テスト、リファクターという視線で開発を進めるということではないかと理解しています。

BDDはプログラム開発のあらゆる過程で便利そうだなという気がしています。ただ学ぶことは多いですね…

”バイオコンピュータ”などという言葉が当たり前になっている頃には、”これをこういうタイミングでやって”と言葉で表現すればコンピュータが実行してくれるので現在のプログラミングという仕事自体の幅がかなり狭く一部の人しか必要とされなくなっているのでしょう。お払い箱になる、もしくはお払い箱になる前に新しい技術についていかなければならないというある意味脅迫観念は起きますね。

Wednesday, 20 June 2012

RoRとmongoidとRSpecでTDDことはじめ

RoRとmongoidとRSpecでテストを動かそうとしたところ、下のようなエラーメッセージが出ました。

undefined method `fixture_path=' for # (NoMethodError)

これに関してはすでに解決している人がいたので、ググって解決です。

Monday, 18 June 2012

"GROWING OBJECT-ORIENTED SOFTWARE, GUIDED BY TESTS"覚書

TDD: Test-Drive Development関連の書籍Steve Freeman/Nat Pryce (著) "GROWING OBJECT-ORIENTED SOFTWARE, GUIDED BY TESTS"を読んでいて良いなと感じた言葉がいくつかあるので覚書です。

What if a software wasn't "made", like we make a paper airplane - finish folding it and fly it away? What if, instead, we treated software more like a valuable, productive plant, to be nurtured, pruned, harvested, fertilized, and watered?

↑こんな具合にソフトウェアをオーガニックに扱うとソフトウェアを作る・メンテナンスする視点が違ってくると思います。

We should be taught not to wait for inspiration to start a thing. Action always generates inspiration. Inspiration seldom generates action. - Frank Tibold

↑何らかの考え・計画無しで動き始めることはできませんが、良い考えが浮かんだら行動に移してそのフィードバックを活かしていきたいです。行動をするのは私は怖いですが、怖いときはリスクを数字にしてみるとここまでのリスクなら許容できる、このラインを越えたらやめようという怖がりならではの対応ができます。

Friday, 13 January 2012

アジャイルへ

Jonathan Rasmusson の”アジャイルサムライ”(The Agile Samurai)を読みました。評判通り参考になります。私もこれからプロジェクト管理・アプリケーション開発の実践に活かしていきたいと思います。

私がアジャイルの肝だと感じたのは開発の中で下を実践すること

  • まずチームの一人一人にプロジェクト達成の責任感を持つ様に導く。チーム外にもプロジェクトに影響を与える可能性のある人を洗い出して協力をあおいでおく
  • プロジェクト発注者に細かく報告・デモをして積極的に関わってもらう状況を作ると同時に、開発側の継続的インテグレーションを実行する
  • 6ヶ月 - 人間が集中力を持続して一つのプロジェクトに取り組めるのは6ヶ月が一つのリミット
  • 1週間 - プロジェクトを1週間毎程度の小さなパックにして考え、イテレーションを組む
  • 1日 - テスト失敗-->テスト成功-->リファクタリング-->テスト失敗のサイクルはプロジェクトの終わりにするのではなく、1日に一度のサイクルで行う
  • 10分 - プログラミングの現場ではTDD(Test Driven Development)を実施して10分の単位で自動ビルドし、継続的にプログラムが動く状態を維持していく

通常、やりたいことは与えられた予算や時間より多いということを認識しておく。予定に応じて現実を変えるという奇跡を起こす期待には意味が無い。品質や納期は動かしがたいが、スコープは状況に応じて変える必用があることを認識する。

なお、この本が欲しいまたは借りたいという方がいましたらご連絡下さい。遠方の場合は着払いなでどでお譲りします。