3.同じユニットテストをWindowsとPhoneでいっぺんに実行する方法
ここまでで、Windowsストアアプリ用のユニットテストプロジェクトからテストファーストでCalcクラスのAddメソッドを作りました。これは、Windows Phone用のユニットテストをしなくてもよいでしょうか?
Addメソッドのようなシンプルなコードでは、その必要はないでしょう。しかし、現実のコードでは、Windowsストアアプリ用としてコンパイルした場合と、Windows Phone用としてコンパイルした場合で、テスト結果が異なることがあります。例えば、StorageFolderクラスです。Windowsストアアプリ用にはTryGetItemAsyncメソッドがありますが、Windows Phone用にはそのメソッドが存在しません。あるいは、両方に存在していても、実行結果が異なるものもあります。従って、ユニバーサルプロジェクトでWindowsストアアプリとWindows Phoneの両方から共通で使うコードには、両方のユニットテストが必要です。
ユニットテストのプロジェクトには、共有プロジェクトがありません(注2)。すると、WindowsストアアプリとWindows Phoneストアアプリ用のそれぞれのユニットテストプロジェクトに、同じテストコードを書かなければならないのでしょうか?
Visual Studio 2013では、共有プロジェクトを自由に作成することはできません。しかし、後編で紹介するツールを使えば可能です(ただし有償版のVisual Studio 2013のみ)。また、次期Visual Studioである"14"のCTP3には、共有プロジェクトを作成する機能が追加されました。まず間違いなく、次期製品版には反映されるでしょう。
プロジェクト間でユニットテストをリンクする
プロジェクトに既存の項目をリンクとして追加することで、同じファイルを二重管理しなくて済むようになります。
Windowsストアアプリ用のユニットテストプロジェクトにある「UnitTest1.cs」ファイルを、Windows Phoneストアアプリ用のユニットテストプロジェクトにリンクとして追加してみましょう。
Windows Phoneストアアプリ用のユニットテストプロジェクトに存在する同名の「UnitTest1.cs」ファイル(先ほどAssert.Inconclusiveメソッドだけを追記したファイル)は、もう使わないので削除します。
そうしたら、ソリューションエクスプローラーでWindows Phoneストアアプリ用のユニットテストプロジェクト(または、その配下のファイルのどれか)を選択しておき、メニューの[プロジェクト]-[既存の項目の追加]を選びます。表示された[既存項目の追加]ダイアログで、Windowsストアアプリ用のユニットテストプロジェクトにある「UnitTest1.cs」ファイルを選び、右下の[追加]ボタンの右側にある[▼]をクリックし、出てきたドロップダウンで[リンクとして追加]を選びます。
これで、CalcクラスのAddメソッドをテストするコードが、Windows Phone用のユニットテストプロジェクトにも含まれました。「UnitTest1.cs」ファイルを開いてみると、左上のドロップダウンでコンテキスト(Windowsストアアプリ用として解釈するか、Windows Phone用として解釈するか)を切り替えられるようになっています(次の画像の赤枠内)。
そしてテストエクスプローラーで[すべて実行]をクリックすれば、CalcクラスのAddメソッドのテストが、Windowsストアアプリの環境と、Windows Phoneの環境でいっぺんに実行されます。
このように、プロジェクト間のリンクを使うことで、ユニットテストも「共有」できました。
なお、ダウンロードできるサンプルソースには、この最後の状態のコードを収めてあります。
まとめ
-
次のようなユニバーサルプロジェクトのアプリ/クラスライブラリーに対してユニットテストのプロジェクトを作成できる
- Windowsストアアプリ
- Windows Phone Windowsランタイムアプリ
- PCL
- WinMD
- Windowsストアアプリ用のユニットテストも、Windows Phoneストアアプリ用のユニットテストも、Visual Studio 2013のテストエクスプローラーから実行できる
- プロジェクト間のリンクを使うことで、ユニットテストも「共有」できる。その際には、コンテキストの切り替え機能も有効になる
MSTestでもパラメタライズドテストが可能になりました! 次回、後編ではMSTestの新機能などを解説します。



