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

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

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

3. 型チェックを行うためのアサーション

 続いて、型チェックを行うためのアサーションの使い方を見てみよう。

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

namespace VSTSTestingFrameworkLearning.Tests
{
  [TestClass]
  public class TypeAssertsTest
  {
    [TestMethod]
    public void 同型チェックが成功すべき()
    {
      string actual = "Test";
      Assert.IsInstanceOfType(actual, typeof(string));
    }

    [TestMethod]
    [ExpectedException(typeof(AssertFailedException))]
    public void 同型チェックが失敗すべき()
    {
      string actual = "Test";
      Assert.IsInstanceOfType(actual, typeof(int));
    }

    [TestMethod]
    public void 異型チェックが成功すべき()
    {
      string actual = "Test";
      Assert.IsNotInstanceOfType(actual, typeof(int));
    }

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

 VSTSのテスティング・フレームワークの型チェックのアサーションでは、第1引数がactual(=実測地)で第2引数がexpected(=期待値)となっている点に注意する必要がある。

 NUnitは型チェックのアサーションでも他のアサーションと同様に、第1引数がexpectedで第2引数がactualである。また、NUnitには型へのインスタンス代入の可否をチェックするためのIsAssingableFromメソッドとIsNotAssingableFromメソッドも用意されている。

4. 状態テストを行うためのアサーション

 次に、状態テストを行うためのアサーションの使い方を見てみよう。

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

namespace VSTSTestingFrameworkLearning.Tests
{
  [TestClass]
  public class ConditionTestsTest
  {
    [TestMethod]
    [ExpectedException(typeof(AssertInconclusiveException))]
    public void テストの結論が出ないことを主張するために例外をスローすべき()
    {
       Assert.Inconclusive();
    }

    [TestMethod]
    public void ブール値の真チェックが成功すべき()
    {
      Assert.IsTrue(true);
    }

    [TestMethod]
    [ExpectedException(typeof(AssertFailedException))]
    public void ブール値の真チェックが失敗すべき()
    {
      Assert.IsTrue(false);
    }

    [TestMethod]
    public void ブール値の偽チェックが成功すべき()
    {
      Assert.IsFalse(false);
    }

    [TestMethod]
    [ExpectedException(typeof(AssertFailedException))]
    public void ブール値の偽チェックが失敗すべき()
    {
      Assert.IsFalse(true);
    }

    [TestMethod]
    public void Nullチェックが成功すべき()
    {
      Assert.IsNull(null);
    }

    [TestMethod]
    [ExpectedException(typeof(AssertFailedException))]
    public void Nullチェックが失敗すべき()
    {
      Assert.IsNull(new object());
    }

    [TestMethod]
    public void 非Nullチェックが成功すべき()
    {
      Assert.IsNotNull(new object());
    }

    [TestMethod]
    [ExpectedException(typeof(AssertFailedException))]
    public void 非Nullチェックが失敗すべき()
    {
      Assert.IsNotNull(null);
    }
  }
}
状態テストのアサーションの使い方を学習するために記述したテスト・コード

 VSTSのテスティング・フレームワークでは自動生成されたテスト・コードにおいて開発者にテストとして機能するアサーションの記述を促すために(自動生成されたテスト・コードではアサーションの記述までは行ってくれない)、例外をスローするInconclusiveメソッドが用意されている。

 NUnitでは非数値チェックのためのIsNaNメソッド、文字列やコレクションの空チェックのためのIsEmptyメソッド、IsNotEmptyメソッドなど豊富な状態テストのアサーションも用意されているが、VSTSではこれらは用意されていない。

5. 文字列比較を行うためのアサーション

 さらに、文字列比較を行うためのアサーションの使い方を見ていこう。

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

namespace VSTSTestingFrameworkLearning.Tests
{
  [TestClass]
  public class StringAssertTest
  {
    [TestMethod]
    public void 文字列に部分文字列が含まれているかどうかのチェックが成功すべき()
    {
      StringAssert.Contains("Test", "es");
    }

    [TestMethod]
    [ExpectedException(typeof(AssertFailedException))]
    public void 文字列に部分文字列が含まれているかどうかのチェックが失敗すべき()
    {
      StringAssert.Contains("Behaviour", "es");
    }

    [TestMethod]
    public void 指定した部分文字列で始まっているかどうかのチェックが成功すべき()
    {
      StringAssert.StartsWith("Test", "T");
    }

    [TestMethod]
    [ExpectedException(typeof(AssertFailedException))]
    public void 指定した部分文字列で始まっているかどうかのチェックが失敗すべき()
    {
      StringAssert.StartsWith("Behaviour", "T");
    }

    [TestMethod]
    public void 指定した部分文字列で終わっているかどうかのチェックが成功すべき()
    {
      StringAssert.EndsWith("Test", "t");
    }

    [TestMethod]
    [ExpectedException(typeof(AssertFailedException))]
    public void 指定した部分文字列で終わっているかどうかのチェックが失敗すべき()
    {
      StringAssert.EndsWith("Behaviour", "t");
    }

    [TestMethod]
    public void 正規表現と一致するかどうかのチェックが成功すべき()
    {
      StringAssert.Matches("Test Driven Development", new Regex(@"\s+"));
    }

    [TestMethod]
    [ExpectedException(typeof(AssertFailedException))]
    public void 正規表現と一致するかどうかのチェックが失敗すべき()
    {
      StringAssert.Matches("TestDrivenDevelopment", new Regex(@"\s+"));
    }

    [TestMethod]
    public void 正規表現と一致しないかどうかのチェックが成功すべき()
    {
      StringAssert.DoesNotMatch("TestDrivenDevelopment", new Regex(@"\s+"));
    }

    [TestMethod]
    [ExpectedException(typeof(AssertFailedException))]
    public void 正規表現と一致しないかどうかのチェックが失敗すべき()
    {
      StringAssert.DoesNotMatch("Test Driven Development", new Regex(@"\s+"));
    }
  }
}
文字列比較のアサーションの使い方を学習するために記述したテスト・コード

 VSTSのテスティング・フレームワークには正規表現を使用して文字列を比較するための強力なMatchesメソッドとDoesNotMactchメソッドが用意されているのに対して、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 記事ランキング

本日 月間