このチュートリアルでは、
Visual Studio 2010
の新機能である
Generate From Usage
(
使用法から生成
)
機能について説明します。この機能はテスト駆動開発
(TDD)
をサポートします。
TDD
は、製品仕様に基づいて単体テストを最初に記述し、テストを成功させるために必要なソースコードを次に記述するソフトウェア設計のアプローチです。
Visual Studio 2010
では
TDD
をサポートしており、未定義の型とメンバがテストケースの中で参照された場合は、その時点でソースコード内に生成されます。
Visual Studio 2010
では、新しい型とメンバ
を生成する際
、ワークフローへの割り込み
は
最小限に抑え
られ
ます。コード内の現在の位置から離れ
ることなく、
型、メソッド、プロパティ、フィールド、またはコンストラクタ用のスタブを作成できます。ダイアログボックスを呼び出して型生成オプションを指定し
た場合
、ダイアログボックスが閉じると同時に
、
現在開いているファイルにフォーカス
が
戻ります。
Visual Studio 2010
では、
Visual Studio
に統合され
ている
すべてのテストフレームワークで
Generate
From Usage (
使用法から生成
)
機能
を
使用できます。このチュートリアルでは、
Microsoft Unit
Testing Framework
について説明します。
プロジェクトとテストプロジェクトをセットアップするには
1.
Visual
C#
または
Visual Basic
で、新しい
Windows
クラスライブラリプロジェクトを作成し、選択した言語に応じて、
GFUDemo_VB
または
GFUDemo_CS
という名前を付けます。
2. ソリューションエクスプローラで、上部にあるソリューションアイコンを右クリックし、
[
追加
]
、
[
新しいプロジェクト
]
をクリックして
[
新しいプロジェクトの追加
]
ダイアログボックスを開きます。左側の
[
プロジェクトの種類
]
ウィンドウで、
[
テスト
]
をクリックします。
3. 右側の
[
テンプレート
]
ウィンドウで
[
テストプロジェクト
]
をクリックし、既定名である
TestProject1
をそのまま使用します。
Visual
C#
で呼び出した場合のダイアログボックスを次に示します。
Visual
Basic
でも同様のダイアログボックスが表示されます。
.jpg)
4.
[
OK
]
をクリックして
[
新しいプロジェクトの追加
]
ダイアログボックスを閉じます。
5.これで、テストの記述を開始する準備ができました。
単体テストから新しいクラスを生成するには
1. テストプロジェクトの中に、
UnitTest1
という名前のファイルがあります。ソリューションエクスプローラでこのファイルをダブルクリックして、コードエディタで開きます。生成される既定のコードは、この時点では単純なテンプレートであり、
test
クラスと
test
メソッドだけが生成されます。
2. UnitTest1 クラス用の宣言を見つけ、名前を AutomobileTest に変更します。また、UnitTest1() コンストラクタの名前を AutomobileTest() に変更します。
注: IntelliSense の
IntelliSense ステートメント補完に、標準モードと
使用優先
モードという 2 つのオプションが提供されるようになりました。定義されていないクラスとメンバが使用される場合には、
使用優先
モードを使用します。IntelliSense ウィンドウが開いているときにCtrl + Alt + スペースキーを押すと、標準モードと
使用優先
モードを切り替えることができます。
使用優先
モードは、次の手順で "Automobile" を入力するときに役に立ちます。
3.TestMethod1 を見つけ、名前を
DefaultAutomobileIsInitializedCorrectly に変更します。このメソッド
内
に Automobile
というクラスの新しいインスタンスを作成します。型名の下にコンパイル時エラーを示す波線とスマートタグが表示されます。次の図に示すように、スマートタグの正確な位置はVisual Basic と C# のどちらを使用しているかによって異なります。
Visual C#
のコード
Visual Basic
のコード
.jpg)
4. マウスポインタをスマートタグの上に移動すると、
Automobile
という名前の型はまだ定義されていないことを示すエラーメッセージが表示されます。スマートタグをクリックするか、
Ctrl
+
. (C
trl
+
ピリオド
)
キー
を押して、次の図に示すように
[
Generate From Usage
]
(使用法から生成)コンテキストメニューを呼び出します。
Visual C#
のコード
Visual Basic
のコード
.jpg)
5. 2つのオプションがあります。テストプロジェクト
内
に新しいファイルを作成し、Automobile という名前の空のクラスを挿入するには、
[
Generate Class
'Automobile'
]
(クラス
'Automobile
'
の
生成)をクリックします。このオプションは、現在のプロジェクトの既定のアクセス修飾子を使用して新しいファイル内に新しい種類のクラスを作成する最短の方法です。ただし、新しいファイルをソースコードプロジェクトに追加する場合や、クラスを既存のファイルに挿入する場合があります。または、アクセス修飾子を指定する場合や、ファイルを別のプロジェクトに追加する場合もあります。このような場合は、
[
Generate other
]
(その他
の
生成) をクリックして、
[
Generate other
]
(その他
の
生成) ダイアログボックスを開きます。
Visual
Basic
で表示されるダイアログボックスを次に示します。
Visual
C#
の場合も同様です。
.jpg)
6.
[
Generate other
]
(その他
の
生成)
をクリックして
[
Generate other
]
(その他
の
生成) ダイアログボックスを開きます。
[
プロジェクトの場所
]
ボックスの一覧の
[
GFUDemo_VB
]
または
[
GFUDemo_CS
]
をクリックして、ファイルをテストプロジェクトではなくソースコードプロジェクトの中に配置するように Visual Studio に指示します。
7.
[
OK
]
をクリックしてダイアログボックスを閉じます。新しいファイルが作成されます。
8. ソリューションエクスプローラで、
GFUDemo_VB
または
GFUDemo_CS
プロジェクトノードの下を見て、新しいファイルが作成されたことを確認します。コードエディタでは、フォーカスは依然として
AutomobileTest.DefaultAutomobileIsInitializedCorrectly
にあります。このため、最小限の割り込みでテストの記述を続行できます。
プロパティスタブを生成するには
1. 製品仕様で、
Automobile
クラスには
Model
と
TopSpeed
という2つのパブリックプロパティがあると指定されているとします。これらのプロパティは、既定のコンストラクタによって、既定値
である
"Not specified"
と
-1
を使用して
初期化される必要があります。この単体テストでは、既定のコンストラクタがこれらのプロパティを正しい既定値に設定することを検証します。
2. 次のコード行を
DefaultAutomobileIsInitializedCorrectly
に追加します。
Visual C#
のコード
Assert
.IsTrue(myAuto.Model
== "Not specified" &&
myAuto.TopSpeed == -1);
Visual Basic
のコード
Assert
.IsTrue(myAuto.Model
= "Not specified"And myAuto.TopSpeed = -1)
3.この行はAutomobile の 2 つの未定義プロパティを参照
している
ので、スマートタグが表示されます。"TopSpeed" のスマートタグを呼び出し、
[
Generate property stub
]
(プロパティスタブ
の
生成)
をクリックします。
"Model"
プロパティのプロパティスタブも同様に生成します。次の図に、これらのスマートタグを示します。
Automobile クラス
で
新しいプロパティの型はコンテキストから正しく推定されます。
Visual C#
のコード
.jpg)
Visual Basic
のコード
.jpg)
必要に応じて、
automobile.cs
または
automobile.vb
ソースコードファイルに移動し、新しいプロパティが生成されたことを確認できます。
新しいコンストラクタ用のスタブを生成するには
1. このテストメソッドでは、
Model
プロパティと
TopSpeed
プロパティを指定の値で初期化するコンストラクタスタブを生成します。テストを完了するためのコードを次の手順で追加します。次のテストメソッドを
AutomobileTest
クラスに追加します。
Visual C#
のコード
[TestMethod]
publicvoid
AutomobileWithModelNameCanStart()
{
string
model = "550
Barchetta";
int
topSpeed = 199;
Automobile
myAuto = newAutomobile(model,
topSpeed);
}
Visual Basic
のコード
<TestMethod()>
PublicSub
AutomobileWithModelNameCanStart()
Dim
model AsString = "550
Barchetta"
Dim
topSpeed AsInteger = 199
Dim
myAuto AsNewAutomobile(model,
topSpeed)
End Sub
2. 新しいクラスコンストラクタのスマートタグを呼び出し、
[
Generate constructor stub
]
(コンストラクタスタブ
の
生成) をクリックします。
3.
Automobile
クラスファイルでは、新しいコンストラクタが、コンストラクタ呼び出しで使用されたローカル変数の名前を調べ、
Automobile
クラスの同名のプロパティを検索します。また、
Model
プロパティと
TopSpeed
プロパティに引数値を格納するコードをコンストラクタ本体に指定します
(Visual Basic
では、新しいコンストラクタの
_model
フィールドと
_topSpeed
フィールドは、
Model
プロパティと
TopSpeed
プロパティに対して暗黙的に定義された
バッキング
フィールドです
)
。
4. 新しいコンストラクタを生成すると、
DefaultAutomobileIsInitializedCorrectly
の既定のコンストラクタ呼び出しの下に波線が表示されます。エラーメッセージにより、
Automobile
クラスに
は
引数を
受け取らない
コンストラクタはないことが通知されます。パラメータを持たない明示的な既定のコンストラクタを生成するには、スマートタグを呼び出し、
[
Generate
constructor stub
]
(
コンストラクタスタブ
の
生成
)
をクリックします。
メソッド用のスタブを生成するには
1. 製品仕様で、
ある
新しい
Automobile
クラスは、
Model
プロパティと
TopSpeed
プロパティに既定値以外の値が設定された場合
は実行
状態に
移行
できる
ことが
指定されてい
る
とします。次の行を
AutomobileWithModelNameCanStart
メソッドに追加します。
Visual C#
のコード
myAuto
.Start();
Assert.IsTrue(myAuto.IsRunning == true);
Visual Basic
のコード
myAuto.Start()
Assert
.IsTrue(myAuto.IsRunning
= True)
2.
myAuto.Start
メソッド呼び出しのスマートタグを呼び出し、
[
Generate
method stub
]
(
メソッドスタブ
の
生成
)
をクリックします。次に、
IsRunning
のスマートタグを呼び出し、
[
Generate
property stub
]
(
プロパティスタブの生成
)
をクリックします。
Automobile
クラス
が
次のように表示されます。
Visual C#
のコード
publicclassAutomobile
{
publicint TopSpeed { get;
set; }
public
string Model { get; set; }
public
Automobile(string model,
int topSpeed)
{
// TODO:
メンバの初期化を完了する
this
.Model = model;
this
.TopSpeed = topSpeed;
}
public
Automobile()
{
// TODO:
メンバの初期化を完了する
}
public
void Start()
{
throw
newNotImplementedException();
}
public
bool IsRunning { get; set; }
}
Visual Basic
のコード
PublicClassAutomobile
Sub
New(ByVal model AsString, ByVal
topSpeed AsInteger)
' TODO:
メンバの初期化を完了する
_model
= model
_topSpeed
= topSpeed
End
Sub
Sub
New()
' TODO:
メンバの初期化を完了する
End
Sub
Property
TopSpeed AsInteger
Property
Model AsString
Property
IsRunning AsBoolean
Sub
Start()
Throw
New
NotImplementedException
End
Sub
End
Class
テストを実行するには
1. メインメニューの
[
テスト
]
をクリックし、
[
実行
]
をポイントし
て
、
[
ソリューションのすべてのテスト
]
をクリックします。このコマンドは、現在のソリューション用に記述されたすべてのテストフレームワーク内のすべてのテストを実行します。ここでは2つのテストがあり、両方とも予想どおりに失敗します。
[
テスト結果
]
ウィンドウ
が
次のように表示されます。
.jpg)
ソースコードに移動するには
1. テストを実行して失敗したので、次の手順は、
Automobile
クラスに移動し
、
テストが成功するコードを実装することです。"移動"は
Visual Studio 2010
の新機能であり、この機能を使用すると、型名や名前の一部などのテキスト文字列を簡単に入力
したり
、結果リスト
で
要素をクリック
して
目的の場所に移動
したり
できます。
2. コードエディタ
内で
クリックし、Ctrl
+
, (
Ctrl
+
コンマ
)
キー
を押して
[
移動
]
ダイアログボックスを開きます。次の図に示すように、テキストボックスに「
Start
」と入力します。
.jpg)
ソースコードを実装するには
1. 既定のコンストラクタにコードを追加して、
Model
、
TopSpeed
、および
IsRunning
の各プロパティがそれぞれの正しい既定値である
"Not specified"
、
-1
、および
True
(true)
に
初期化されるようにします。
Visual C#
のコード
public Automobile()
{
this
.Model =
"Not
specified"
;
this
.TopSpeed
= -1;
this
.IsRunning
=
true
;
}
Visual
Basic
のコード
SubNew()
Model = "Not
specified"
TopSpeed = -1
IsRunning = True
End
Sub
2.
Start
メソッドは、呼び出
された時点で
Modelプロパティと
TopSpeed
プロパティ
が
既定値以外の値
に
設定されている場合
にのみ
、
IsRunning
フラグを
true
に設定します。NotImplementedException をメソッド
本体
から削除し、テストが成功する
ように
目的の動作を実装します。
Visual C#
のコード
public
void
Start()
{
if
(
this
.Model !=
"Not specified"
||
this
.TopSpeed != -1)
this
.IsRunning
=
true
;
else
this
.IsRunning
=
false
;
}
Visual Basic
のコード
Sub
Start()
If
Model
<> "Not specified"Or TopSpeed <> -1 Then
IsRunning = True
Else
IsRunning = False
End If
End
Sub
テストを再実行するには
1. メインメニューの
[
テスト
]
をクリックし、
[
実行
]
をポイントし
て
、
[
ソリューションのすべてのテスト
]
をクリックします。今回は、テストは成功します。
[
テスト結果
]
ウィンドウ
が
次のように表示されます。
.jpg)