UnitTestで定時帰宅!



             船戸 隆
        2009/06/19
Agenda
• ユニットテストとは
• なぜユニットテストを書くの?
• ユニットテストの書き方
• まとめ
ユニットテストとは
そもそもテストとは
• ソフトウェアテスト
 > コンピュータのプログラムを実行し、正し
  く動作するかどうか確認する作業
 > プログラム中の欠陥(バグ)をできる限り
  多く発見することを目標として行われる
 > ソフトウェアテストに成功するとは、欠陥
  を発見することである。ソフトウェアテス
                 Via:Wikipedia

  トでは、欠陥が存在することを示すことは
ユニットテストとは
• 単体テスト(Unit Testing)
 > 単体テスト、あるいはユニットテストと
     は、メソッドなどの小さな単位で行うテス
     トのことである。単体テストは、ホワイト
     ボックステストを利用して行われる場合が
     多い。                    プログラムは
       機能     機能    複数の機能(モジュール)が
         機能    機能
 >   品質を上げることはできるが、要求を満た
           機能    機能
                    組み合わさって成り立ってい
                              る。
                         機能単位でユニットテストを
     しているかはわからない              作る
ユニットテストとは
• アジャイルな開発手法で必須
 > 仕様通りに動くか確認

• ユニットテストが仕様書にもなる
 > ドキュメントはメンテナンスがされなくな
  る        アジャイルフトウェア開発

 > 動いているものが正解
        迅速かつ適応的にソフトウェア開発を
          行う軽量な開発手法群の総称 。
         代表的な手法にXPやスクラムなどがあ
                る。
ユニットテストの問題点
• まとまった報告書として残りにくい
 > 小さなモジュールの単位なので

• 個人差が出やすい
 > 各個人のレベルのテストケースになりがち


  規約、計画、レビューでカバーしよう
なぜユニットテストを書く
     の?
なぜユニットテストを書く
          の?

• 問題を小さなうちに摘み取る
• 問題の発生を初期の段階で防ぐ
• 仕様の確認
               あなたの書い
• 使い方がわかる      たコードは本
               当に正しいで
                  すか?
問題を小さなうちに摘み取る
• 問題を小さなうちに摘み取る
 > ハインリッヒの法則
  • 1件の重大災害の裏には、29件のかすり傷程度
   の軽災害があり、さらにその裏にはケガはな
   いものの300件のヒヤリとした体験が存在して
                   1件の重大な事故・災害
   いる               29件の軽微な事故・災

 > 問題は後になるほど重症化する害
                 300件のヒヤリ・ハット

  • 問題が広範囲にわたる
問題の発生を初期の段階で防
            ぐ
• 問題の発生を初期の段階で防ぐ
                      リリースする前の
 > 動かない                問題発覚と
                     リリース後の問題発覚
  • ユニットテストで動かしてみる
                     コストが高いのは?

 > 間違った動作
  • 検証することで確認する

 > 性能
  • 実際に動かすことで確認できる
仕様の確認
• 仕様の確認
 > アジャイルな開発では実装のよりどころと
  するドキュメントが少ない。実装を説明す
  るよりもテストコードを見たほうが早い
 > 机上の設計書よりも動くコード
使い方がわかる
• 使い方
 > ユニットテスト見れば、そのクラスの使い
  方、何をしているかわかる
 > 学習テスト   学習したいライブラリなどをユニット
           テスト書いて実行して使い方や内容を
           確認します。書いて使って覚える!
ユニットテストの書き
     方
ユニットテストの書き方

• 計画しよう
• 規約を作ろう
• ツールを使おう
            書けばいいって
            もんじゃない!
計画しよう
1.仕様の理解
2.仕様の観点からテストケース抽出
3.プログラム構造の理解(設計)
4.プログラムの観点からテストケース
抽出
5.テストシナリオを考える
規約を作ろう ・場当たり的なテストはしな
                      い。
• 書き方の規約              ・環境に依存したテストは注
                      意
 > テストメソッドの規約         ・テストを書けないものもあ
                      る
  • メソッド名はtest~から始まる

 > テストクラス名の規約
  • テスト対象のクラス名+Test

 > テストケースはシンプルに
  • 複雑なテストケースになる場合は設計を見直す
ツールを使おう
• ツール
 > Junitはあたりまえ
   • Junit4を使いましょう。アノテーション便利

 > Seasar周りのテストツール
 > Eclipseプラグイン
   • Seasar使ってるならS2Junit4 Pluginを入れよう
      – http://s2junit4plugin.sandbox.seasar.org/
      – ただしQuickJunitと相性悪し

 > Maven2
   • レポート作ってくれる
ツールを使おう
• Junit
  > Greenになると気持ちいい

  > 以下略
ツールを使おう
• S2JUnit4
  > できること
    • 自動フィールドバインディング
    • DBアクセス
       – DataAccessor
    • MockIntercept
       – インターフェースなしでメソッドの返り値を自由自
         在

    • テストデータを自動で用意
         http://s2container.seasar.org/2.4/ja/S2JUnit4.html

    • 検証用データとDBの比較
ツールを使おう
• S2JUnit4 Plugin for Eclipse
  > もともとはQuickJunitの派生

  > Ctrl+9でテストコードと実装コードを行
   き来
  > Ctrl+0でテスト実行、Ctrl+Shift+0でデバッグ

  > Ctrl+Shift+9 でテスト用Diconファイル編
               http://s2junit4plugin.sandbox.seasar.org/
   集
ツールを使おう
• Maven2
  > mvn testでテスト実行

  > mvn siteでテストリポート作成
    • テスト結果とかカバレッジとか
ツールを使おう
• Hudson
  > 「継続的インテグレーション」
   (Continuous Integration )
    • ファウラーたんによって広められた
    • 別々に開発された部品を持ち寄ってお互いの
     動作を検証する「統合テスト」を早い段階か
     ら恒常的に行うこと

    • CIは単に統合テストだけではなく,広くビル
S2Junit4を掘り下げてみる
• 自動フィールドバインディング
 > ルール
  • バインディング対象のフィールドは非static、非final、
   非プリミティブ型かつnull
  • フィールドの変数定義がインターフェース型でそのイン
   タフェースをもつコンポーネントがコンテナに存在する
   場合、そのコンポーネントがフィールドにセットされる
  • バインディングは、テストメソッド実行の直前に行われ
                           RunWithで
   る(ただしTestContextインタフェースは例外的に
                           Seasar2.classを
   before()メソッド実行前にバインディングされる)。テ
                              忘れずに
   ストメソッドの実行が終了するとバインディングされた
S2Junit4を掘り下げてみる
• DBアクセス

 > フィールドにDataAccessorを追加してお
  くとDBを操作できるAccessorが自動でDI
  される
  • DBからデータを取り出せる

  • Excelからデータを取り出せる
S2Junit4を掘り下げてみる
• MockIntercept
  > メソッドを呼び出した結果を自由に変更で
   きる
  > 個別のDiconファイルで定義する
  > モックを使ってテストできる
    • LogicのテストをしたいのにBhvが動作する必
     要ないよね

  > アノテーションを使ってもできる
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>
S2Junit4を掘り下げてみる
• テストデータを自動で用意
 > ExcelにDBに入れたいデータを書いとくと
  勝手にDB入れてくれる

 > 検証用データも同じ

 > 規約はs2junit2.dicon

 > クラス名.xls

 > クラス名_Expected.xls
まとめ
ユニットテストをしっかりや
           ると
• 仕様変更に強くなる
 > テストがあるから変更にも強い!
• ソースコードの保守がしやすくなる
 > メンテナンスコスト低減
• 品質が上がる
 > 最初の時点でバグつぶし
 > 要求に対する適合度
• 設計がシンプルになる
 > テストがシンプルなら設計もシンプル
その結果・・・
障害の少ない堅牢なシステム
 メンテナンスが楽チン
障害の少ない堅牢なシステム
 メンテナンスが楽チン
障害の少ない堅牢なシステム
 メンテナンスが楽チン



    作業が減るので定時帰
        宅!

Unit testで定時帰宅!