2010年12月15日

NunitテストをAzure上で実行

NunitテストのデータベースがSQL Azureの場合非常に時間がかかります。おそらくテストプログラムはローカルPCで実行、SQL Azureはインターネット経由で接続するため。

やはりSQL AzureのテストはWindows Azure上で実行すべきですが。ネット上で検索しても、Azure上でNunitテスト実行に関する情報が少なく、NunitLiteで使う方法が載ってるぐらい。でもこの方法はいろいろ設定が必要みたい。

幸い今回のテストコードTest、Setup、TearDown属性しか使ってないので、TestFixtureクラスを解析して、テストコードを実行するプログラムを作って、Azure Roleから実行するようにしました。

 

まず必要のメソッド情報が抽出

List<MethodInfo> setupMethods = new List<MethodInfo>();
List<MethodInfo> teardownMethods = new List<MethodInfo>();
List<MethodInfo> testMethods = new List<MethodInfo>();

foreach (var method in fixtureType.GetMethods())
{
  //Setupメソッド抽出

    if (method.GetCustomAttributes(typeof(SetUpAttribute), false).Length > 0)
    {
        setupMethods.Add(method);
    }
  //TearDownメソッド抽出

    if (method.GetCustomAttributes(typeof(TearDownAttribute), false).Length > 0)
    {
        teardownMethods.Add(method);
    }

  //Testメソッド抽出
    if (method.GetCustomAttributes(typeof(TestAttribute), false).Length > 0)
    {
        if (method.GetParameters().Length <= 0)  testMethods.Add(method);
    }
}

続いてこれらのメソッドを実行する

foreach (var testMethod in testMethods)
{
    //インスタンス作成
    object obj = Activator.CreateInstance(fixtureType);

    //Setup実行
    foreach(var methodin setupMethods) method.Invoke(obj, null);

    try
    {
        //テスト実行
        testMethod.Invoke(obj, null);
    }
    catch (TargetInvocationException te)
    {
        Exception e = te.InnerException;
        if (e is AssertionException)
        {
            //Assert失敗
            break;
        }
        else if (e is SuccessException)
        {
            //成功
            break;
        }
        else
        {
            //その他エラー
            break;
        }
    }

    //TearDown実行
    foreach(var methodin teardownMethods) method.Invoke(obj, null);

}

最後はAzureのRoleからこのプログラムを実行して、成功/Assert失敗のテストケースを記録すればOK。

0 件のコメント:

コメントを投稿