2012-01-07 6 views
5

私はいくつかの自動テストにWatiNを使用していますが、私が見つけたのは、すべてのテストでIEインスタンスを作成することがスケーラビリティではないということでした。各IEのインスタンスの作成とシャットダウン時間が生きている私を食べていた。アプリケーションが終了する前に、オブジェクトをシングルトンに確実に廃棄する方法を教えてください。

[TestMethod] 
    public void Verify_Some_Useful_Thing() 
    { 
     using (var browser = new IE()) 
     { 
      browser.GoTo("/someurl"); 
      // etc.. 
      // some assert() statements 
     } 
    } 

しかし、usingステートメントは、私はいつも私のIEのインスタンスを閉じることになると呼ばれるその処分()メソッドを持っているであろうことを保証することができるという点で、有用であることを証明しましたIEウィンドウ。

public class BrowserPool 
{  
    private static readonly Lazy<BrowserPool> _instance = new Lazy<BrowserPool>(() => new BrowserPool());   

    private IE _browser; 
    private string _ieHwnd; 
    private int _threadId; 

    public IE Browser 
    { 
     get 
     { 
      var currentThreadId = GetCurrentThreadId(); 
      if (currentThreadId != _threadId) 
      { 
       _browser = IE.AttachTo<IE>(Find.By("hwnd", _ieHwnd)); 
       _threadId = currentThreadId; 
      } 
      return _browser; 
     } 
     set 
     { 
      _browser = value; 
      _ieHwnd = _browser.hWnd.ToString(); 
      _threadId = GetCurrentThreadId(); 
     } 
    } 

    /// <summary> 
    /// private to prevent direct instantiation. 
    /// </summary> 
    private BrowserPool() 
    { 
     Browser = new IE(); 
    } 

    /// <summary> 
    /// Get the current executing thread's id. 
    /// </summary> 
    /// <returns>Thread Id.</returns> 
    private int GetCurrentThreadId() 
    { 
     return Thread.CurrentThread.GetHashCode(); 
    } 

    /// <summary> 
    /// Accessor for instance 
    /// </summary> 
    public static BrowserPool Instance 
    { 
     get 
     { 
      return _instance; 
     } 
    } 
} 

そして今テスト:

とにかく、私はすべての私のテストはすべての私のテストクラス全体に使用し、単一のIEのインスタンスを維持シングルトン作成これがうまく機能

[TestMethod] 
    public void Verify_Some_Useful_Thing() 
    { 
     var browser = BrowserPool.Instance.Browser; 
     browser.GoTo("/someurl"); 
     // some assertions 
    } 

をし、私のテストは非常に速くなったので、私はすべてのテストを開いたり閉じたりしていません。しかし、テストが完了すると、私のIEインスタンスはまだ開いたままになっているという点で、この1つの問題があります。

アプリケーションが終了する前にBrowserPool.Browserにdispose()またはclose()が呼び出されていることを確認するうまい方法を理解できません。私はBrowserPoolクラスでファイナライザを使用しようとしましたが、ファイナライザが呼び出されたときに_browser変数が既に再利用されているため動作していませんでした。

テスト実行後にIEインスタンスでdispose()が呼び出されるようにするにはどうすればよいですか?

+0

シングルトンのデストラクタに処理を入れてみましたか? –

+0

@ M.Babcock、私は持っているし、それは動作しませんでした。ブラウザ変数は、デストラクタが呼び出された時点ですでに再利用されていました。 – KingNestor

答えて

4

[AssemblyCleanupAttribute()]を使用して、アセンブリで検出されたテストが完了した後にリソースをクリーンアップします。

Btwでは、.NETのデストラクタの使用に決して依存しません。

+0

実行中のVS> Professionalを想定してください。 – mxmissile

関連する問題