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

第2回 アジャイル開発者から見たVSTSテスト機能

太陽システム株式会社 中西 庸文
Microsoft MVP 2006 - Solutions Architect)
2006/09/20

VSTSの単体テストとNUnitとの比較

 以下の比較ではNUnit 2.2.8を用いている。

VSTSの単体テストの問題点とその対処方法

 筆者が実際にVSTSの単体テストを使用した感想は、NUnitと同様にテスト駆動開発の実践が可能であるというものだ。

 とはいえ、VSTSの単体テストはNUnitと比べて実行速度が遅い。これはVSTSのテスト・ランナー(=テスト実行ツール)を使用すると、ソリューション・フォルダ直下のTestResultsフォルダに「ユーザー名+マシン名+日時」ごとにフォルダが作成され、必要なアセンブリがコピーされたうえで単体テストが実行されるためだ。このためにテストを繰り返し実行するとかなりのディスク・スペースが圧迫される点が特に気になる。

 筆者がこの記事を執筆するに当たって作成した簡単なサンプル・プログラム(最終的にはプロダクト・コードにおいてクラスが1つにメソッドが2つ、テスト・コードにおいてはクラスが1つにメソッドが4つ)でさえ、テスト駆動開発のスタイルを取って作成していくとTestResultsフォルダの容量は7Mbytesを超えてしまった。

テスト実行によるディスク・スペースの圧迫
VSTSを利用してテスト駆動開発を行った場合、簡単なサンプル・プログラムであってもかなりディスク・スペースを消費してしまう。

 これらのファイル群はトレーサビリティ(追跡可能性)をサポートするために作成されるものだろうが、テスト駆動開発においてはボトル・ネック以外の何物でもない。

 実際の開発においてテスト駆動開発を実践すれば、開発の初期段階からすべての単体テストを繰り返し実行することになるので相当なディスク・スペースが必要とされることが容易に想像できる。ディスク・スペースに余裕のない開発マシン上ではTestResultsフォルダをクリーン・アップするスクリプトを作成して定期的に実行するなどの対処が必要となるだろう。

 なお、この問題はTestDriven.NETをVSTSの単体テストと併用することで解決できる。TestDriven.NETを使用すれば、コンテキスト・メニューからVSTSの単体テストのテスト・ランナーとしてNUnitを選択することが可能である(この方法は、「開発をもっと楽にするNAgileの基本思想」の連載でおなじみの小島 富治雄氏に教えていただいた。)。

 テスト・ランナーにNUnitを使用すれば、TestResultsフォルダにディスク・スペースを圧迫されることなく速い実行速度を確保することができる。次の画面はこれを実際に行っている例だ。

TestDriven.NETのコンテキスト・メニューからNUnitでVSTSの単体テストを実行
ソリューション・エクスプローラで右クリックによりコンテキスト・メニューを表示し、そこから[Test With]−[NUnit]を選択する。これにより、NUnitのテスト・ランナー経由で、VSTSにのっとって記述した単体テストのコードを実行できる。

 また、特定のテストを実行しないことを示すIgnore属性がつけられたテストは、VSTSのテスト・ランナーでは単に実行されないだけだが、テスト・ランナーにNUnitを使用すれば黄色く表示されるので、うっかりと見落としてしまうことはない。

実行を除外したテストが黄色く表示されたNUnit
VSTSのテスト・ランナーでは除外されたテストはテスト結果ウインドウに表示されない。

 実はVSTSの単体テストをNUnitで実行できるのはTestDriven.NETの機能ではなく、NUnit側で用意されている機能である。NUnitではVSTSで作成された単体テストのアセンブリを読み込むと、VSTSのテスティング・フレームワークがロードされるようになっている。

 現在ロードされているテスティング・フレームワークの情報は、nunit-gui(=NUnitのテスト・ランナー)のメニュー・バーから[Tools]−[Loaded Test Frameworks]を選択した際に表示される[Framework Info]ダイアログ上で確認することができる。

VSTSのテスティング・フレームワークがロードされたNUnitのnunit-gui
nunit-guiのメニュー・バーから[Tools]−[Loaded Test Frameworks]を選択すると、このような[Framework Info]ダイアログが表示される。

 また、TestDriven.NETを使用すれば、コード・エディタやソリューション・エクスプローラで表示できるコンテキスト・メニューからVSTSのコード・カバレッジ・ツールを実行することもできる。これによってVSTSのテスト・ランナーを使用しなくてもコード・カバレッジを計測することが可能になる。

TestDriven.NETを使用したVSTSのコード・カバレッジ・ツールの実行
VS 2005のIDEのコード・エディタ上もしくはソリューション・エクスプローラ上の項目を右クリックすると表示されるコンテキスト・メニューから[Test With]−[Coverage]を選択すると、VSTSのコード・カバレッジを実行できる。

VSTSのテスティング・フレームワークのアサーション

 筆者は新しいフレームワークの使用方法を学習する際には、前述したDeveloper TestのバリエーションであるLearning Testを実施するようにしている。なぜなら新しいことを学習する際に、実際に手を動かす以上に効果的に学習できるすべなど存在しないからだ。

 それでは筆者がVSTSのテスティング・フレームワークの学習目的で実際に作成したLearning Testを使用して、VSTSのテスティング・フレームワークとNUnitとを比較してみよう。

1. 同値チェックを行うためのアサーション

 まずは、アサーションの基本となる同値チェックを行うためのアサーションの使い方から見ていこう(なおアサーションとは、プログラム実行中の値や状態が不適切である場合を検出するためのコードである。具体的には以下のコードを参照してほしい)。

 以降のコードはすべてVSTSのテスティング・フレームワークにより記述したコードである。

using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace VSTSTestingFrameworkLearning.Tests
{
  [TestClass]
  public class EqualityAssertsTest
  {
    [TestMethod]
    public void 同値チェックが成功すべき()
    {
      Assert.AreEqual(1, 1);
    }

    [TestMethod]
    [ExpectedException(typeof(AssertFailedException))]
    public void 同値チェックが失敗すべき()
    {
      Assert.AreEqual(1, 2);
    }

    [TestMethod]
    public void ジェネリックバージョンで同値チェックが成功すべき()
    {
      Assert.AreEqual<int>(1, 1);
    }

    [TestMethod]
    [ExpectedException(typeof(AssertFailedException))]
    public void ジェネリックバージョンで同値チェックが失敗すべき()
    {
      Assert.AreEqual<int>(1, 2);
    }

    [TestMethod]
    public void 異値チェックが成功すべき()
    {
      Assert.AreNotEqual(1, 2);
    }

    [TestMethod]
    [ExpectedException(typeof(AssertFailedException))]
    public void 異値チェックが失敗すべき()
    {
      Assert.AreNotEqual(1, 1);
    }

    [TestMethod]
    public void ジェネリックバージョンで異値チェックが成功すべき()
    {
      Assert.AreNotEqual<int>(1, 2);
    }

    [TestMethod]
    [ExpectedException(typeof(AssertFailedException))]
    public void ジェネリックバージョンで異値チェックが失敗すべき()
    {
      Assert.AreNotEqual<int>(1, 1);
    }
  }
}
同値チェックのアサーションの使い方を学習するために記述したテスト・コード

 このテスト・コードから分かるように、VSTSのテスティング・フレームワークの同値チェックのアサーションの記述方法は、NUnitのそれとほぼ同じだ。

 ただし、VSTSのテスティング・フレームワークにはジェネリック・バージョンのアサーションも用意されている。これによってVSTSの場合、NUnitのテスティング・フレームワークだと実行時まで検出できなかった型の不一致によるエラーが、コンパイル時に検出できる。

2. インスタンスの同値チェックを行うためのアサーション

 次に、インスタンスの同値チェックを行うためのアサーションの使い方を見てみよう。

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace VSTSTestingFrameworkLearning.Tests
{
  [TestClass]
  public class IdentityAssertsTest
  {
    [TestMethod]
    public void インスタンスの同値チェックが成功すべき()
    {
      object expected = new object();
      object actual = expected;
      Assert.AreSame(expected, actual);
    }

    [TestMethod]
    [ExpectedException(typeof(AssertFailedException))]
    public void インスタンスの同値チェックが失敗すべき()
    {
      object expected = new object();
      object actual = new object();
      Assert.AreSame(expected, actual);
    }

    [TestMethod]
    public void インスタンスの異値チェックが成功すべき()
    {
      object expected = new object();
      object actual = new object();
      Assert.AreNotSame(expected, actual);
    }

    [TestMethod]
    [ExpectedException(typeof(AssertFailedException))]
    public void インスタンスの異値チェックが失敗すべき()
    {
      object expected = new object();
      object actual = expected;
      Assert.AreNotSame(expected, actual);
    }
  }
}
インスタンスの同値チェックのアサーションの使い方を学習するために記述したテスト・コード

 インスタンスの同値チェックのアサーションもNUnitとの違いはない。


 INDEX
  VSTSの単体テスト機能は本当に使えるのか?
  第2回 アジャイル開発者から見たVSTSテスト機能
    1.VSTSにおけるアジャイル開発の実践
  2.VSTSの単体テストとNUnitとの比較(1)
    3.VSTSの単体テストとNUnitとの比較(2)
    4.VSTSの単体テストとNUnitとの比較(3)
    5.NUnitからVSTSのテスティング・フレームワークへの移行
 
インデックス・ページヘ  「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 記事ランキング

本日 月間