‘.NET’ カテゴリーのアーカイブ

IronPythonとジェネリックと初期値わたし

C#勉強会に行って自己紹介で「MVVMパターン用のフレームワーク使ってViewとViewModelはC#、ModelはIronPythonで書います」と言ったら微妙な空気になりました、夏。

muraveです。

というわけでC#とIronPythonを組み合わせて書いてます。基本的に配列や辞書は便利なのでPythonのモノ使ってましたがパフォーマンス・チューニングやっててジェネリック使ったほうがいいところもあるかな、と。

IronPython側でのジェネリックの書き方は知っててたまに使ってたんですが(C#での<>が[]になります)、試したら普通に初期値も与えられるのにちょっと感激。

C#で書くとList<string>の場合

>>> import site
>>> import clr
>>> from System.Collections import Generic as DotNetCollectionsG

>>> dot_l = DotNetCollectionsG.List[str]()
>>> print dot_l
List[str]()

>>> dot_l = DotNetCollectionsG.List[str](['a', 'b'])
>>> print dot_l
List[str](['a', 'b'])

C#で書くとDictionary<string, int>の場合

>>> import site
>>> import clr
>>> from System.Collections import Generic as DotNetCollectionsG

>>> dot_dict = DotNetCollectionsG.Dictionary[str,int]()
>>> print dot_dict
Dictionary[str, int]()

>>> dot_dict = DotNetCollectionsG.Dictionary[str,int]({'a':1 ,'b':1})
>>> print dot_dict
Dictionary[str, int]({'b' : 1, 'a' : 1})

ね♪

helpみたら普通に書いてありました。

>>> help(dot_dict)
Help on Dictionary[str, int] object:

class Dictionary[str, int](object)
 |  Dictionary[str, int]()
 |  Dictionary[str, int](capacity: int)
 |  Dictionary[str, int](comparer: IEqualityComparer[str])
 |  Dictionary[str, int](capacity: int, comparer: IEqualityComparer[str])
 |  Dictionary[str, int](dictionary: IDictionary[str, int])
 |  Dictionary[str, int](dictionary: IDictionary[str, int], comparer: IEqualityComparer[str])
 |
以下略

えらいなぁ。

Facebooktwittergoogle_pluslinkedintumblrmail

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ではどう書けばいいのかなぁ」ってことも結構あります。

Facebooktwittergoogle_pluslinkedintumblrmail

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行を追加。


    

上書きして実行してみると、ちゃんとブレークポイントに反応するようになりました!

Facebooktwittergoogle_pluslinkedintumblrmail

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があるのですが出力される情報がイマイチだったので使わないで実装しました。

まだあまり使ってないのでバグってたりするかもしれません。
コードを修正したらここも修正するということで。

Facebooktwittergoogle_pluslinkedintumblrmail

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("エラー!"))

とするだけでも

DefaultSourceInformation0コントロールの初期化
DefaultSourceError2エラー!

と出力され使うことができます。

ちなみに出力先のデフォルトは
ユーザーのApplication Dataフォルダ\CompanyName\ProductName\ProductVersion\ProductName.log
ですが、Vista以降はフォルダ構成が変わっているので
ユーザーのAppData\Roaming\CompanyName\ProductName\ProductVersion\ProductName.log
になっています。

Facebooktwittergoogle_pluslinkedintumblrmail

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

と、こんな感じでテストケースを書いては実装を繰り返し、無事すべてのケースをグリーンにさせることができました!

 

Facebooktwittergoogle_pluslinkedintumblrmail