VisualBasic(MSTestの簡単なサンプル)

■MSTestを使ってみる。
プロジェクトのテンプレートを見ていたときに、Testが目に入ったので、テストプロジェクトを試してみる。単体テスト(Unit test)とのことなので、入力と出力を決めて、サンプルプログラムが正しい動作をしているか確認する。

新しくプロジェクトを作成すると、デフォルトで下のようなコードが入っている。UnitTestingが単体テストを行うためのライブラリ?になると思う。

先にサンプルプログラムを用意しなければならないので、数字を入れて、それに応じたメッセージを出力するクラス(Program)を作った。ここでは、Hell0など、あえて間違ったメッセージを入れている。

Imports System

Class Program
    Function Main(args As String())
        Dim index As Integer = 0
        Dim message As String = ""

        index = Integer.Parse(args(0))

        If index = 0 Then
            message = "Hell0"
        ElseIf index = 1 Then
            message = "Good moring"
        ElseIf index = 2 Then
            message = "Good evening"
        ElseIf index = 3 Then
            message = "Good bye"
        End If

        Return message
    End Function
End Class

次にテスト用のクラス。この中で、ProgramクラスのMain関数に数値を入れ、その出力を期待される結果と比較する。Assert.AreEqual (String, String)で文字列同士の比較ができるよう。始めに固定値として入力と期待される出力を変数に入れ、そこを参照する形でコードを組んでいる。

Imports Microsoft.VisualStudio.TestTools.UnitTesting

Namespace MSTestProject1
    <TestClass>
    Public Class UnitTest1

        Dim RESULT_TEST01 As String() = New String() {"0", "Hello"}
        Dim RESULT_TEST02 As String() = New String() {"1", "Good morning"}
        Dim RESULT_TEST03 As String() = New String() {"2", "Good evening"}
        Dim RESULT_TEST04 As String() = New String() {"3", "Good bye"}
        Dim prog1 As Program = New Program()

        <TestMethod>
        Sub TestSub1()
            Dim args As String() = New String() {RESULT_TEST01(0)}
            Assert.AreEqual(prog1.Main(args), RESULT_TEST01(1))
        End Sub
        <TestMethod>
        Sub TestSub2()
            Dim args As String() = New String() {RESULT_TEST02(0)}
            Assert.AreEqual(prog1.Main(args), RESULT_TEST02(1))
        End Sub
        <TestMethod>
        Sub TestSub3()
            Dim args As String() = New String() {RESULT_TEST03(0)}
            Assert.AreEqual(prog1.Main(args), RESULT_TEST03(1))
        End Sub
        <TestMethod>
        Sub TestSub4()
            Dim args As String() = New String() {RESULT_TEST04(0)}
            Assert.AreEqual(prog1.Main(args), RESULT_TEST04(1))
        End Sub
    End Class
End Namespace

実行は、デバッグからではなく、テストから「すべてのテストを実行」で行う。

結果が下。プログラムのメッセージを間違えていた部分は、期待される結果と異なるので、×になる。ただ、エラーメッセージを見ると、左が期待されるもの、右が実際のものと入れるみたい。

エラーが出たメッセージ部分を修正・保存して、テストを再度実行する。今度はすべて一致した。

今回は簡単なサンプルなので便利な感じはしないけど、複雑なロジックのコードを修正するときに、他の所にバグを仕込んでいないかなど手早く確認できる。