2012-02-24 2 views
0

私の目標は、1台のマシンで複数のテストを並行して実行することです。そのために、FirefoxとMbunitでSelenium WebDriverを使用しています。残念ながら、Seleniumのドライバ作成はスレッドセーフではないようですが、コードのこの部分をグローバルロックでラップする必要があります。これは世界の終わりではありませんが、私の質問は、これが私がする必要があることか、あるいは同期が必要な他の部分があるかどうかです。もう一つの選択肢は、AppDomainまたはプロセス分離をMBUnitで行うことですが、これが実装されているかどうかはわかりません。1台のマシンでSelenium WebDriverとの同時テストを実行するにはどうすればよいですか?

[TestFixture] 
[Parallelizable] 
public class Class1 
{ 

    public static object padlock = new object(); 

    [Test] 
    [Parallelizable] 
    public void Test1() 
    { 
     var driver = CreateDriver(); 
     driver.Navigate().GoToUrl("http://www.mozilla.org"); 
     driver.FindElementByCssSelector("a[href='/projects/']").Click(); 
     Thread.Sleep(TimeSpan.FromSeconds(5)); 
     driver.Quit(); 
    } 

    [Test] 
    [Parallelizable] 
    public void Test3() 
    { 
     var driver = CreateDriver(); 
     driver.Navigate().GoToUrl("http://www.mozilla.org"); 
     driver.FindElementByCssSelector("a[href='/contribute/']").Click(); 
     Thread.Sleep(TimeSpan.FromSeconds(5)); 
     driver.Quit(); 
    } 

    **private FirefoxDriver CreateDriver() 
    { 
     lock(padlock) 
     { 
      return new FirefoxDriver(); 
     } 
    }** 
} 

答えて

-1

私はMBunitがどのように機能するのかわかりませんが、コクレンと並列性に違いがあります。 私の意見では、セレンテストは、並列処理の実行の概念にうまく統合できるということです。とにかく、分かりにくいことがあります。 どうすればいいですか。 1. RunnableまたはThreadクラスを実装するクラスを作成します。このクラスは次のようなテストを開始します:

class MyClass implements Runnable 
{ 
    private Thread t; 
    public MyClass() 
    { 
     t=new Thread (this); 
     t.start(); 
    } 

    @Override 
    public void run() { 
     WebDriver w = new FirefoxDriver(); 
     // begin your test 
    } 

} 

メインクラスでは、MyClassのインスタンスを複数作成します。彼らのそれぞれは、それ自身のスレッドにテストを開始します。 ここでは、Threadクラスのドキュメントへのリンクです:http://docs.oracle.com/javase/1.3/docs/api/java/lang/Thread.html

+0

私自身でこれを行うことができましたが、私は自分のCIと簡単に統合できるフレームワークを利用したいと考えています –

1

私は並列にMbUnitのとSeleniumを使用してきた、と私はMbUnitのは完全にスレッドセーフで、あなたは正しくwebdriverををインスタンス化したら、完璧に動作を保証することができます。あなたはロックだけでいいはずです。

あなたのコード例を使用すると、テストが正しく失敗しないことを指摘したいと思います。アサーションに失敗した場合や例外がスローされた場合、コードのQuit()セクションには到達しません。このため、通常はブラウザの起動/停止にSetup/Teardownの方法が使用されます。

FYIでは、引き続きsetup/teardownメソッドを並列で使用することができます。ドライバを保存/参照する方法が必要です。 TestStep名で参照されるIDictionaryを使用できます。

+0

これはスレッドの問題を示す簡単なサンプルであり、とにかく、私がやっていることが完全に狂っているのではないことを知らせてくれてありがとう:) –

関連する問題