3

そのため、いくつかのJUnitクラスがあり、それぞれにテスト メソッドのリストが含まれています。それぞれの方法は互いに独立しており、直接的なつながりはありません。しかし、間接的なつながりがあります。すべてのメソッドが 1 つのシングルトン オブジェクトを処理します (それはSelenium Web Driverインスタンスです。はい、Web Driverすべてのテストで 1 つのインスタンスを使用します。新しいオブジェクト インスタンスを作成するために、非常に多くの時間を費やすからです!)。

そして、テストメソッドが1つのスレッドで段階的に実行される場合、すべて問題ありません。でも長すぎるし、

それで、速度を上げることにしました。- すべてのテスト メソッドを並列モードで実行することにしました。このために、並列テスト実行用の特別な構成で maven を使用します。

しかし、これは新しい問題の原因だと思います。その結果、メソッドが並列実行されますが、それでも単一のWeb ドライバー インスタンスでしか動作しません。

私は最適な解決策を見つけようとしています:

テストが並列モードで実行されることを望みます - それは本当に速いです。

テストごとに新しいオブジェクトが作成されることは望ましくありません。これは非常に長いプロセスです。

どのようなアドバイスをいただけますか?

この問題をどのように解決したでしょうか。

4

4 に答える 4

3

残念ながら、webDriverはスレッドセーフではありません。イムホ、ベストプラクティスは、個別のスレッドで個別のwebDriverインスタンスを使用して各テストクラスを実行することです。最適なスレッド数は int threadNum = Runtime.getRuntime().availableProcessors() * 2;、プロジェクトの実行時間を30分から4分に短縮したものです。Thucydidesフレームワークでもまったく同じ方法が使用されています。

于 2012-12-28T09:40:43.147 に答える
3

これに代わるものはありません。テストが並行して実行されている場合、単一のインスタンスを使用することはできません。テスト ケースごとWebDriverに 1 つのインスタンスをインスタンス化する必要があります。WebDriver

テストを連続して実行することで高速化する方法の 1 つは、WebDriverオブジェクトを再利用するWebDriverことです。別の一般的な最適化は、プロファイルの作成も遅いため、使用されているFirefoxProfile場合は を再利用することです。FirefoxDriver

オブジェクトを再利用することを選択した場合はWebDriver、 で可能な限りインスタンスをクリーンアップするようにしてくださいtearDown。たとえば、Cookie をクリアすると、次のようになります。

driver.manage().deleteAllCookies();
于 2012-12-27T16:17:10.193 に答える
0

実際のパフォーマンスのボトルネックがテストのどこにあるかに応じて、synchronizedドライバーの周りにラッパーを追加して、1 つしか持たないが、それへのすべてのアクセスがシリアル化されるようにするなど、ひどいことを行うことができます。

ThreadLocalスレッドごとに 1 つのドライバーを持つように、ドライバーへの参照を持つようにテストを変更する可能性があります。

于 2012-12-27T16:18:21.400 に答える