visual studio 2015 の新機能: pex はユニットテストの福音となるか!?

52
Visual Studio 2015 Pex ユニットテス トの福音とな るか!? 2015/1/31 BluewaterSoft @biac 2015 MVP ComCamp 名古屋会場 1

Upload: yasuhiko-yamamoto

Post on 18-Jul-2015

1.351 views

Category:

Technology


4 download

TRANSCRIPT

Visual Studio 2015

Pex はユニットテストの福音となるか!?

2015/1/31BluewaterSoft @biac

2015 MVP ComCamp 名古屋会場 1

スピーカー紹介

• BluewaterSoft 山本 康彦 a.k.a @biacまだ人工衛星が飛んでない時代に生まれ、HONDAでクルマの設計やってました

• Microsoft MVP for Windows Platform Development (2014/10-2015/9)

• Windows ランタイム アプリ開発 / 記事や書籍の執筆 やってます

2015/1/31 2015 MVP ComCamp 名古屋会場 2

コミュニティ紹介

2015/1/31 2015 MVP ComCamp 名古屋会場 3

• わんくま同盟は、コミュニティで活動している者たちの集団です

• 縦の繋がりはなく、横の繋がりで成り立っています東京 / 名古屋 / 大阪 / 福岡 / 横浜 / コミケ…

• ノンジャンルです。開発者が多いです

• 各自のスタイルで情報提供などをしています

• あなたも一緒に情報発信しませんか?

わんくま同盟: 主な活動内容

2015/1/31 2015 MVP ComCamp 名古屋会場 4

• 勉強会 http://wankuma.com/seminar/東京・大阪・名古屋・福岡・横浜・マニラ…ほぼ毎週どこかで勉強会

• ブログ http://blogs.wankuma.com/主に開発系だけど、ノンジャンル

• 掲示板 http://bbs.wankuma.com/C#とVB.NETの掲示板

わんくま同盟: 名古屋勉強会の活動

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のワークショップなどを開催しています。

わんくま同盟: 次回の名古屋勉強会は

2015/1/31 2015 MVP ComCamp 名古屋会場 6

• わんくま同盟 名古屋勉強会 #34http://www.wankuma.com/seminar/20150214nagoya34/

• 日時:2015年 2月14日(土) 12:30~17:00

• 場所:名古屋市港生涯学習センター(築地口)

• 参加費:無料

• スピーカー登壇希望者は随時募集中です!

Visual Studio 2015

次期 Visual Studio のプレビュー版が利用可能です

2015 MVP ComCamp 名古屋会場 7

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/1412/08/news126.html

Visual Studio 2015、現在はCTP5を試せる♪

2015/1/31 2015 MVP ComCamp 名古屋会場 9

• プレビュー版は誰でも!Visual Studioのサイトからダウンロード可能http://www.visualstudio.com/

• まだ「go-live」ではない開発したアプリをまだ実運用には使ってはいけない

• Windows 10 対応も、まだ

Visual Studio 2015 の新機能の1つ、Smart Unit Tests = 元 Pex

2015/1/31 2015 MVP ComCamp 名古屋会場 10

• Microsoft Research で開発http://research.microsoft.com/en-us/projects/pex/2008年ごろから!

• ちなみに「Moles」は進化形が Fakes Framework となって VS 2012 に搭載された⇒CodeZine「Visual Studio 11 betaの単体テスト機能を使ってみよう!」に書きました

Visual Studio 2015

ProgramEXploration

for .NET

Smart Unit Tests !?ざっくり言うと、どんなもの?

2015 MVP ComCamp 名古屋会場 11

Pexの使い方: STEP1コードを書きます…

2015/1/31 2015 MVP ComCamp 名古屋会場 12

Pexの使い方: STEP2メニューを選びます…

2015/1/31 2015 MVP ComCamp 名古屋会場 13

Pexの使い方: STEP3ユニット テストが走ります。以上!

2015/1/31 2015 MVP ComCamp 名古屋会場 14

テストケース テスト結果

え…?

なんだって~っ!?

2015/1/31 2015 MVP ComCamp 名古屋会場 15

DEMO

PexSample01.slnテスト自動実行~テスト保存まで

2015 MVP ComCamp 名古屋会場 16

結果の見方:想定したテストケースが走ったか?

2015/1/31 2015 MVP ComCamp 名古屋会場 17

テストケース テスト結果

• FizzBuzzの外部設計

• 自動生成されたテストケースは、外部設計と一致しているか?

nは3の倍数? nは5の倍数? 出力

TRUE TRUE "Fizz Buzz"

TRUE FALSE "Fizz"

FALSE TRUE "Buzz"

FALSE FALSE 数字

書いたコードがおかしいと…

2015/1/31 2015 MVP ComCamp 名古屋会場 18

書いたコードがおかしいと、(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 数字

書いたコードがおかしいと、(2/2) カバレッジが不足する

2015/1/31 2015 MVP ComCamp 名古屋会場 20

• コードをレビューすると実行されないパスが見つかる!

VS 2015 CTP 5 では、カバレッジ ツールとは連動していないらしい (将来に期待)

Pex - ここまでのポイント

• 後付けのユニット テストを自動生成してくれる便利!!

• 結果の評価には、ユニット テストを作れるスキルが必要!

2015/1/31 2015 MVP ComCamp 名古屋会場 21

Pex

自動生成されたユニットテストを活用する

生成されたテストを、保存して再利用。改造も可能。

2015 MVP ComCamp 名古屋会場 22

自動生成されたユニットテストを保存する

2015/1/31 2015 MVP ComCamp 名古屋会場 23

➊ 保存したいテストを選択↓

➋ [Save] ボタン→• ➊ 保存したいテストケース

を選択全部なら Ctrl+A

• ➋ [Save] ボタンをクリックまたは、右クリックから[Save] メニューを選択

保存されたユニットテスト:テスト プロジェクトが生成される

2015/1/31 2015 MVP ComCamp 名古屋会場 24

• ユニット テストのプロジェクトが自動生成される参照設定もされている

• テストケースは .g.cs ファイルに記述されている

テストのプロジェクト

テストケース

保存されたユニットテスト:テスト エクスプローラーで実行可

2015/1/31 2015 MVP ComCamp 名古屋会場 25

• 通常のユニットテストと同様に、テスト エクスプローラーからテストを実行できる

• 回帰テストとして使える!

• 注意: 保存したテストを書き換えてもよいが、[Smart Unit Tests] を再実行すると上書きされてしまう

Pex - ここまでのポイント

• 自動生成されたユニット テストは保存しておける

• 保存したテストは、通常のユニット テストと同様に実行可能 = 回帰テスト

• リファクタリングが捗る!Refactoring = 外的な振る舞いは同じままでコードを改善する※ 外的な振る舞いの不変を保証するにはユニット テスト!

2015/1/31 2015 MVP ComCamp 名古屋会場 26

Pex

例外の扱い

例外が出るのが正常、というケースの扱い方

2015 MVP ComCamp 名古屋会場 27

コードから明示的に出す例外

2015/1/31 2015 MVP ComCamp 名古屋会場 28

• 明示的に例外を throw している場合- 単純に throw- catch して、別の例外を

作って throw

コードから明示的に出す例外⇒ 正常と判定される

2015/1/31 2015 MVP ComCamp 名古屋会場 29

• 明示的に例外を throw している場合は、テスト結果はグリーンに!

コードでハンドリングしていない例外

2015/1/31 2015 MVP ComCamp 名古屋会場 30

• catch していない例外

• catch していても、単純にリスローしている場合

コードでハンドリングしていない例外⇒ 異常と判定される

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

• ハンドリングしていない例外が出た場合(リスローを含む)は、テスト結果はレッドに!

レッド判定をグリーン判定に変える

2015/1/31 2015 MVP ComCamp 名古屋会場 32

• 例外が出るのが正常、というときには、そのケースをグリーンに変えることができる

右クリックして[Allow]

[Allow]すると起きること⇒テストコードに属性が付く

2015/1/31 2015 MVP ComCamp 名古屋会場 33

• [Allow] すると、その例外は許容するという属性が、テストコードに追加される

※ テストを保存していないときは、自動的にテストプロジェクトが生成される

通常の属性: レッドになる

[Allow]した場合の属性: グリーンになる

Pex - ここまでのポイント

• コードから明示的に出している例外 ⇒ グリーン

• コードでハンドリングしてない例外 ⇒ レッド

• レッドのテストケースは [Allow] することで、グリーンとみなすように指示できる

2015/1/31 2015 MVP ComCamp 名古屋会場 34

Pex

苦手なもの

Pexで上手く扱えないコードの例

2015 MVP ComCamp 名古屋会場 35

返値のないメソッド

2015/1/31 2015 MVP ComCamp 名古屋会場 36

• 分岐を全部通すテストを生成してはくれる⇒ でも、そのテストが

正しいかどうか判定できない

• 参照渡しの引数でテスト可能な場合もある

テストファーストなら複数のメソッドを組み合わせてテストを作る場面

返値のないメソッド⇒ テストは生成/実行される

2015/1/31 2015 MVP ComCamp 名古屋会場 37

• このテスト結果でよいのか、判断できない

• 下は、参照渡しの引数で処理結果が判断できる例

入力

出力入力

出力がないので判断不能

メンバー変数に依存するメソッド

2015/1/31 2015 MVP ComCamp 名古屋会場 38

• メンバー変数(=オブジェクトの状態)に依存するメソッドは、状態を変化させるために複数回(または別のメソッド)の呼び出しが必要

この例だと、2回呼び出してみないと判定できない

メンバー変数に依存するメソッド⇒ 適切なテストケースにならない

2015/1/31 2015 MVP ComCamp 名古屋会場 39

• メソッドを複数回呼び出すようなテストケースは自動生成されない

この例だと、0を与えただけで終わっているが、その後に別の値を与えて先ほどの0が返ってくることを評価しないといけない

yield return

2015/1/31 2015 MVP ComCamp 名古屋会場 40

• IEnumerable<T>をそのまま評価しようとする⇒ テストにならない

※ IEnumerable<T>から値を取り出すメソッドならテスト可能

(結果画面は省略)

非同期メソッド

2015/1/31 2015 MVP ComCamp 名古屋会場 41

• Task<T>をそのまま評価しようとする⇒ テストにならない

※ Task<T>から値を取り出すメソッド(=ブロックする)ならテスト可能

(結果画面は省略)

外部に依存するメソッド

2015/1/31 2015 MVP ComCamp 名古屋会場 42

• テストは生成されるが、外部の応答が変わっても対処できない⇒ 回帰テストには

ならない

(結果画面は省略)

非線形なメソッド(分岐によらない非線形性)

2015/1/31 2015 MVP ComCamp 名古屋会場 43

• 例えば2次関数なら、3点を計測しないといけないが、そこまで賢くはない (1点しかテストケースを生成してくれない)

(結果画面は省略)

Windows ランタイム アプリ

2015/1/31 2015 MVP ComCamp 名古屋会場 44

• Windows ランタイムアプリ (ストア アプリ) では、メニューにいない! orz※ PCL/WinMD は OK♪

• C/C++もダメまぁ、"Program EXploration for .NET" ですし

この辺にいたはず!

Pex - ここまでのポイント

• 苦手なものがけっこうある

• 状態に依存するメソッドなど、テスタビリティの悪いメソッドは当然ダメ!

• yield return や async/await や非線形やWindows ランタイム アプリなどは、将来に期待

2015/1/31 2015 MVP ComCamp 名古屋会場 45

Pex

試そう!

Visual Studio 2015の環境がなくたって!

2015 MVP ComCamp 名古屋会場 46

Pex for funhttp://pex4fun.com/

これはVS2015のSmart Unit Testsとは異なるところがあります

2015/1/31 2015 MVP ComCamp 名古屋会場 47

Pex for funゲーム形式でPexを楽しむ

2015/1/31 2015 MVP ComCamp 名古屋会場 48

❹ 仕様を満たすようにコードを修正して、またPexを走らせる

➊ Pexを走らせる

❸ この問題の仕様が、ここに表示される(このあたりがホンモノと違う)

➋ Pexの出力

Pex

まとめ

2015 MVP ComCamp 名古屋会場 49

Pex すごい❢

• VS2015 Ultimate に搭載される Pex (正式名「Smart Unit Tests」) は、後付けのユニットテストを自動生成

• 回帰テスト、リファクタリングが捗る!

• テスタビリティの高いコードを書くようになる(…かも)

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

Visual Studio 2015

Pex はユニットテストの福音となるか!?

2015/1/31BluewaterSoft @biac

2015 MVP ComCamp 名古屋会場 52ご清聴ありがとうございました