.NET Tools

テスト駆動開発ツール最前線(前編)

− .NET用テスト駆動開発支援ツールNUnitの新機能 −

(株)ピーデー 川俣 晶
2004/11/06
Page1 Page2 Page3

GUIテストランナーとテストのための新機能

 新機能の中でも特に注目すべきはMockオブジェクトのサポートなのだが、最初から取り組むにはやや大物過ぎるかもしれない。そこで、まずは比較的簡単な話題から入っていくことにしよう。

 テストの数が増えてくると、やはりきめ細かくテストを行いたいという希望が出てくる。例えば、気軽にいつでも実行できるように全テストの実行が30秒で終わるようになっていたとしても、コード修正とテスト実行を繰り返す状況でいつも30秒待つのはつらい。そのため、実行したいテストだけチェック・ボックスにチェックを入れる機能や、あらかじめテストをカテゴリ分けしておき、特定のカテゴリだけ実行する機能などが用意されている。それらを体験するために、以下のようなサンプル・コードを用意してみた。

 なお、プログラム言語としてはVisual Basic .NET(以下、VB.NET)を使用している。ここでは、Visual Studio .NET 2003(以下、VS.NET)を使用し、VB.NETのクラス・ライブラリとしてプロジェクトを作成。そして、プロジェクトの参照で「nunit.framework.dll」を追加した。その後、以下のようなソース・コードを入力して完了である。

Imports NUnit.Framework

' テストを行うクラス

<TestFixture()> Public Class TestClass1

  ' AreEqualメソッドの使用例
  <Category("SuccessSamples")> _
  Public Sub TestByAreEqual()
    Assert.AreEqual(2, TargetClass1.Sample1(1))
  End Sub

  ' AreSameメソッドが成功する例

  <Category("SuccessSamples")> _
  Public Sub TestSuccessByAreSame()
    Dim s As String = "Test String"
    Assert.AreSame(s, TargetClass1.Sample2(s))
  End Sub

  ' AreSameメソッドが失敗する例

  <Category("FailSamples")> _
  Public Sub TestFailByAreSame()
    Dim s As String = "Test String"
    Dim sb As New System.Text.StringBuilder
    sb.Append(s)
    Assert.AreSame(s, TargetClass1.Sample2(sb.ToString()))
  End Sub

  ' Ignoreメソッドの使用例
  <Category("OtherSamples")> _
  Public Sub TestByIgnore()
    Assert.Ignore()
  End Sub

  ' Failメソッドの使用例
  <Category("FailSamples")> _
  Public Sub TestByFail()
    Assert.Fail()
  End Sub

  ' さまざまな判定メソッドの使用例

  <Category("SuccessSamples")> _
  Public Sub TestByEtc()
    Assert.IsFalse(False)
    Assert.IsNotNull("Sample String")
    Assert.IsNull(Nothing)
    Assert.IsTrue(True)
  End Sub

  ' 配列比較の使用例(成功するケース)
  <Category("SuccessSamples")> _
  Public Sub TestSuccessByArrayEqual()
    Dim wishArray() As Integer = {0, 1, 2}
    Assert.AreEqual(wishArray, TargetClass1.Sample3(3))
  End Sub

  ' 配列比較の使用例(失敗するケース)

  <Category("FailSamples")> _
  Public Sub TestFailByArrayEqual()
    Dim wishArray() As Integer = {0, 1, 3}
    Assert.AreEqual(wishArray, TargetClass1.Sample3(3))
  End Sub

  ' Explicit属性の使用例

  <Category("OtherSamples"), Explicit()> _
  Public Sub TestByExplicitAttribute()
    Assert.AreEqual(2, TargetClass1.Sample1(1))
  End Sub

End Class

' テスト対象となるダミーのクラス
Public Class TargetClass1

  ' 引数より1つ多い値を返す
  Public Shared Function Sample1(ByVal n As Integer) As Integer
    Return n + 1
  End Function

  ' 引数のオブジェクトをそのまま返

  Public Shared Function Sample2(ByVal o As Object) As Object
    Return o
  End Function

  ' 指定値のサイズを持ち、0 〜 (指定値-1)の値を含む配列を返す

  Public Shared Function Sample3(ByVal n As Integer) As Integer()
    Dim array1(n - 1) As Integer
    For i As Integer = 0 To n - 1
      array1(i) = i
    Next
    Return array1
  End Function

End Class
NUnit 2.2のGUIテストランナー用サンプル・コード(VB.NET)

 これを、NUnit 2.2のGUIテストランナーにより実行させると以下のような結果になる。

NUnit 2.2のGUIテストランナー実行画面

 なお、画面左側のツリーにチェック・ボックスが表示されていない場合は、[View]メニューの[CheckBoxes]を選択すると表示される。

 さて、このサンプル・コードには意図的に失敗するテストが含まれているので、成功を示す緑のマーク(緑の丸印)ほかに、失敗の赤いマークも見える。しかし、そのほかに、無視の黄色も見える。従来のNUnitは、緑と赤だけの世界であったが、使い方によって成功でも失敗でもない状態を意図的に作り出すことができる。それにどのような価値があるかは以下の解説の中で説明しよう。

■テストをカテゴリで分類するCategory属性

 まず初めに個々のテスト・メソッドに付いているCategory属性に注目していただきたい。これは、テストをカテゴリ分けするために使用する。テストを目的などによって、「database」「search」「input」などと名前を付けて分類することができる。名前はCategory属性の引数に文字列を渡して指定する。同じ名前を持つテスト・メソッドは、同じカテゴリに属することになる。

 このカテゴリを使って、実行するテストを限定することができる。例えば、成功するテストだけを集めたカテゴリ「SuccessSamples」だけをテストするには、[Categories]タブでこれを選択し、[Add]ボタンをクリックしてから[Run]ボタンをクリックすればよい。

SuccessSamplesカテゴリの選択
テスト・メソッドにはCategory属性によりカテゴリを設定できる。GUIテストランナーの[Categories]タブには利用可能なカテゴリの一覧が表示されるので、テストをするカテゴリを[Add]ボタンにより選択し、[Run]ボタンをクリックすれば、指定したカテゴリのテストだけを実行することができる。

 どのテストが実行されたのかは、[Tests]タブをクリックすると確認できる。

SuccessSamplesカテゴリのテスト画面
指定したカテゴリのテスト結果は、[Tests]タブに切り替えると確認できる。指定カテゴリ以外のテストは実行されずにグレーで表示される。

 このように、指定カテゴリに含まれない(指定カテゴリの名前が付いていない)テストは、緑にも赤にも黄色にもならず、グレーのまま残り、実行の対象になっていないことが分かる。

 このようなカテゴリ分けは、テストの規模が大きくなってくると便利である。いくら、気軽にいつでも実行できるようにできるだけ短時間で完了するようにテストを作ったとしても、プログラムの規模が大きくなるにつれてテストの数が増えれば、気軽には実行できなくなる。自分が扱っている部分と関係が深い部分だけテストを行いたい、と思うこともあるだろう。

 これに対処する最も簡単な方法は、カテゴリごとにテストのアセンブリを分けることだが、自分の担当するカテゴリと関係の深い別のカテゴリをテストしようと思うと、別のアセンブリをGUIテストランナーに追加しなければならず、手間が増える。また、たまには全テストを行おうと思った場合、すべてのテスト・アセンブリを追加する手間が発生する。

 これに対して、Category属性を使ったカテゴリ分けであれば、クリック1つでテスト対象のカテゴリを増減でき、すべてのテストを実行するのも容易。さらに、[Exclude these categories]オプションにチェックを入れることにより、指定カテゴリ以外のテストだけを実行することも可能なので、何らかの理由で失敗することが分かっている特定カテゴリだけを除外したテストもでき、はるかに使い勝手に優れる。


 INDEX
  [.NET Tools]
  テスト駆動開発ツール最前線(前編)
     1.プログラム開発の効率をアップするための方法
   2.GUIテストランナーとテストのための新機能(1)
     3.GUIテストランナーとテストのための新機能(2)
  テスト駆動開発ツール最前線(後編)
     1.Test Driven .NETによる統合されたテスト
     2.Mockオブジェクトとは何か− NUnitのMockオブジェクト
     3.より高度なMockオブジェクトを実現するNMock
 
インデックス・ページヘ  「.NET Tools」


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 記事ランキング

本日 月間