Visual Studio 2015 の新機能: Pex はユニットテストの福音となるか!?

7,475 views

Published on

2015 MVP ComCamp 名古屋会場 (2015/1/31)

PowerPoint のファイルは、OneDrive にあります。
http://1drv.ms/1yhJxpC

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

No Downloads
Views
Total views
7,475
On SlideShare
0
From Embeds
0
Number of Embeds
2,269
Actions
Shares
0
Downloads
23
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

Visual Studio 2015 の新機能: Pex はユニットテストの福音となるか!?

  1. 1. Visual Studio 2015 Pex は ユニットテス トの福音とな るか!? 2015/1/31 BluewaterSoft @biac 2015 MVP ComCamp 名古屋会場 1
  2. 2. スピーカー紹介 • BluewaterSoft 山本 康彦 a.k.a @biac まだ人工衛星が飛んでない時代に生まれ、HONDAでクルマの設計やってました • Microsoft MVP for Windows Platform Development (2014/10-2015/9) • Windows ランタイム アプリ開発 / 記事や書籍の執筆 やってます 2015/1/31 2015 MVP ComCamp 名古屋会場 2
  3. 3. コミュニティ紹介 2015/1/31 2015 MVP ComCamp 名古屋会場 3 • わんくま同盟は、コミュニティで活動している者たちの集団です • 縦の繋がりはなく、横の繋がりで成り立っています 東京 / 名古屋 / 大阪 / 福岡 / 横浜 / コミケ… • ノンジャンルです。開発者が多いです • 各自のスタイルで情報提供などをしています • あなたも一緒に情報発信しませんか?
  4. 4. わんくま同盟: 主な活動内容 2015/1/31 2015 MVP ComCamp 名古屋会場 4 • 勉強会 http://wankuma.com/seminar/ 東京・大阪・名古屋・福岡・横浜・マニラ… ほぼ毎週どこかで勉強会 • ブログ http://blogs.wankuma.com/ 主に開発系だけど、ノンジャンル • 掲示板 http://bbs.wankuma.com/ C#とVB.NETの掲示板
  5. 5. わんくま同盟: 名古屋勉強会の活動 2015/1/31 2015 MVP ComCamp 名古屋会場 5 • 2007年12月から名古屋でも勉強会を年4回開催しています。 • 開催内容としては以下の内容となっています。 1. セッション(50分枠) x N名 2. LightningTalks x 3名 3. TDD道場(30分枠) by @biacさん • スピーカー登壇希望者募集しています – ノンジャンルな勉強会ですので、趣味な話でもおk – スピーカーが集まらなかった時は、名古屋勉強会独自でTDDや DDDのワークショップなどを開催しています。
  6. 6. わんくま同盟: 次回の名古屋勉強会は 2015/1/31 2015 MVP ComCamp 名古屋会場 6 • わんくま同盟 名古屋勉強会 #34 http://www.wankuma.com/seminar/20150214nagoya34/ • 日時:2015年 2月14日(土) 12:30~17:00 • 場所:名古屋市港生涯学習センター(築地口) • 参加費:無料 • スピーカー登壇希望者は随時募集中です!
  7. 7. Visual Studio 2015 次期 Visual Studio の プレビュー版が利用可能です 2015 MVP ComCamp 名古屋会場 7
  8. 8. Visual Studio 2015、 数々の新機能とともに年内リリース 2015/1/31 2015 MVP ComCamp 名古屋会場 8 • 次期Visual Studio 2015 年内、たぶんWindows 10に 合わせて正式リリース • たくさんの新機能 ←@IT「Visual Studio 2015 の新機能をプレビュー版で見 てみよう」に書きました http://www.atmarkit.co.jp/ait/articles/1 412/08/news126.html
  9. 9. Visual Studio 2015、 現在はCTP5を試せる♪ 2015/1/31 2015 MVP ComCamp 名古屋会場 9 • プレビュー版は誰でも! Visual Studioのサイトからダ ウンロード可能 http://www.visualstudio.com/ • まだ「go-live」ではない 開発したアプリをまだ実運用 には使ってはいけない • Windows 10 対応も、まだ
  10. 10. Visual Studio 2015 の新機能の1つ、 Smart Unit Tests = 元 Pex 2015/1/31 2015 MVP ComCamp 名古屋会場 10 • Microsoft Research で開発 http://research.microsoft.com/e n-us/projects/pex/ 2008年ごろから! • ちなみに「Moles」は 進化形が Fakes Framework となって VS 2012 に搭載さ れた⇒CodeZine「Visual Studio 11 betaの単体テスト機能を使ってみよ う!」に書きました
  11. 11. Visual Studio 2015 Program EXploration for .NET Smart Unit Tests !? ざっくり言うと、どんなもの? 2015 MVP ComCamp 名古屋会場 11
  12. 12. Pexの使い方: STEP1 コードを書きます… 2015/1/31 2015 MVP ComCamp 名古屋会場 12
  13. 13. Pexの使い方: STEP2 メニューを選びます… 2015/1/31 2015 MVP ComCamp 名古屋会場 13
  14. 14. Pexの使い方: STEP3 ユニット テストが走ります。以上! 2015/1/31 2015 MVP ComCamp 名古屋会場 14 テストケース テスト結果
  15. 15. え…? なんだって~っ!? 2015/1/31 2015 MVP ComCamp 名古屋会場 15
  16. 16. DEMO PexSample01.sln テスト自動実行~テスト保存まで 2015 MVP ComCamp 名古屋会場 16
  17. 17. 結果の見方: 想定したテストケースが走ったか? 2015/1/31 2015 MVP ComCamp 名古屋会場 17 テストケース テスト結果 • FizzBuzzの外部設計 • 自動生成されたテストケー スは、外部設計と一致して いるか? nは3の倍数? nは5の倍数? 出力 TRUE TRUE "Fizz Buzz" TRUE FALSE "Fizz" FALSE TRUE "Buzz" FALSE FALSE 数字
  18. 18. 書いたコードがおかしいと… 2015/1/31 2015 MVP ComCamp 名古屋会場 18
  19. 19. 書いたコードがおかしいと、 (1/2) テストケースが想定と異なる 2015/1/31 2015 MVP ComCamp 名古屋会場 19 テストケース テスト結果 • FizzBuzzの外部設計 • ← "Fizz Buzz" になるケー スが無い!! nは3の倍数? nは5の倍数? 出力 TRUE TRUE "Fizz Buzz" TRUE FALSE "Fizz" FALSE TRUE "Buzz" FALSE FALSE 数字
  20. 20. 書いたコードがおかしいと、 (2/2) カバレッジが不足する 2015/1/31 2015 MVP ComCamp 名古屋会場 20 • コードをレビューすると 実行されないパスが見つか る! VS 2015 CTP 5 では、カバレッジ ツールとは 連動していないらしい (将来に期待)
  21. 21. Pex - ここまでのポイント • 後付けのユニット テストを自動生成してくれる 便利!! • 結果の評価には、 ユニット テストを作れるスキルが必要! 2015/1/31 2015 MVP ComCamp 名古屋会場 21
  22. 22. Pex 自動生成され たユニット テストを活用 する 生成されたテストを、保存 して再利用。改造も可能。 2015 MVP ComCamp 名古屋会場 22
  23. 23. 自動生成されたユニットテストを 保存する 2015/1/31 2015 MVP ComCamp 名古屋会場 23 ➊ 保存したいテストを選択↓ ➋ [Save] ボタン→ • ➊ 保存したいテストケース を選択 全部なら Ctrl+A • ➋ [Save] ボタンをクリッ ク または、右クリックから [Save] メニューを選択
  24. 24. 保存されたユニットテスト: テスト プロジェクトが生成される 2015/1/31 2015 MVP ComCamp 名古屋会場 24 • ユニット テストのプロジェ クトが自動生成される 参照設定もされている • テストケースは .g.cs ファ イルに記述されている テストのプロジェクト テストケース
  25. 25. 保存されたユニットテスト: テスト エクスプローラーで実行可 2015/1/31 2015 MVP ComCamp 名古屋会場 25 • 通常のユニットテストと同様に、テスト エク スプローラーからテストを実行できる • 回帰テストとして使える! • 注意: 保存したテストを書き換えてもよい が、[Smart Unit Tests] を再実行すると上書 きされてしまう
  26. 26. Pex - ここまでのポイント • 自動生成されたユニット テストは保存しておける • 保存したテストは、通常のユニット テストと同様 に実行可能 = 回帰テスト • リファクタリングが捗る! Refactoring = 外的な振る舞いは同じままでコードを改善する ※ 外的な振る舞いの不変を保証するにはユニット テスト! 2015/1/31 2015 MVP ComCamp 名古屋会場 26
  27. 27. Pex 例外の扱い 例外が出るのが正常、とい うケースの扱い方 2015 MVP ComCamp 名古屋会場 27
  28. 28. コードから明示的に出す例外 2015/1/31 2015 MVP ComCamp 名古屋会場 28 • 明示的に例外を throw して いる場合 - 単純に throw - catch して、別の例外を 作って throw
  29. 29. コードから明示的に出す例外 ⇒ 正常と判定される 2015/1/31 2015 MVP ComCamp 名古屋会場 29 • 明示的に例外を throw して いる場合は、 テスト結果はグリーンに!
  30. 30. コードでハンドリングしていない例外 2015/1/31 2015 MVP ComCamp 名古屋会場 30 • catch していない例外 • catch していても、 単純にリスローしている場 合
  31. 31. コードでハンドリングしていない例外 ⇒ 異常と判定される 2015/1/31 2015 MVP ComCamp 名古屋会場 31 • ハンドリングしていな い例外が出た場合(リス ローを含む)は、 テスト結果はレッドに!
  32. 32. レッド判定をグリーン判定に変える 2015/1/31 2015 MVP ComCamp 名古屋会場 32 • 例外が出るのが正常、 というときには、その ケースをグリーンに変 えることができる 右クリックして [Allow]
  33. 33. [Allow]すると起きること ⇒テストコードに属性が付く 2015/1/31 2015 MVP ComCamp 名古屋会場 33 • [Allow] すると、その 例外は許容するという 属性が、テストコード に追加される ※ テストを保存してい ないときは、自動的に テストプロジェクトが 生成される 通常の属性: レッドになる [Allow]した場合の属性: グリーンになる
  34. 34. Pex - ここまでのポイント • コードから明示的に出している例外 ⇒ グリーン • コードでハンドリングしてない例外 ⇒ レッド • レッドのテストケースは [Allow] することで、グ リーンとみなすように指示できる 2015/1/31 2015 MVP ComCamp 名古屋会場 34
  35. 35. Pex 苦手なもの Pexで上手く扱えないコー ドの例 2015 MVP ComCamp 名古屋会場 35
  36. 36. 返値のないメソッド 2015/1/31 2015 MVP ComCamp 名古屋会場 36 • 分岐を全部通すテスト を生成してはくれる ⇒ でも、そのテストが 正しいかどうか 判定できない • 参照渡しの引数でテス ト可能な場合もある テストファーストなら 複数のメソッドを 組み合わせてテストを 作る場面
  37. 37. 返値のないメソッド ⇒ テストは生成/実行される 2015/1/31 2015 MVP ComCamp 名古屋会場 37 • このテスト結果でよい のか、判断できない • 下は、参照渡しの引数 で処理結果が判断でき る例 入力 出力入力 出力がないので判断不能
  38. 38. メンバー変数に依存するメソッド 2015/1/31 2015 MVP ComCamp 名古屋会場 38 • メンバー変数(=オブ ジェクトの状態)に依存 するメソッドは、状態 を変化させるために複 数回(または別のメソッ ド)の呼び出しが必要 この例だと、2回呼び出 してみないと判定でき ない
  39. 39. メンバー変数に依存するメソッド ⇒ 適切なテストケースにならない 2015/1/31 2015 MVP ComCamp 名古屋会場 39 • メソッドを複数回呼び 出すようなテストケー スは自動生成されない この例だと、0を与えた だけで終わっているが、 その後に別の値を与え て先ほどの0が返ってく ることを評価しないと いけない
  40. 40. yield return 2015/1/31 2015 MVP ComCamp 名古屋会場 40 • IEnumerable<T>を そのまま評価しようと する ⇒ テストにならない ※ IEnumerable<T> から値を取り出すメ ソッドならテスト可能 (結果画面は省略)
  41. 41. 非同期メソッド 2015/1/31 2015 MVP ComCamp 名古屋会場 41 • Task<T>をそのまま 評価しようとする ⇒ テストにならない ※ Task<T>から値を 取り出すメソッド(=ブ ロックする)ならテス ト可能 (結果画面は省略)
  42. 42. 外部に依存するメソッド 2015/1/31 2015 MVP ComCamp 名古屋会場 42 • テストは生成されるが、 外部の応答が変わって も対処できない ⇒ 回帰テストには ならない (結果画面は省略)
  43. 43. 非線形なメソッド (分岐によらない非線形性) 2015/1/31 2015 MVP ComCamp 名古屋会場 43 • 例えば2次関数なら、3 点を計測しないといけ ないが、そこまで賢く はない (1点しかテス トケースを生成してく れない) (結果画面は省略)
  44. 44. Windows ランタイム アプリ 2015/1/31 2015 MVP ComCamp 名古屋会場 44 • Windows ランタイム アプリ (ストア アプ リ) では、メニューに いない! orz ※ PCL/WinMD は OK♪ • C/C++もダメ まぁ、"Program EXploration for .NET" で すし この辺に いたはず!
  45. 45. Pex - ここまでのポイント • 苦手なものがけっこうある • 状態に依存するメソッドなど、テスタビリティの悪 いメソッドは当然ダメ! • yield return や async/await や非線形や Windows ランタイム アプリなどは、将来に期待 2015/1/31 2015 MVP ComCamp 名古屋会場 45
  46. 46. Pex 試そう! Visual Studio 2015の環境 がなくたって! 2015 MVP ComCamp 名古屋会場 46
  47. 47. Pex for fun http://pex4fun.com/ これはVS2015の Smart Unit Tests とは異なるところ があります 2015/1/31 2015 MVP ComCamp 名古屋会場 47
  48. 48. Pex for fun ゲーム形式でPexを楽しむ 2015/1/31 2015 MVP ComCamp 名古屋会場 48 ❹ 仕様を満たすようにコードを修正して、 またPexを走らせる ➊ Pexを走らせる ❸ この問題の仕様が、ここに表示される (このあたりがホンモノと違う) ➋ Pexの出力
  49. 49. Pex まとめ 2015 MVP ComCamp 名古屋会場 49
  50. 50. Pex すごい❢ • VS2015 Ultimate に搭載される Pex (正式名 「Smart Unit Tests」) は、後付けのユニットテス トを自動生成 • 回帰テスト、リファクタリングが捗る! • テスタビリティの高いコードを書くようになる (…かも)
  51. 51. Smart Unit Tests (Pex)のドキュメント • MSDN: 「コードのためにスマート単体テストを生成する」 https://msdn.microsoft.com/library/dn823749.aspx • MSDN マガジン 2009年12月号: 「Pex によるレガシ コード の自動単体テスト」 https://msdn.microsoft.com/ja-jp/magazine/ee819140.aspx かなり古く、現状と異なる部分も多いが、考え方の参考に。 なお、スタブ(PexMock)は廃止されました。 • MSDN blogs (英語): 「Introducing Smart Unit Tests」 http://blogs.msdn.com/b/visualstudioalm/archive/2014/11/19/introducing-smart-unit-tests.aspx 「Smart Unit Tests - a mental model」 http://blogs.msdn.com/b/visualstudioalm/archive/2014/12/11/smart-unit-tests-a-mental-model.aspx
  52. 52. Visual Studio 2015 Pex は ユニットテス トの福音とな るか!? 2015/1/31 BluewaterSoft @biac 2015 MVP ComCamp 名古屋会場 52ご清聴ありがとうございました

×