SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine(コードジン) DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

C#で始めるテスト駆動開発入門

ユニバーサルWindowsアプリのユニットテスト(前編)

C#で始めるテスト駆動開発入門(8)

ダウンロード CsTdd08.zip (125.1 KB)

Windowsストアアプリ用のユニットテストプロジェクトを追加する

 ユニットテストのプロジェクトは「ユニバーサル」になっていません。Windowsストアアプリ用とWindows Phoneストアアプリ用と、別々にプロジェクトを用意します。

プロジェクトを追加する

 まず、Windowsストアアプリ用のユニットテストプロジェクトから追加してみましょう。ここまでとは異なり、新しいプロジェクトを追加するダイアログの左側では[インストール済み]-[Visual C#]-[ストア アプリ]-[Windows アプリ]を選びます。そして、ダイアログの中央で[単体テスト ライブラリ]を指定します。

Windowsストアアプリ用のユニットテストプロジェクトを追加する
Windowsストアアプリ用のユニットテストプロジェクトを追加する

 このユニットテストのプロジェクトには、次のプロジェクトへの参照設定をしておきます。

  • ユニバーサルプロジェクトのWindowsストアアプリ用プロジェクト
  • PCLのプロジェクト
  • WinMDのプロジェクト

ユニットテストが動作することを確認する

 追加したユニットテストのプロジェクトで簡単なユニットテストを書いて、ちゃんとユニットテストが動作するかどうか確かめておきましょう。参照設定をした3つのプロジェクトのそれぞれに、Calcクラスとその中にAddメソッドをテストファーストで作ってみます。

 作成したユニットテストプロジェクトに自動生成されている「UnitTest1.cs」ファイルを開き、クラスの中身を次のように書き換えます(3つまとめて示しますが、実際には1つずつ作っていきます)。なお、MSTestでテストを書く基本的な方法は従来と変わっていませんので、連載第2回『Visual StudioのMSTestでTDDを行う方法』を参考にしてください。

テストコード: 3つのプロジェクトにCalcクラスのAddメソッドを作る
[TestClass]
public class UnitTest1
{
  // PCL プロジェクトの Calc クラスの Add メソッド
  [TestMethod]
  public void Pcl_AddTest()
  {
    Assert.AreEqual<int>(3, CsTdd08Pcl.Calc.Add(1, 2));
  }

  // WinMD プロジェクトの Calc クラスの Add メソッド
  [TestMethod]
  public void WinMD_AddTest()
  {
    Assert.AreEqual<int>(3, CsTdd08WinMD.Calc.Add(1, 2));
  }

  // 共有プロジェクトの Calc クラスの Add メソッド
  [TestMethod]
  public void SharedProject_AddTest()
  {
    Assert.AreEqual<int>(3, CsTdd08App.Calc.Add(1, 2));
  }
}

 これはコンパイルできないので、次の画像のように赤い波線でエラーが報告されます。正しくプロジェクトの参照設定ができていれば、名前空間の記述はエラーになりません。その後ろのCalcクラスが存在しないというエラーになるはずです。

まだCalcクラスが存在しないので、ビルドエラーになった
まだCalcクラスが存在しないので、ビルドエラーになった

 想定通りのエラーになったことが確認できたら、それぞれのプロジェクトにCalcクラスを作成します(次の画像)。Windowsストアアプリ用のCalcクラスは、ここでは共有プロジェクト(プロジェクト名の末尾が「.Shared」)に置きます。また、WinMDプロジェクトのCalcクラスは、sealedにしなければなりません。

それぞれのプロジェクトにCalcクラスを作成した
それぞれのプロジェクトにCalcクラスを作成した

 これでビルドして、ユニットテストのコードに戻ってみると、こんどはAddメソッドがないというコンパイルエラーになっているはずです。

まだAddメソッドが存在しないので、ビルドエラーになった
まだAddメソッドが存在しないので、ビルドエラーになった

 そこで、上の画像にあるように、Addメソッドのスケルトンを自動生成させます(Expressでも可能です)。なお、筆者の環境では、共有プロジェクト内にメソッドのスケルトンを自動生成できなかったので、PCLプロジェクトに生成されたコードをコピー&ペーストしました。

製品コード: 自動生成されたAddメソッドのスケルトン
public static int Add(int p1, int p2)
{
  throw new NotImplementedException();
}

 これでビルドできるようになったので、ユニットテストを走らせてみましょう。左端からテストエクスプローラーを引き出し(左端にいない場合は、メニューの[テスト]-[ウィンドウ]-[テスト エクスプローラー])、[すべて実行]をクリックします。

テストエクスプローラーからすべてのユニットテストを実行する
テストエクスプローラーからすべてのユニットテストを実行する

 テスト結果はRED(失敗)になるはずですね(次の画像)。

Addメソッドの中身はまだ実装していないのでREDになる
Addメソッドはまだ実装していないのでREDになる

 それぞれのAddメソッドを実装して、ユニットテストを実行し、テスト結果のGREEN(成功)を確認できたら、ユニットテストの動作確認は完了です。

製品コード: 完成したAddメソッド
public static int Add(int m, int n)
{
  return m + n;
}
Addメソッドを実装してGREENを確認した
Addメソッドを実装してGREENを確認した
警告:「Resources found for language(s)」

 Windows用の(次で説明するPhone用も)ユニットテストのプロジェクトをビルドすると、次のような警告が出ることがあります。

警告 1 Resources found for language(s) 'en-us' but no resources found for default language(s): 'ja'. Change the default language or qualify resources with the default language.(後略)

 これは、MSTestのフレームワークが自動生成するリソースファイル(「Microsoft.VisualStudio.TestPlatform.Extensions. MSAppContainerAdapter.(中略).resw」という長いファイル名が付いています)がen-USしか用意されていないためです。この警告が出ていても問題ありませんが、気になるようなら(そして、テスト時の言語設定を変えても問題なければ)テストプロジェクトのマニフェストで既定の言語を「ja-JP」から「en-US」に変更してください。

次のページ
Windows Phoneストアアプリ用のユニットテストプロジェクトを追加する

この記事は参考になりましたか?

C#で始めるテスト駆動開発入門連載記事一覧

もっと読む

この記事の著者

biac(ばいあっく)

HONDA R&Dで自動車の設計をやっていた機械屋さんが、技術の進化スピードに魅かれてプログラマーに。以来30年ほど、より良いコードをどうやったら作れるか、模索の人生。わんくま同盟の勉強会(名古屋)で、よく喋ってたりする。2014/10~2019/6 Microsoft MVP (Windows Devel...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/8035 2014/10/07 14:00

おすすめ

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー