Upload
yasuhiko-yamamoto
View
1.351
Download
4
Embed Size (px)
Citation preview
スピーカー紹介
• 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、数々の新機能とともに年内リリース
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
結果の見方:想定したテストケースが走ったか?
2015/1/31 2015 MVP ComCamp 名古屋会場 17
テストケース テスト結果
• FizzBuzzの外部設計
• 自動生成されたテストケースは、外部設計と一致しているか?
nは3の倍数? nは5の倍数? 出力
TRUE TRUE "Fizz Buzz"
TRUE FALSE "Fizz"
FALSE TRUE "Buzz"
FALSE FALSE 数字
書いたコードがおかしいと、(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
自動生成されたユニットテストを保存する
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
コードから明示的に出す例外
2015/1/31 2015 MVP ComCamp 名古屋会場 28
• 明示的に例外を throw している場合- 単純に throw- catch して、別の例外を
作って throw
コードでハンドリングしていない例外⇒ 異常と判定される
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
返値のないメソッド
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 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 すごい❢
• 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