‘VB’ タグのついている投稿
VB.NET + NUnit 2.5 の Assert.Throws で例外のテスト
[ブログ紹介] NUnit 2.5 で追加された Assert.Throws: TDD.NET
を参考に VB.NET の書き方にしただけですが。
Imports NUnit.Framework
Public Class ExceptionTest
Private Shared Function throwArgumentException(ByVal obj As Object) As String
Throw New ArgumentException("VarType Error: " & TypeName(obj))
End Function
Public Sub ArgumentExceptionTest(ByVal obj As Object, ByVal expected As String)
Dim ex = Assert.Throws(Of ArgumentException)(
Function() throwArgumentException(obj)
)
Assert.That(ex.Message = expected)
End Sub
End Class
サンプルコードは実際のコードを編集して書きましたが動作確認してないので参考程度に。
.NET のサンプルってC#の場合が多いので「VB.NETではどう書けばいいのかなぁ」ってことも結構あります。
VS2010+NUnit2.5.10でテストメソッドをデバッグ
VB.NET+NUnitで開発をしていますが、テストをしてもメソッドの戻り値しか確認できず不便だったので、テストメソッドもデバッグできるようにしました。
1.
ソリューションのプロパティからスタートアッププロジェクトをテストプロジェクトに変更。
マルチスタートアップでも可。
2.
テストプロジェクトのプロパティを開いてデバッグの開始動作を[外部プログラムの開始]に変更。
ファイル選択からnunit.exeを指定。
3.
開始オプションのコマンドライン引数にテストプロジェクトのdllを指定。
これでできるはずだったのですが、起動はしてもブレークポイントに反応してくれません。
調べてみると、
[VS2010][NAgile] VisualStudio2010 Express + NUnit でDebug実行ができない場合
こちらのページを発見しました。
どうやら.NET Framework 4.0だとデバッグ実行ができないみたいです。
なので上のページを参考にさせていただいて、nunit.exe.configを編集。
4.
nunit.exe.configのconfiguration内に下の3行を追加。
上書きして実行してみると、ちゃんとブレークポイントに反応するようになりました!
VB.NETのMy.Application.Logを使う
My.Application.Logを使用してトレースする、ログに書き込む
で詳しく説明されているのでメモ程度で。
まず、My.Application.Logを使うためにアプリケーション構成ファイルであるapp.configを編集します。(ない場合は[プロジェクト] > [新しい項目の追加]からアプリケーション構成ファイルを選択)
app.configがプロジェクトに追加された時点でMy.Application.Logに関する記述があるので楽です。
しかし、このまま何も触らずにプログラム内で
My.Application.Log.WriteEntry("コントロールの初期化")
'Try~Catch内などで
My.Application.Log.WriteException(New Exception("エラー!"))
とするだけでも
DefaultSource Information 0 コントロールの初期化
DefaultSource Error 2 エラー!
と出力され使うことができます。
ちなみに出力先のデフォルトは
ユーザーのApplication Dataフォルダ\CompanyName\ProductName\ProductVersion\ProductName.log
ですが、Vista以降はフォルダ構成が変わっているので
ユーザーのAppData\Roaming\CompanyName\ProductName\ProductVersion\ProductName.log
になっています。
VB2010でNUnit2.5を利用する
初めまして、miyazakiです。今年からこちらでお世話になることになりました。よろしくお願いします!
初めての投稿なのでものすごく緊張していますが、さっそく本題に入っていきたいと思います。
VB.NETの環境でNUnitを使うことになったので入れてみました。
参考ページ
NUnit 2.5 の導入 Step by Step
VB2010 Express + NUnit 2.5 で、 初めてのTDD Step by Step
参考にしたページと同じ環境だったのと、とても詳しく分かりやすく書かれていたので、インストールから動かしてみるまでサクサク進めました。
なのでこちらではメモ程度に書いていきたいと思います。
まずはインストール。
NUnitのページのDOWNLOADから”NUnit-2.5.10.11092.msi”をクリックしインストール。
インストールすると中にサンプルが入っているので、とりあえずそちらを動かしてみることにします。
ソリューションを開くと、このプログラム古いから今の環境で動くようにしろ、と言われるので指示に従ってコンバート。
コンバートして開けたところでビルドするんですが、元が古いということでプロジェクトで参照されているnunit.frameworkも古いです。新しいほうを参照させる必要があります。
NUnitをインストールしたドライブ\NUnit 2.5.10\net-2.0\framework内にnunit.framework.dllがあるので、プロジェクトごとに設定しなおしていきます。
これでビルドが通りました。
ビルドに成功したところでNUnitを起動。このままだとVisual Studioのファイルが開けないので、
[Tools] > [Settings…]から[IDE Support]を選択し[Enable Visual Studio Support]という項目にチェックを入れておきます。
これでNUnit側でサンプルを開くことができます。
読み込み時にdllファイルが見つからないエラーが出る場合は、
[Project] > [Configurations] > [2 Release]
を選択します。
あとはRunを押すとテストされるかと思います。こんな感じで。
赤い部分がテスト失敗。緑の部分が成功しているということを表しています。
では、実際にプロジェクトを作ってやっていきたいと思います。こちらも参考ページにバッチリ書いてあるので大まかな部分とテストの記述部分のみ触れていきます。
構成としてはメインプログラムとテスト用とプロジェクトを分けて作成します。
テスト用プロジェクトに関してはクラスライブラリで作成し、NUnitから呼び出して使うためにdllとして作ります。
参照設定は先ほども出たnunit.frameworkと、メインプロジェクトを設定しておきます。
テストケース部分
Imports FizzBuzz
Imports NUnit.Framework
Public Class FizzBuzzerTest
'Fizz Buzz - 数字を数え、3の倍数でFizz、5の倍数でBuzz、3と5の倍数でFizzBuzz
Public Sub SayNextTest_1回目は1_1()
Dim obj As FizzBuzzer = New FizzBuzzer()
Dim result As String = obj.SayNext()
Assert.AreEqual("1 - 1", result) 'Assert.AreEqual(期待値, 検査したい値)
End Sub
End Class
NUnitはTestFixture()を見て「このクラスにテストケースがある」ということ、Test()で「このメソッドがテストケース」であることを判断します。
Assert.AreEqual()ですが、このプログラムはFizz Buzzをしているので、この場合1回目の期待値は”1-1″、検査する値はSayNext()(数字、Fizz、Buzzのいずれかを返す)で返ってくる値になります。
また、テストケースを増やすうえで、同じような処理がある場合はまとめて書くことができます。
Public Class FizzBuzzerTest
'同じような処理をするテストはTestCaseを使うことでまとめて書ける
'1のとき
'2のとき
'3のとき
Public Sub SayNextTest(ByVal count As Integer, ByVal expected As String)
Dim obj As FizzBuzzer = New FizzBuzzer()
Dim result As String = Nothing
For i As Integer = 1 To count
result = obj.SayNext()
Next
Assert.AreEqual(expected, result) 'Assert.AreEqual(期待値, 検査したい値)
End Sub
End Class
と、こんな感じでテストケースを書いては実装を繰り返し、無事すべてのケースをグリーンにさせることができました!
VB.NETのMy.Application.Logをラッピングしたクラス作ってみた
現在進めているプロジェクトでのロギングにはmiyazakiさんに調べてもらったMy.Application.Logを使うことにしました。
が、そのままだとちょいと辛かったのでラッピングしてクラスを作ってみました。
Public Class Log
Public Shared Sub Write(
ByVal message As String,
ByVal traceEventType As String,
Optional ByVal isShowMsgBox As Boolean = False
)
Dim severity As System.Diagnostics.TraceEventType =
System.Enum.Parse(GetType(System.Diagnostics.TraceEventType), traceEventType)
My.Application.Log.WriteEntry(My.Computer.Clock.LocalTime.ToString & "> " & message, severity)
My.Application.Log.TraceSource.Flush()
'下記表示判定は何パターンか試した結果ですが正しいかの確認は出来ていません。
If My.Application.Log.TraceSource.Switch.Level > severity Then
showMsgBox(message, severity, traceEventType, isShowMsgBox)
End If
End Sub
Private Shared Sub showMsgBox(
ByVal message As String,
ByVal severity As System.Diagnostics.TraceEventType,
ByVal title As String,
Optional ByVal isShowMsgBox As Boolean = False
)
If isShowMsgBox Then
Dim msgBoxButtons As MsgBoxStyle
Select Case severity
Case Diagnostics.TraceEventType.Critical, Diagnostics.TraceEventType.Error
msgBoxButtons = MsgBoxStyle.Critical
Case Diagnostics.TraceEventType.Warning
msgBoxButtons = MsgBoxStyle.Exclamation
Case Else
msgBoxButtons = MsgBoxStyle.Information
End Select
MsgBox(message, msgBoxButtons, title)
End If
End Sub
Public Shared Sub Verbose(
ByVal message As String,
Optional ByVal isShowMsgBox As Boolean = False
)
Log.Write(message, "Verbose", isShowMsgBox)
End Sub
Public Shared Sub Info(
ByVal message As String,
Optional ByVal isShowMsgBox As Boolean = False
)
Log.Write(message, "Information", isShowMsgBox)
End Sub
Public Shared Sub Warn(
ByVal message As String,
Optional ByVal isShowMsgBox As Boolean = False
)
Log.Write(message, "Warning", isShowMsgBox)
End Sub
Public Shared Sub Err(
ByVal message As String,
Optional ByVal isShowMsgBox As Boolean = False
)
Log.Write(message, "Error", isShowMsgBox)
End Sub
Public Shared Sub Exception(
ByVal ex As Exception,
ByVal message As String,
Optional ByVal isShowMsgBox As Boolean = False
)
message &= System.Environment.NewLine &
" [例外内容] " & ex.Message & System.Environment.NewLine &
" [スタックトレース] " & System.Environment.NewLine & ex.StackTrace
Log.Err(message, isShowMsgBox)
End Sub
End Class
Verboseがlog4netのDebugにあたる感じで使えると思います。
メッセージボックスを表示したりも出来ます。
My.Application.Log.には例外用のメソッドWriteExceptionがあるのですが出力される情報がイマイチだったので使わないで実装しました。
まだあまり使ってないのでバグってたりするかもしれません。
コードを修正したらここも修正するということで。