テストコードのリファクタリング

21,995 views

Published on

JJUG CCC 2012 fall / 札幌Javaカンファレンス2012での発表資料です。
ソースコードは https://github.com/shuji/demo-refactering-unittest から取得してください。

Published in: Technology
  • Be the first to comment

テストコードのリファクタリング

  1. 1. テストコードのリファクタリング #jjug_r33 2012.11.10 JJUG CCC 渡辺修司 (@shuji_w6e) 1
  2. 2. 今日のお話
  3. 3. 今日のお話 冗長で書きにくい     テストコードを Spock と で リファクタリング
  4. 4. 自己紹介
  5. 5. 渡辺 修司Javaプログラマ 株式会社エスプラニング所属 ウェブアプリやデスクトップアプリの開発テスト駆動開発、ユースケース駆動開発アジャイル開発最近の趣味はロードバイクとフットサル
  6. 6. @shuji_w6e札幌 JavaコミュニティTDD Boot Campやさしいデスマーチ(Blog)執筆活動 WEB DB Press vol.69 JUnit実践入門(11/21)
  7. 7. テストしてますか?
  8. 8. 継続的インテグレーションは強みでなくなった Subversion/Gitなどを使用したソースコード管理、Jenkinsを使用した継続的インテグレーション、様々なxUnitフレームワークを使用した自動テストなどをソフトウェア開発組織として実践することは、今日では、その開発組織の技術的な強みではありません。 http://yshibata.blog.so-net.ne.jp/archive/c20379492-1
  9. 9. 現実... http://www.flickr.com/photos/togemaru/2882075323/
  10. 10. 現代ソフトウェア開発の3本柱 ©t-wadaバージョン管理テスティング自動化 http://www.flickr.com/photos/ercol/4665559509/
  11. 11. 現代ソフトウェア開発の3本柱 ©t-wadaバージョン管理テスティング自動化 http://www.flickr.com/photos/ercol/4665559509/
  12. 12. ユニットテストの目的http://www.flickr.com/photos/essecento/4297955162/
  13. 13. スキル不足仕様変更 経験不足複雑な要件 不安 http://www.flickr.com/photos/yopse/3772030400/
  14. 14. 不完全な人間 http://www.flickr.com/photos/sharynmorrow/3948100/
  15. 15. ユニットテストとは?ソフトウェアを構成する最小部品のテスト主にクラスやメソッドが対象対象が期待される振る舞いをするかを検証
  16. 16. テストの4象限モデル ビジネス面 手動 機能テスト 受け入れテスト 製品を批評 チームを支援 ストーリーテスト ユーザビリティテスト 負荷テスト ユニットテスト パフォーマンステスト 自動 技術面
  17. 17. テストの4象限モデル ビジネス面 手動 機能テスト 受け入れテスト 製品を批評 チームを支援 ストーリーテスト ユーザビリティテスト 負荷テスト ユニットテスト パフォーマンステスト 自動 技術面
  18. 18. テストの4象限モデル ビジネス面 手動 機能テスト 受け入れテスト 製品を批評 チームを支援 ストーリーテスト ユーザビリティテスト 負荷テスト ユニットテスト パフォーマンステスト 自動 技術面
  19. 19. チームを支援するテスト自分のコードへの自信積極的なリファクタリング安心できるリリース
  20. 20. 技術面のテストプログラマが行うプロダクションコードの作成を支援するビジネス的価値 < 技術的負債の低減
  21. 21. ユニットテストの特徴プログラマが行い、開発チームを支援し、技術面に属し、自動化が可能。
  22. 22. セーフティネット http://www.flickr.com/photos/32010000@N08/2987901256/
  23. 23. 品質とユニットテストユニットテストで直接の品質はあがらない品質を高めるにはビジネス面のテストが必要要件を満たしているか?(受け入れテスト)使いやすいか?(ユーザビリティテスト)ユニットテストにより技術的負債が減る変化や追加要求に強くなる
  24. 24. ユニットテストの 学習方法http://www.flickr.com/photos/alisdair/135306281/
  25. 25. ユニットテストは難しい?
  26. 26. ユニットテストは難しい? YES
  27. 27. ユニットテストは難しい?習得するにはそれなりに書く必要テスト技法を学ぶ必要テストを書くプロジェクトに参加する必要チーム全体の意識改革が必要 YES
  28. 28. ユニットテストは簡単?
  29. 29. ユニットテストは簡単? YES
  30. 30. ユニットテストは簡単?書けば書くほど身につけることができるパターン化しやすい YES
  31. 31. ユニットテストは有効?
  32. 32. ユニットテストは有効? YES
  33. 33. ユニットテストは有効?積極的なリファクタリングによる改善安心感と自信より良い設計デグレ(リグレッション)の予防 YES
  34. 34. ユニットテストは開発の基盤リファクタリング継続的インテグレーションカバレッジ測定テスト駆動開発
  35. 35. ユニットテストを学習するコツたくさん書く書いて整理するなんでも自動化する
  36. 36. ユニットテストを学習するコツたくさん書く書いて整理するなんでも自動化する
  37. 37. ユニットテストを学習するコツたくさん書く書いて整理するなんでも自動化する
  38. 38. 増えるテストコードhttp://www.flickr.com/photos/62765927@N00/2293652369/
  39. 39. DRY原則Don t Repeat Yourself重複は悪コピペはバグの温床
  40. 40. DRY原則Don t Repeat Yourself重複は悪コピペはバグの温床そう、プロダクションコードならばね
  41. 41. テストコードの特徴似たようなコードが多くなる異なるのはパラメータ異なるのは前提条件効率良くテストケースを増やしたい各テストケースで完結する見通しが良いことが必要
  42. 42. テストコードを整理する方針重複を排除し過ぎると可読性が落ちるテストケース毎に独立させるテストケースを追加しやすくする修正する場合は影響範囲を最小限にする
  43. 43. 勝利のカスタムMatcher、カスタムRule構造化テスト(Enclosed)パラメータ化テスト(Theories)テストダブル(モックやスタブ)テスト技法
  44. 44. https://github.com/shuji/demo-refactering-unittestデモ
  45. 45. ArrayListのテストリストが初期状態の時sizeは0を返すリストに1件の文字列を含む時sizeは1を返すリストに2件の文字列を含む時sizeは2を返すリストが初期状態の時get_0はIndexOutOfBoundsExceptionを送出するリストに1件の文字列を含む時get_0はhelloを返すリストに2件の文字列を含む時get_0はhelloを返すetc....
  46. 46. テストクラスを構造化する同じ階層で多くのテストケースを管理しない同じフォルダに大量のファイルと同じ構造化してテストケースを整理初期化処理が共通するテストをまとめるEnclosedテストランナー
  47. 47. テストクラスを構造化する同じ階層で多くのテストケースを管理しない同じフォルダに大量のファイルと同じ構造化してテストケースを整理初期化処理が共通するテストをまとめるEnclosedテストランナー 6章 テストのコンテキスト
  48. 48. 消費税計算クラスのテストコンストラクタで税率を指定できる new ConsumptionTax(5);applyメソッドは金額を指定し、税込み金額を返す
  49. 49. パラメータ化テストを使う多くのパターンでテストしたいテストケースで異なるのはパラメータのみ自然とコピペが多くなるテストケースとテストデータを分離するTheoriesテストランナー
  50. 50. パラメータ化テストを使う多くのパターンでテストしたいテストケースで異なるのはパラメータのみ自然とコピペが多くなるテストケースとテストデータを分離するTheoriesテストランナー 8章 パラメータ化テスト
  51. 51. 複雑な条件のテスト合計金額が6000円以上の場合、送料無料となる割引クーポン(10%)を利用する場合、消費税適用前の合計金額に適用する個々の商品に割引が設定されている商品は割引クーポンには適用されない送料無料は割引後の合計金額を基準とする送料は全国一律で800円となる代引きの場合、手数料が300円(税込み)発生する消費税は5%とする
  52. 52. Cucumberの活用テストケースをシナリオとして記述 日本語によるテストケース テーブル表記が扱えるJUnitを使えれば簡単に使える
  53. 53. Cucumberの活用テストケースをシナリオとして記述 日本語によるテストケース テーブル表記が扱えるJUnitを使えれば簡単に使える 17章 振舞駆動開発
  54. 54. 補足)テストデータの選択テスト技法を学ぶ 同値クラス(P28) 境界値 (P28) ペア構成テスト( ) オールペア法 直交表
  55. 55. 組み合わせの効率化TestNo 送料 セール品 クーポン 代引き 1 ✓ ✓ ✓ ✓ 2 ✓ ✓ ✓ 3 ✓ ✓ ✓ 4 ✓ ✓ 5 ✓ ✓ 6 ✓ ✓ 7 ✓ ✓ ✓ 8 ✓ ✓ 9 ✓ ✓ 10 ✓ 11 ✓ 12 ✓ 13 ✓ ✓ 14 ✓ 15 ✓ 16
  56. 56. オールペア法組み合わせテストの技法欠陥は単条件のテストである程度カバー可能2条件の組み合わせ網羅で9割近くカバー3条件以上の組み合わせは費用対効果は低いすべての要素の組み合わせを網羅http://www.allpairstesting.com/allpairsgenerator
  57. 57. オールペア法TestNo 送料 セール品 クーポン 代引き 条件 1 ✓ ✓ ✓ ✓ 4 2 ✓ ✓ ✓ 3 3 ✓ ✓ ✓ 3 4 ✓ ✓ ✓ 3 5 ✓ ✓ ✓ 3 6 ✓ ✓ 2 7 ✓ ✓ 2 8 ✓ ✓ 2 9 ✓ ✓ 2 10 ✓ ✓ 2 11 ✓ ✓ 2 12 ✓ 1 13 ✓ 1 14 ✓ 1 15 ✓ 1 16 0
  58. 58. まとめ
  59. 59. テストケースの構造化(Enclosed)共通の初期化でテストケースをまとめるパラメータ化テスト(Theories)テストデータとテストケースを分離するCucumberによる機能テストテストによって適するツールは異なるテスト技法効率良くテストケースを選択
  60. 60. Have a good testing!

×