UnitTestで定時帰宅!             船戸 隆        2009/06/19
Agenda• ユニットテストとは• なぜユニットテストを書くの?• ユニットテストの書き方• まとめ
ユニットテストとは
そもそもテストとは• ソフトウェアテスト > コンピュータのプログラムを実行し、正し  く動作するかどうか確認する作業 > プログラム中の欠陥(バグ)をできる限り  多く発見することを目標として行われる > ソフトウェアテストに成功するとは、欠...
ユニットテストとは• 単体テスト(Unit Testing) > 単体テスト、あるいはユニットテストと     は、メソッドなどの小さな単位で行うテス     トのことである。単体テストは、ホワイト     ボックステストを利用して行われる場合...
ユニットテストとは• アジャイルな開発手法で必須 > 仕様通りに動くか確認• ユニットテストが仕様書にもなる > ドキュメントはメンテナンスがされなくな  る        アジャイルフトウェア開発 > 動いているものが正解        迅速...
ユニットテストの問題点• まとまった報告書として残りにくい > 小さなモジュールの単位なので• 個人差が出やすい > 各個人のレベルのテストケースになりがち  規約、計画、レビューでカバーしよう
なぜユニットテストを書く     の?
なぜユニットテストを書く          の?• 問題を小さなうちに摘み取る• 問題の発生を初期の段階で防ぐ• 仕様の確認               あなたの書い• 使い方がわかる      たコードは本               当に正...
問題を小さなうちに摘み取る• 問題を小さなうちに摘み取る > ハインリッヒの法則  • 1件の重大災害の裏には、29件のかすり傷程度   の軽災害があり、さらにその裏にはケガはな   いものの300件のヒヤリとした体験が存在して        ...
問題の発生を初期の段階で防            ぐ• 問題の発生を初期の段階で防ぐ                      リリースする前の > 動かない                問題発覚と                     リ...
仕様の確認• 仕様の確認 > アジャイルな開発では実装のよりどころと  するドキュメントが少ない。実装を説明す  るよりもテストコードを見たほうが早い > 机上の設計書よりも動くコード
使い方がわかる• 使い方 > ユニットテスト見れば、そのクラスの使い  方、何をしているかわかる > 学習テスト   学習したいライブラリなどをユニット           テスト書いて実行して使い方や内容を           確認します。書...
ユニットテストの書き     方
ユニットテストの書き方• 計画しよう• 規約を作ろう• ツールを使おう            書けばいいって            もんじゃない!
計画しよう1.仕様の理解2.仕様の観点からテストケース抽出3.プログラム構造の理解(設計)4.プログラムの観点からテストケース抽出5.テストシナリオを考える
規約を作ろう ・場当たり的なテストはしな                      い。• 書き方の規約              ・環境に依存したテストは注                      意 > テストメソッドの規約       ...
ツールを使おう• ツール > Junitはあたりまえ   • Junit4を使いましょう。アノテーション便利 > Seasar周りのテストツール > Eclipseプラグイン   • Seasar使ってるならS2Junit4 Pluginを入れ...
ツールを使おう• Junit  > Greenになると気持ちいい  > 以下略
ツールを使おう• S2JUnit4  > できること    • 自動フィールドバインディング    • DBアクセス       – DataAccessor    • MockIntercept       – インターフェースなしでメソッド...
ツールを使おう• S2JUnit4 Plugin for Eclipse  > もともとはQuickJunitの派生  > Ctrl+9でテストコードと実装コードを行   き来  > Ctrl+0でテスト実行、Ctrl+Shift+0でデバッグ...
ツールを使おう• Maven2  > mvn testでテスト実行  > mvn siteでテストリポート作成    • テスト結果とかカバレッジとか
ツールを使おう• Hudson  > 「継続的インテグレーション」   (Continuous Integration )    • ファウラーたんによって広められた    • 別々に開発された部品を持ち寄ってお互いの     動作を検証する「...
S2Junit4を掘り下げてみる• 自動フィールドバインディング > ルール  • バインディング対象のフィールドは非static、非final、   非プリミティブ型かつnull  • フィールドの変数定義がインターフェース型でそのイン   ...
S2Junit4を掘り下げてみる• DBアクセス > フィールドにDataAccessorを追加してお  くとDBを操作できるAccessorが自動でDI  される  • DBからデータを取り出せる  • Excelからデータを取り出せる
S2Junit4を掘り下げてみる• MockIntercept  > メソッドを呼び出した結果を自由に変更で   きる  > 個別のDiconファイルで定義する  > モックを使ってテストできる    • LogicのテストをしたいのにBhvが...
S2Junit4を掘り下げてみる   • MockIntercept        > モックにしたいクラスにAOPで                 <component class="examples.aop.Hello">        ...
S2Junit4を掘り下げてみる• テストデータを自動で用意 > ExcelにDBに入れたいデータを書いとくと  勝手にDB入れてくれる > 検証用データも同じ > 規約はs2junit2.dicon > クラス名.xls > クラス名_Exp...
まとめ
ユニットテストをしっかりや           ると• 仕様変更に強くなる > テストがあるから変更にも強い!• ソースコードの保守がしやすくなる > メンテナンスコスト低減• 品質が上がる > 最初の時点でバグつぶし > 要求に対する適合度•...
その結果・・・
障害の少ない堅牢なシステム メンテナンスが楽チン
障害の少ない堅牢なシステム メンテナンスが楽チン
障害の少ない堅牢なシステム メンテナンスが楽チン    作業が減るので定時帰        宅!
Upcoming SlideShare
Loading in …5
×

Unit testで定時帰宅!

3,011 views

Published on

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,011
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
7
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Unit testで定時帰宅!

    1. 1. UnitTestで定時帰宅! 船戸 隆 2009/06/19
    2. 2. Agenda• ユニットテストとは• なぜユニットテストを書くの?• ユニットテストの書き方• まとめ
    3. 3. ユニットテストとは
    4. 4. そもそもテストとは• ソフトウェアテスト > コンピュータのプログラムを実行し、正し く動作するかどうか確認する作業 > プログラム中の欠陥(バグ)をできる限り 多く発見することを目標として行われる > ソフトウェアテストに成功するとは、欠陥 を発見することである。ソフトウェアテス Via:Wikipedia トでは、欠陥が存在することを示すことは
    5. 5. ユニットテストとは• 単体テスト(Unit Testing) > 単体テスト、あるいはユニットテストと は、メソッドなどの小さな単位で行うテス トのことである。単体テストは、ホワイト ボックステストを利用して行われる場合が 多い。 プログラムは 機能 機能 複数の機能(モジュール)が 機能 機能 > 品質を上げることはできるが、要求を満た 機能 機能 組み合わさって成り立ってい る。 機能単位でユニットテストを しているかはわからない 作る
    6. 6. ユニットテストとは• アジャイルな開発手法で必須 > 仕様通りに動くか確認• ユニットテストが仕様書にもなる > ドキュメントはメンテナンスがされなくな る アジャイルフトウェア開発 > 動いているものが正解 迅速かつ適応的にソフトウェア開発を 行う軽量な開発手法群の総称 。 代表的な手法にXPやスクラムなどがあ る。
    7. 7. ユニットテストの問題点• まとまった報告書として残りにくい > 小さなモジュールの単位なので• 個人差が出やすい > 各個人のレベルのテストケースになりがち 規約、計画、レビューでカバーしよう
    8. 8. なぜユニットテストを書く の?
    9. 9. なぜユニットテストを書く の?• 問題を小さなうちに摘み取る• 問題の発生を初期の段階で防ぐ• 仕様の確認 あなたの書い• 使い方がわかる たコードは本 当に正しいで すか?
    10. 10. 問題を小さなうちに摘み取る• 問題を小さなうちに摘み取る > ハインリッヒの法則 • 1件の重大災害の裏には、29件のかすり傷程度 の軽災害があり、さらにその裏にはケガはな いものの300件のヒヤリとした体験が存在して 1件の重大な事故・災害 いる 29件の軽微な事故・災 > 問題は後になるほど重症化する害 300件のヒヤリ・ハット • 問題が広範囲にわたる
    11. 11. 問題の発生を初期の段階で防 ぐ• 問題の発生を初期の段階で防ぐ リリースする前の > 動かない 問題発覚と リリース後の問題発覚 • ユニットテストで動かしてみる コストが高いのは? > 間違った動作 • 検証することで確認する > 性能 • 実際に動かすことで確認できる
    12. 12. 仕様の確認• 仕様の確認 > アジャイルな開発では実装のよりどころと するドキュメントが少ない。実装を説明す るよりもテストコードを見たほうが早い > 机上の設計書よりも動くコード
    13. 13. 使い方がわかる• 使い方 > ユニットテスト見れば、そのクラスの使い 方、何をしているかわかる > 学習テスト 学習したいライブラリなどをユニット テスト書いて実行して使い方や内容を 確認します。書いて使って覚える!
    14. 14. ユニットテストの書き 方
    15. 15. ユニットテストの書き方• 計画しよう• 規約を作ろう• ツールを使おう 書けばいいって もんじゃない!
    16. 16. 計画しよう1.仕様の理解2.仕様の観点からテストケース抽出3.プログラム構造の理解(設計)4.プログラムの観点からテストケース抽出5.テストシナリオを考える
    17. 17. 規約を作ろう ・場当たり的なテストはしな い。• 書き方の規約 ・環境に依存したテストは注 意 > テストメソッドの規約 ・テストを書けないものもあ る • メソッド名はtest~から始まる > テストクラス名の規約 • テスト対象のクラス名+Test > テストケースはシンプルに • 複雑なテストケースになる場合は設計を見直す
    18. 18. ツールを使おう• ツール > Junitはあたりまえ • Junit4を使いましょう。アノテーション便利 > Seasar周りのテストツール > Eclipseプラグイン • Seasar使ってるならS2Junit4 Pluginを入れよう – http://s2junit4plugin.sandbox.seasar.org/ – ただしQuickJunitと相性悪し > Maven2 • レポート作ってくれる
    19. 19. ツールを使おう• Junit > Greenになると気持ちいい > 以下略
    20. 20. ツールを使おう• S2JUnit4 > できること • 自動フィールドバインディング • DBアクセス – DataAccessor • MockIntercept – インターフェースなしでメソッドの返り値を自由自 在 • テストデータを自動で用意 http://s2container.seasar.org/2.4/ja/S2JUnit4.html • 検証用データとDBの比較
    21. 21. ツールを使おう• S2JUnit4 Plugin for Eclipse > もともとはQuickJunitの派生 > Ctrl+9でテストコードと実装コードを行 き来 > Ctrl+0でテスト実行、Ctrl+Shift+0でデバッグ > Ctrl+Shift+9 でテスト用Diconファイル編 http://s2junit4plugin.sandbox.seasar.org/ 集
    22. 22. ツールを使おう• Maven2 > mvn testでテスト実行 > mvn siteでテストリポート作成 • テスト結果とかカバレッジとか
    23. 23. ツールを使おう• Hudson > 「継続的インテグレーション」 (Continuous Integration ) • ファウラーたんによって広められた • 別々に開発された部品を持ち寄ってお互いの 動作を検証する「統合テスト」を早い段階か ら恒常的に行うこと • CIは単に統合テストだけではなく,広くビル
    24. 24. S2Junit4を掘り下げてみる• 自動フィールドバインディング > ルール • バインディング対象のフィールドは非static、非final、 非プリミティブ型かつnull • フィールドの変数定義がインターフェース型でそのイン タフェースをもつコンポーネントがコンテナに存在する 場合、そのコンポーネントがフィールドにセットされる • バインディングは、テストメソッド実行の直前に行われ RunWithで る(ただしTestContextインタフェースは例外的に Seasar2.classを before()メソッド実行前にバインディングされる)。テ 忘れずに ストメソッドの実行が終了するとバインディングされた
    25. 25. S2Junit4を掘り下げてみる• DBアクセス > フィールドにDataAccessorを追加してお くとDBを操作できるAccessorが自動でDI される • DBからデータを取り出せる • Excelからデータを取り出せる
    26. 26. S2Junit4を掘り下げてみる• MockIntercept > メソッドを呼び出した結果を自由に変更で きる > 個別のDiconファイルで定義する > モックを使ってテストできる • LogicのテストをしたいのにBhvが動作する必 要ないよね > アノテーションを使ってもできる
    27. 27. S2Junit4を掘り下げてみる • MockIntercept > モックにしたいクラスにAOPで <component class="examples.aop.Hello"> <aspect> <component class="org.seasar.framework.aop.interceptors.MockInterceptor"> <initMethod name="setReturnValue">このDiconファイ <arg>"greeting"</arg> メソッド名 <arg>"Hello"</arg> ルも </initMethod> 返り値名S2Junit4Plugin <initMethod name="setReturnValue"> OGNL式で書く <arg>"echo"</arg> で作る <arg>"Hoge"</arg> </initMethod> </component> </aspect> </component>
    28. 28. S2Junit4を掘り下げてみる• テストデータを自動で用意 > ExcelにDBに入れたいデータを書いとくと 勝手にDB入れてくれる > 検証用データも同じ > 規約はs2junit2.dicon > クラス名.xls > クラス名_Expected.xls
    29. 29. まとめ
    30. 30. ユニットテストをしっかりや ると• 仕様変更に強くなる > テストがあるから変更にも強い!• ソースコードの保守がしやすくなる > メンテナンスコスト低減• 品質が上がる > 最初の時点でバグつぶし > 要求に対する適合度• 設計がシンプルになる > テストがシンプルなら設計もシンプル
    31. 31. その結果・・・
    32. 32. 障害の少ない堅牢なシステム メンテナンスが楽チン
    33. 33. 障害の少ない堅牢なシステム メンテナンスが楽チン
    34. 34. 障害の少ない堅牢なシステム メンテナンスが楽チン 作業が減るので定時帰 宅!

    ×