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 件のコメント:
コメントを投稿