仕事始め(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分くらい?