連載:VSTSの単体テスト機能は本当に使えるのか?

第3回 VSTSで提供される注目すべき単体テスト機能

株式会社 アークウェイ 中西 庸文
Microsoft MVP 2006 - Solutions Architect)
2007/02/07
Page1 Page2 Page3 Page4

データ・ドリブン単体テストの記述

 まず、新しいテスト・クラスを追加する。VS 2005のソリューション・エクスプローラ上で、「PetShop.Tests」プロジェクトを右クリックしてコンテキスト・メニューを表示し、[追加]−[新しいテスト]を選択する。テンプレートとして「単体テスト」が選択された状態で[新しいテストの追加]ダイアログ上でテスト名に「CartTest」と入力し、テスト・クラスをテスト・プロジェクトに追加する。

テスト・クラスの追加
VS 2005のソリューション・エクスプローラ上で、テスト・プロジェクトを右クリックしてコンテキスト・メニューを表示し、そこから[追加]−[新しいテスト]を選択する。これにより、テスト・クラスをテスト・プロジェクトに追加するためのダイアログが表示される。

 次に、追加されたCartTestクラスにテスト・メソッドのメソッド・スタブを記述する。

[TestMethod]
public void カートに商品が追加できるべき()
{
}
テスト・メソッドのメソッド・スタブ

 続いてこのテスト・メソッドがデータ・ドリブン単体テストとなるように、データ接続の設定を行う。

 VS 2005のメニュー・バーから[テスト]−[ウィンドウ]−[テスト ビュー]を選択してテスト・ビューを表示する。テスト・ビューで「カートに商品が追加できるべき」のテストを選択すると、プロパティ・ウィンドウに[データ接続文字列]が表示されるので、ここでテスト用データベースへの接続設定を行う。[接続のプロパティ]ダイアログ上で、テスト用データベースのあるサーバ名とデータベースを選択して設定を保存する。

データ接続の設定
テスト・ビューで対象の単体テストを選択すると表示されるプロパティ・ウィンドウの[データ接続文字列]で[…]ボタンをクリックする。これにより、テスト用データベースへの接続設定を行うためのダイアログが表示される。

 続いてプロパティ・ウィンドウの[データ テーブル名]に「AddCartTest」と入力する。

 これらの設定によって自動的に変更されたテスト・メソッドの属性を以下に示す。サーバ名は適宜読み替えてほしい。

[DataSource("System.Data.SqlClient", "Data Source=ARCHWAY-TSUNE02;Initial Catalog=MSPetShop4UnitTest;Integrated Security=True", "AddCartTest", DataAccessMethod.Sequential), TestMethod]
public void カートに商品が追加できるべき()
{
}
データ接続の設定が反映されたテスト・メソッドのスケルトン・コード

 データ・ドリブン単体テストでは、テスト用テーブルから取得されたテスト・データにアクセスするためにTestContextプロパティを用意する必要がある。

 テスト対象のクラスから単体テストを自動生成した場合にはTestContextプロパティの記述は自動的に追加されるが、今回のように手動でテスト・クラスを作成した場合には自分でTestContextプロパティの記述を行う必要がある。

 それではCartTestクラスにTestContextプロパティの記述を追加しよう。なお、TestContextプロパティの値は、VSTSのテスティング・フレームワークによって実行時に割り当てられることになる。

private TestContext testContextInstance;

/// <summary>
/// 現在のテスト実行の情報および機能を提供するテスト・コンテキスト
/// を取得または設定する。
/// </summary>
public TestContext TestContext
{
  get { return testContextInstance; }
  set { testContextInstance = value; }
}
TestContextプロパティの記述

 これでようやくデータ・ドリブン単体テストの実装を行うことができる。テスト用テーブルに格納されているテスト・データへのアクセスは、TestContext.DataRowプロパティを呼び出すことによって可能となる。

 以下に完成したテスト・クラスの内容を示す。

using System;
using System.Text;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Data;
using PetShop.BLL;
using PetShop.Model;

namespace PetShop.Tests
{
  /// <summary>
  /// CartTestの概要の説明。
  /// </summary>
  [TestClass]
  public class CartTest
  {
    private TestContext testContextInstance;

    /// <summary>
    /// 現在のテストの実行についての情報および機能を提供する
    /// テスト・コンテキストを取得または設定する。
    /// </summary>
    public TestContext TestContext
    {
      get { return testContextInstance; }
      set { testContextInstance = value; }
    }
    ……省略……
    [TestMethod]
    [DataSource("System.Data.SqlClient", "Data Source=ARCHWAY-TSUNE02;Initial Catalog=MSPetShop4UnitTest;Integrated Security=True", "AddCartTest", DataAccessMethod.Sequential)]
    public void カートに商品が追加できるべき()
    {
      // テスト用テーブルからテスト・データを取得する。
      string itemId = (string)TestContext.DataRow["ItemId"];
      string productId = (string)TestContext.DataRow["ProductId"];
      string name = (string)TestContext.DataRow["Name"];
      decimal price = (decimal)TestContext.DataRow["Price"];
      int quantity = (int)TestContext.DataRow["Quantity"];

      // カートに追加するアイテムを生成する。
      CartItemInfo item = new CartItemInfo(
        itemId, name, quantity, price,
        string.Empty, string.Empty, productId);

      // カートにアイテムを追加する。
      Cart cart = new Cart();
      cart.Add(item);

      // テスト用テーブルからテスト・データを取得する。
      int count = (int)TestContext.DataRow["Count"];
      decimal total = (decimal)TestContext.DataRow["Total"];

      // カートのアイテム数量と合計金額を確認する。
      Assert.AreEqual<int>(count, cart.Count);
      Assert.AreEqual<decimal>(total, cart.Total);
    }
  }
}
完成したテスト・クラス

 それでは、データ・ドリブン単体テストを実行してみよう。


 INDEX
  VSTSの単体テスト機能は本当に使えるのか?
  第3回 VSTSで提供される注目すべき単体テスト機能
    1.VSTSの単体テスト機能
    2.データ・ドリブン単体テストの準備
  3.データ・ドリブン単体テストの記述
    4.ASPNET単体テスト
 
インデックス・ページヘ  「VSTSの単体テスト機能は本当に使えるのか?」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間