IntelliTestはどこまでカバーしてくれるのか

公開日: : Blog, Microsoft , ,

私はレガシーな開発環境・案件が多かったのですが、
この頃、ユニットテストを利用する機会が増えてきました。

Visual Studio 2015 の IntelliTest という機能を使用すると、
ユニットテストの自動作成が可能です。

どんなもんなのかということで、使ってみました。

※IntelliTestはEnterpriseエディションのみの機能です。

まずは、適当なクラスとメソッドを作成。
文字列3つを渡して色々数値変換やって計算結果を返します。

public int GetHoge(string a, string b, string c)
{
    //文字列変数 a の長さ
    var lenA = a.Length;

    //文字列変数 b の先頭2文字を数字変換したもの
    var lenB = int.Parse(b.Substring(0, 2));

    //文字列変数 c の長さ
    var lenC = c.Length;

    //計算
    return lenA * lenB / lenC;
}

メソッドを右クリック、「IntelliTestの実行」から即座にテストが実行できます。
※即座といっても数秒かかります。

Run

こんな感じになりました。
例外は、明示的にスローしたもの以外はテスト失敗(RED)となります。

Result1

まずは、引数のNullチェックから行ってみます。

public int GetHoge(string a, string b, string c)
{
    //文字列変数 a の長さ
    if (a == null) throw new ArgumentNullException("a is null.");
    var lenA = a.Length;

    //文字列変数 b の先頭2文字を数字変換したもの
    if (b == null) throw new ArgumentNullException("b is null.");
    var lenB = int.Parse(b.Substring(0, 2));

    //文字列変数 c の長さ
    if (c == null) throw new ArgumentNullException("c is null.");
    var lenC = c.Length;

    //計算
    return lenA * lenB / lenC;
}

これで引数nullパターンは対策が出来ました。

Result2

次は、引数bの先頭2文字を数値変換しているのですが、
文字長・数字チェックを追加する必要がありそうです。
ちゃんとSubstringメソッドに応じて、境界値でユニットテストを自動実行してくれているのが凄いですね。

public int GetHoge(string a, string b, string c)
{
    //文字列変数 a の長さ
    if (a == null) throw new ArgumentNullException("a is null.");
    var lenA = a.Length;

    //文字列変数 b の先頭2文字を数字変換したもの
    if (b == null) throw new ArgumentNullException("b is null.");
    if (b.Length < 2) throw new ArgumentException("b.Length < 2.");
    int tmpB;
    if (!int.TryParse(b.Substring(0, 2), out tmpB)) throw new ArgumentException("b is not numeric.");
    var lenB = int.Parse(b.Substring(0, 2));

    //文字列変数 c の長さ
    if (c == null) throw new ArgumentNullException("c is null.");
    var lenC = c.Length;

    //計算
    return lenA * lenB / lenC;
}

Result3

最後は0除算の対応を追加しました。

public int GetHoge(string a, string b, string c)
{
    //文字列変数 a の長さ
    if (a == null) throw new ArgumentNullException("a is null.");
    var lenA = a.Length;

    //文字列変数 b の先頭2文字を数字変換したもの
    if (b == null) throw new ArgumentNullException("b is null.");
    if (b.Length < 2) throw new ArgumentException("b.Length < 2.");
    int tmpB;
    if (!int.TryParse(b.Substring(0, 2), out tmpB)) throw new ArgumentException("b is not numeric.");
    var lenB = int.Parse(b.Substring(0, 2));

    //文字列変数 c の長さ
    if (c == null) throw new ArgumentNullException("c is null.");
    var lenC = c.Length;
    if (lenC == 0) throw new ArgumentException("c is 0.");

    //計算
    return lenA * lenB / lenC;
}

ALLグリーンになり、メソッドが少し堅牢になったでしょうか。

Result4

どこまで自動実行してくれるのかまだ把握できてないですが、
実装に応じた異常系はある程度網羅できそうな気がします。当然ながらビジネスロジックの仕様網羅はしてくれないです。

もう少し触ってみたいですけど、
テスト駆動開発をやっているチームよりも、ユニットテストを作成する文化が無いまたは製造後にユニットテストを作成するチームに対して有効かもしれません。
もしくはユニットテストを作成する際はビジネスロジックの網羅テストを作成し、異常系についてはIntelliTestに任せる、などのアプローチもできるかもしれません。
そうするとユニットテスト作成の時間がかなり短縮できそうですね。

関連記事

Xamarin Studio から Visual Studio for Mac へ変更してから、”The “XamlCTask” task failed unexpectedly.” が発生。

Visual Studio for Mac がGAしたので、インストールしてみた。 それまで開発して

記事を読む

no image

Xamarin.Forms で ScrollView の中に Map を配置したとき、Androidで地図のスクロールが出来なくなる

iOSは問題ないけど、AndroidはScrollViewにタッチを持ってかれてる感じ。 カスタ

記事を読む

no image

Xamarin.FormsのAndroidでスプラッシュ画面

Xamarin.Formsでアプリを作成した時、iOSは起動時にLauncher.storyboar

記事を読む

Visual Studio 2015 + PHP Tools for Visual Studio で App Service for Linux へデプロイ

発端はこれ。 https://social.msdn.microsoft.com/Forums/ja

記事を読む

画面設計デザイン時の無料画面イメージ作成ツール

画面デザイン全般に使っているツールを紹介。 Webアプリ作成時のワイヤーフレームや、 ス

記事を読む

no image

Windows 10 IoT Core の 製品化メモ

概念実証(Proof of concept)を終了し、製品化を行いたい場合のステップ サインア

記事を読む

【WPF/XAML】テキストボックスをテキストエリアにする

XAMLのTextBoxをHTMLのTextAreaのように表示・動作させる方法 <

記事を読む

Xamarin.Forms出力バイナリのメモ

iOS -> .ipa, Android -> .apk ipaファイル作成方法 ソリュー

記事を読む

[OxyPlot]errro CS0117: ‘Resource.Attribute’ に ‘mediaRouteSettingsDrawable’ の定義がありません

Xamarin.Formsでグラフ描画を行う方法のひとつにOxyPlotというライブラリがある。

記事を読む

【WPF/XAML】チェックボックスのデザイン変更

[xml] <Window x:Class="Sample"

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

PAGE TOP ↑