仕事始め(1)

仕事始め、新年早々テストコードを書いている日(・∀・)


回帰テスト用に自動テストのコードを書いていたんですが、使っているアセンブリの中にちょっと問題になるところがあって。
問題になったのは下記2点。

  • staticな領域にデータをキャッシュしている所がある
  • 例外発生時にその場でcatchしてMessageBoxを表示している所がある(゚Д゚)

staticな領域にデータをキャッシュしている所があるっていうのは、初回のみデータアクセスをして一覧を取得し、その後はメモリー上のデータを返しているところがあって。
ところが今回のテストでやりたいのは、データを丸ごと入れ替えて連続動作させたいということで(´Д`)
メモリ上に値を保持する処理があると、2つ目のデータに入れ替えた後に整合性が取れなくなってしまうという罠。


最初、この動作に気がつかずにはまったりして(・∀・;)


データ毎にテストプロセスを再実行する方法もありますけど、他の関連もあって、とりあえず同じプロセスからデータ毎にAppDomainを作るようにしてみたり。
で、こんな風なコードを書いていたんですけど。

// 新規AppDomain内でHogeを使ってテストするクラス
public class HogeLoader : MarshalByRefObject
{
    public int ErrorCode
    {
        get { return this.errorCode; }
    }
    
    public int Test()
    {
        Hoge hoge = new Hoge();
        ...
    }
}
// 新規AppDomainを作成して、HogeLoader経由でHogeをテストする呼び出し元
AppDomain domain = null;
try
{
    domain = AppDomain.CreateDomain( "HogeLoader" );
    HogeLoader loader = (HogeLoader)domain.CreateInstanceAndUnwrap( "HogeTest", "HogeTest.HogeLoader" );

    loader.Test();

    if ( loader.ErrorCode != 0 )
    {
        SendMail( "エラー発生" );
    }
}
finally
{
    if ( domain != null )
    {
        AppDomain.Unload( domain );
    }
}

このコードで、loader.Test()内の処理に時間*1がかかると、loader.ErrorCodeしたタイミングで「RemotingException オブジェクト <..(動的なアセンブリ名)..> が切断されたか、サーバーに存在しません。」とか言われてしまいました。
タイムアウトですかね(・∀・)?


とりあえず、loader.Test()の戻りで必要な情報は全部返すように変更してみたり(´ω`)

*1:5分くらい?