狠狠撸

狠狠撸Share a Scribd company logo
鲍苍颈迟罢别蝉迟で定时帰宅!



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

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

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

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

 > 検証用データも同じ

 > 規約はs2junit2.dicon

 > クラス名.xls

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



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

More Related Content

Unit testで定時帰宅!

Editor's Notes