【VisualStudio チュートリアル】IntelliTest

チュートリアルは、Visual Studio 2015 RC で作成されています。

 IntelliTest を使えば、あなたが書いたソースコードを解析して、テストデータと最大のコードカバレッジを持つ単体テストを作成することができます。早速体験してみましょう。

 

テスト対象クラスの作成

テスト対象となるクラスを作成します。Unit Test Projectを作成します。
今回はプロジェクト名をIntelliTestにしてみました。

01_New_Project

プロジェクトが作成されたら、プロジェクト名の箇所(ここでは、IntelliTest)を右クリックして[追加]-[新しい項目]を選択します。

02_Select_Menu

[クラス] を選択してください。今回はUserという名前のクラスを作成します。

03_Add_New_Item

クラスのテンプレートができたら次のようなコードを作成してください。

04_Writing_Code

具体的なコードは次のようになります。
6行目にある「using System.Text.RegularExpressions」はデフォルトで追加されないので、記入忘れしないようにしてください。
このコードをレガシーコードと見立てて、実際に IntelliTest をしてみたいと思います。

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Text.RegularExpressions; // ここは追加で記入してください。

namespace IntelliTest {   public class User {     public string Validate(string password) {       if ((password.Length < 6) || (password.Length > 20))         return "パスワードは6文字以上20文字以内で設定してください。";       // 英語小文字と数字を含む文字列にマッチするパスワードを確認している       if (Regex.IsMatch(password, "^(?!(?!.{4,8}$))[0-9a-z]*([0-9][a-z]|[a-z][0-9])+[0-9a-z]*$")) return "OK";       return "パスワードには数字、英字を両方含んでください";     }   } }

IntelliTest の実行

IntelliTest の実行は大変簡単です。
ユニットテストを作成したいメソッド [Validate] を選択して右クリックします。そこから[Run IntelliTest] を選択します。

05_IntelliTest選択

作成されたテストケースをクリックすると詳細を見ることができます。

clip_image012[4]

Visual Studio 2015はコード解析を行い、ホワイトボックステストを作成します。
作成されたテストケースを実際のテストコードにするときは、フロッピーディスクのアイコンの[保存] を選択します。

07_Save

すると、UserTest.csというユニットテストクラスが作成されました。
これは回帰テストになりますので、何回でも繰り返し自動実行が可能になります。

08_Generated_Unit_Test

レガシーコードの修正

よく見ると、テストケースで赤い部分があるようです。
IntelliTest はレガシーコードのコードの問題点も指摘してくれます。
この場合、どうやら、Validate メソッドの引数の password が null の場合の対応が抜けているということのようです。

09_Error

User.cs を修正してみましょう。具体的なコードは次のようになります。

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Text.RegularExpressions; // ここは追加で記入してください。

namespace IntelliTest {   public class User {     public string Validate(string password) { if(null == password) return "null にパスワードは認められていません"; //追加箇所       if ((password.Length < 6) || (password.Length > 20))         return "パスワードは6文字以上20文字以内で設定してください。";       // 英語小文字と数字を含む文字列にマッチするパスワードを確認している       if (Regex.IsMatch(password, "^(?!(?!.{4,8}$))[0-9a-z]*([0-9][a-z]|[a-z][0-9])+[0-9a-z]*$")) return "OK";       return "パスワードには数字、英字を両方含んでください";     }   } }

11_Add_Null_Check

次に IntelliTest で作成したユニットテストを実行してみましょう。
メニューの[テスト] – [実行] – [全てのテスト] を選択すると、すべてのテストが実行されます。
今回はすべてグリーン、つまりすべてのテストがパスしました。

12_Select_All_Test

テストはすべて通りましたが、よく見ると、先ほどの IntelliTest のウィンドウを見ると警告がでています。

14_Warning

警告の右横のプルダウンを、テストからイベントに変更してみると、内容がわかるようになります。
このWarnings の修正は簡単です。煉瓦に緑のレ点が入ったような [修正] のアイコンをクリックしましょう。

15_Warning_2

これはテストコードですが、図の 「MaxRunsWithoutNewTests」 という項目が自動修正されています。

16_Max_Runs

image

カバレッジを確認する

最後に IntelliTest で作成したテストのカバレッジを見てみます。
メニューの [テスト] – [コードカバレッジの分析] – [全てのテスト] を選択します。カバレッジが100%でした。
毎回100%になるわけではありませんが、IntelliTest は高いカバレッジ率のコードを生成することが確認できました。
本コードを確認するかぎり、ここでいうカバレッジは C0 カバレッジ(コードカバレッジ)と思われます。

17_Coverage

18_Coverage_Result

終わりに

楽しんでいただけましたでしょうか?
Visual Studio 2015を用いて IntelliTest を使うと、とても簡単に網羅率の高いテストを生成することができます。
特にテストコードがないレガシーコードに対して大変有効だと思われます。ぜひ皆様のプロジェクトにお役立てください。

参考

より、深いIntelliTest の内容は下記の記事や動画をご覧ください。

コードのためにスマート単体テストを生成する
https://msdn.microsoft.com/library/dn823749(v=vs.140).aspx

Using Smart Unit Tests To Find Bugs Earlier In The Development Cycle Using Smart Unit Tests To Find Bugs Earlier In The Development Cycle Using Smart Unit Tests To Find Bugs Earlier In The Development CycleUsing Smart Unit Tests To Find Bugs Earlier In The Development Cycle (英語)
https://channel9.msdn.com/Events/Visual-Studio/Connect-event-2014/215?wt.mc_id=relatedsession