JUnit実践入門 xUnitTestPatternsで学ぶユニットテスト

12,445 views

Published on

オープンソースカンファレンス2012北海道
札幌Javaコミュニティでの講演資料

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

No Downloads
Views
Total views
12,445
On SlideShare
0
From Embeds
0
Number of Embeds
1,613
Actions
Shares
0
Downloads
115
Comments
0
Likes
33
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
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • JUnit実践入門 xUnitTestPatternsで学ぶユニットテスト

    1. 1. 実践JUnitxUnitTestPatternsから学ぶユニットテスト 2012.06.16 OSC 2012 北海道 Shuji Watanabe (@shuji_w6e) 1
    2. 2. 本日の内容
    3. 3. 本日の内容 ユニットテストの目的
    4. 4. 本日の内容 ユニットテストの目的ユニットテストの実践
    5. 5. 本日の内容 ユニットテストの目的ユニットテストの実践 ユニットテストの問題
    6. 6. SHUJI WatanabeJava デベロッパー 要件定義からテストまで全領域対応Blog「やさしいデスマーチ」札幌JavaコミュニティJava, Groovy, JavaFX, MongoDBTDD, ユースケース駆動開発, テスト
    7. 7. WEB+DB PRESS vol.69JUnit実践入門 カスタムMatcher パラメータ化テスト テストの構造化 カスタムRule Cucumebr-junit
    8. 8. XUnit Test Patterns http://xunitpatterns.com/ Webで読めます(英語)
    9. 9. ユニットテストの目的
    10. 10. テストが 必要なワケhttp://www.flickr.com/photos/essecento/4297955162/
    11. 11. スキル不足仕様変更 経験不足複雑な要件 不安 http://www.flickr.com/photos/yopse/3772030400/
    12. 12. 不完全な人間 http://www.flickr.com/photos/sharynmorrow/3948100/
    13. 13. ユニットテストとは?ソフトウェアを構成する最小部品のテスト主にクラスやメソッドが対象対象が期待される振る舞いをするかを検証
    14. 14. テストの4象限モデル ビジネス面 手動 機能テスト 受け入れテスト 製品を批評 チームを支援 ストーリーテスト ユーザビリティテスト 負荷テスト ユニットテスト パフォーマンステスト 自動 技術面
    15. 15. テストの4象限モデル ビジネス面 手動 機能テスト 受け入れテスト 製品を批評 チームを支援 ストーリーテスト ユーザビリティテスト 負荷テスト ユニットテスト パフォーマンステスト 自動 技術面
    16. 16. テストの4象限モデル ビジネス面 手動 機能テスト 受け入れテスト 製品を批評 チームを支援 ストーリーテスト ユーザビリティテスト 負荷テスト ユニットテスト パフォーマンステスト 自動 技術面
    17. 17. チームを支援するテスト自分のコードへの自信積極的なリファクタリング安心できるリリース
    18. 18. 技術面のテストプログラマが行うプロダクションコードの作成を支援するビジネス的価値 < 技術的負債の低減
    19. 19. ユニットテストの特徴プログラマが行い、開発チームを支援し、技術面に属し、自動化が可能。
    20. 20. セーフティネット http://www.flickr.com/photos/32010000@N08/2987901256/
    21. 21. 品質とユニットテストユニットテストで直接の品質はあがらない品質を高めるにはビジネス面のテストが必要要件を満たしているか?(受け入れテスト)使いやすいか?(ユーザビリティテスト)ユニットテストにより技術的負債が減る変化や追加要求に強くなる
    22. 22. ユニットテストの実践
    23. 23. テストケースとは?テスト対象(sut: System Under Test)に特定の操作を行い、実測値(Actual Value)が期待値(Expected Value)となることを検証(Verify)する
    24. 24. テストデータのサンプリング「完璧なテスト」はできない少ない入力値で効率良くテストを行う様々なテスト技法境界値分析同値クラスペア構成テスト
    25. 25. テストケースの条件再現性がある曖昧さがない自動化されたテスト(Automated Test)
    26. 26. 4フェイズ テスト初期化処理(SetUp)実行(Exercise) @Test public void test() {検証(Verify) // SetUp // Exercise後処理(TearDown) // Verify // TearDown }
    27. 27. アサーション アサーションとは「こうなる」という表明assertThat(actual, is(expected)); static importされたメソッド 自然言語風の記述 assert that actual is expected 変数名(actual, expected)
    28. 28. Matcher API JUnit4の機能 一致する条件を定義したオブジェクトassertThat(actual, is(expected)); isはIsオブジェクトを返す Isはequalsを使った一致を行うMatcher 他にも多くのMatcherがある
    29. 29. リファクタリングユニットテストの主目的はリファクタリング技術的負債を蓄積させない安心してプロダクションコードを修正できる内部実装に依存するテストは避けること
    30. 30. ユニットテストと設計ユニットテストはサンプルコード自分が最初のユーザー(Eat your own dog food)APIが使いやすいかをテストするテストできないAPIは再設計する
    31. 31. 例)計算機クラスpublic class Calculator { // 割り算を行うメソッド public int divide(int x, int y) { return x / y; }}
    32. 32. 例)テストコード@Testpublic void test() { // SetUp Calculator sut = new Calculator(); float expected = 1.5; // Exercise float actual = sut.divide(6, 4); // Verify assertThat(actual, is(expected));}
    33. 33. 例)APIの設計ミスpublic class Calculator { // 割り算を行うメソッド public float divide(float x, float y) { return x / y; }}
    34. 34. API設計とユニットテストテストコードでAPI設計を検証出来る 期待値が検証出来ないAPI 使いにくい/解りにくいAPIテストコードを意識してAPIを設計する突き詰めるとテスト駆動開発(TDD) テストを先に書く(テストファースト)
    35. 35. TDDのサイクル 1.設計する5.リファクタリング Heuristics 2.テストを書く 4.テストを成功させる 3.コードを書く
    36. 36. ドキュメントとしてのテストテストコードは動作するドキュメント具体的なサンプルコード具体的な入力値と期待値テスト成功による保証JavaDocや仕様書より正確なドキュメント
    37. 37. ユニットテストの問題
    38. 38. 不安定なテストテスト結果が不定ランダム性やシステム時間に依存したテスト環境に依存したテストテスト結果が一定でないと信頼できないオオカミ少年問題常にすべてのテストが成功することを維持
    39. 39. 脆いテスト少しの変更で多くのテストに影響する疎結合になっていないデータの影響範囲が大きいインターフェイス(API)の設計が甘いいずれもテストのメンテナンスコストを増大
    40. 40. 増えるテストコード重複DRY原則(Don t Repeat Yourself)やり過ぎると可読性が落ちるテストはテストケースで独立すべきネストしたクラスの利用(Enclosed)パラメータ化テスト
    41. 41. Enclosedテストクラス テストクラスの構造化 テストをコンテキスト(文脈)で整理@RunWiht(Enclosed.class)public void ArrayListTest { public static class 初期状態のとき { @Test public void test() {} } public static class 要素が1つのとき { @Test public void test() {} }}
    42. 42. Enclosedテストクラス テストクラスの構造化 テストをコンテキスト(文脈)で整理@RunWiht(Enclosed.class)public void ArrayListTest { public static class 初期状態のとき { @Test public void test() {} } public static class 要素が1つのとき { @Test public void test() {} }}
    43. 43. パラメータ化テスト テストデータとテストメソッドを分離@RunWiht(Theories.class)public void CalculatorTest { @DataPoints public static Param[] PARAMS = { new Param(3, 4, 12), new Param(1, 5, 5), .... }; @Theory public void divideのテスト(Param p) { // }}
    44. 44. パラメータ化テスト テストデータとテストメソッドを分離@RunWiht(Theories.class)public void CalculatorTest { @DataPoints public static Param[] PARAMS = { new Param(3, 4, 12), new Param(1, 5, 5), .... }; @Theory public void divideのテスト(Param p) { // }}
    45. 45. 詳しくはWEB+DB vol.69でJUnit実践入門 カスタムMatcher パラメータ化テスト テストの構造化 カスタムRule Cucumebr-junit
    46. 46. テストしにくいオブジェクトシステム時間や外部APIモックやスタブの活用多用は禁物内部実装に依存しないように注意して使うmockito, EasyMock
    47. 47. まとめ
    48. 48. ユニットテストを学ぼう目的は開発の支援基本となる「型」を習得(4フェイズテスト)テスト技法を学び効率良くサンプリングパターンを学ぶAPI設計とテストは密な関係(TDD)テスティングフレームワークを活用する
    49. 49. ユニットテストを超えて...継続的インテグレーション(テスト)テストによる実行網羅率(カバレッジ)テスト駆動開発自動化された受け入れテスト振る舞い駆動開発探索的テスト
    50. 50. おしまい

    ×