お題:Visual Studio - Team System の「単体テスト」を使おう

Visual Studio - Team System (通称:VSTS)の、単体テスト機能を使ってみます。
本来ならイロイロな種類があるのですが、ここでは「試しに使ってみる」ために、最も簡単な例でやってみます。

<用意したもの>
・Visual Studio 2005 Team Suit (Team Suit または、 Team Edition for Software Developers 、 Team Edition for Software Testers)
 

<先ず、テスト対象を作る>
アジャイルの「テストファースト」に従えば、本来は逆順です。
しかし、ココでの目的は「単体テスト機能を使ってみる」ことにあるので、そんなことはお構い無しに突き進みます。  
で、ためしに以下のメソッドを実装したクラスを作ってみました。(用語がVBしてますので、C#やC++な方は読み替えてください。)

<テストプロジェクトを作る>
で、テスト対象を書き散らしたところで、テストプロジェクトの作成に移ります。
メニューから「テスト(S)」→「新しいテスト(T)」です−下図参照(ただし、状況により、一部項目がグレーアウトされている場合がありますが、ご了承ください)

で、これを選ぶと、イキナリ怒られる場合があります。

素直に保存しましょう。
そうすると、以下のようなメニューが現れます。

いろいろなテンプレートがありますが、ここでは「単体テストウィザード」を選びます。
下の「テストプロジェクトに追加」のプルダウンでは、
・既存のテストプロジェクトに追加(もしあれば)
・新しいVBテストプロジェクト
が選べます。C#やC++、J#を入れていればそれらも選べるのかもしれませんが、私の環境には入っていないので解りません。
で、新しいプロジェクトを選んだ場合には、プロジェクト名を入力します。
次に、



対象を選択します。これによって、選択されたテスト対象のメソッド用のテストメソッドが生成されるようです。
(つまり、選択されなかった項目のテスト用メソッドは生成されないということ。)

ここまでの過程で、テストプロジェクトと簡単なテストコードが生成されます。

<テストプロジェクトを作る>
 

しかーし、ここで安心してはいけません。むしろコレからが本番です。
テストプロジェクトのテストコードを記述していくという手順です。

ここで大事なのは、以下のページをよく読んでおくことです。

他にもイロイロありますが、先ずは基本中の基本、Assertを理解することです。ま、NUnit,VBUnit,JUnitな方々、及び手馴れたVB6使いな方々にはお馴染みの単語ですね。
ここで、よく使うものを解説しておきます。

<よく使うもの>
 

メソッド名 効用 どんなときに「失敗」を返却するか
Microsoft.VisualStudio.TestTools.UnitTesting    
AreEqual(a,b,message) 単純比較する aとbが等しくないとき、メッセージとともに「失敗」を返却します。
AreNotEqual(a,b,message) (AreEqualの逆)  
AreSame(a,b,message) (AreEqualのオブジェクト参照版) aとbのオブジェクト参照が等しくないとき、メッセージとともに「失敗」を返却します。
AreNotSame(a,b,message) (AreNotEqualのオブジェクト参照版)  
Fail(message) 無条件に失敗させる メッセージとともに「失敗」を返却します。
IsNull(a,message) 参照がNull(Nothing)参照であるか検査する aがNull(Nothing)であるとき、メッセージとともに「失敗」を返却します。
IsNotNull(a,message) (IsNullの逆)  
IsTrue(a,message) Boolean判断をする aがFalseであるとき、メッセージとともに「失敗」を返却します。
IsFalse(a,message) (IsTrueの逆) aがTrueであるとき、メッセージとともに「失敗」を返却します。
IsInstanceOfType(a,type,message) 型を検査する aがtypeで定められた型でないとき、メッセージとともに「失敗」を返却します。
IsNotInstanceOfType(a,type,message) (IsInstanceOfTypeの逆)  

これらは各種オーバーロードがあります。引数の型が違ったり、数が違ったりしますが、基本は上の通りです。
そのほかに、CollectionAssert クラス や、StringAssert クラス は、知っておいて損はないと思います。

で、ここで間違えてはいけないことがあります。
Assertのメンバに「Inconclusive」というのがいます。上記手順の通りウィザードでテストを作ると、各テストメソッドの最後に、必ず記述されます。
 

このInconclusiveは、必ず「AssertInconclusiveException」例外をThrowします。
しかし、テスト失敗は「AssertFailedExceptionなのです(なので、このAssertFailedExceptionをcatchしてはいけません)。

このAssertInconclusiveExceptionが発生した場合、テスト作成者が手抜きや手抜かりをしたと思ってよいと思います。

これらのメソッドを使って、それぞれのテストを記述していきます。

<先ほどの例では…>
 

テスト対象のメソッド名に"Test"を付加したテストメソッド(<TestMethod()>で修飾されています)の中に、具体的に記述していきます。
先ほど作ったテスト対象に対応するためのテストメソッド内で使用するものとしては…

   
コンストラクタ Assert..IsNotNull
文字列"Hoge"を返却するメソッド AraEqual
Nothingを返却するメソッド IsNull
空のCollectionを返却するメソッド CollectionAssert.AreEqual
要素が一つだけ−文字列"Hoge"−のCollectionを返却するメソッド CollectionAssert.AreEqual
Trueを返却するメソッド IsTrue
問答無用でApplicationExceptionをThrowしてくるメソッド Catch ex As ApplicationException
  '---そのままExitさせる
  Exit Sub
Catch ex As Exception
  Assert.Fail
  Exit Sub
End Try

Assert Fail

これをテスト側に実装してあげて、テストを実行します。
先ほどのメニューから「選択されたテストを…開始」で実行します。

<結果は…>
 

ま、世の中そう簡単にはうまくいかないものです。
失敗したときは、こんな画面が現れます。



この図では、ReturnTrueTest で失敗しました。

目出度く成功した場合には、こんな感じになります。

 

<ネタ的おまけ>
 

上の図の最後に、「FoolsTest」というのがあります。
これの中身は…

 <TestMethod()> _
Public Sub FoolsTest()

End Sub

と、全く何もしていないテストを作ってみました。
これでも「成功」が返却されるのです。
つまり、上述の「AssertFailedExceptionが返却されないので、『「失敗」ではない=成功』なんですね。
こういう、もはやネタとしか思えない事象だけは、作らないようにしましょう。



メニューに戻る
フィードバックはコチラにコメントをどうぞ