2011-07-03 13 views
16

Selenium-webdriverでwebdriverインスタンスを作成するベストプラクティスは何ですか?テストメソッドごと、テストクラスごと、またはテスト実行ごとに1回テストメソッドごとに新しいWebDriverインスタンス?

スピンアップにはかなりコストがかかるようですが、テスト間でオープンにしておけば、テストメソッド間で情報が漏れる危険があります。

代わりに、単一のWebdriverインスタンス、単一のブラウザウィンドウ(ポップアップを除く)、または特定のドライバインスタンスから新しいウィンドウ/セッションを開始する方法がありますか?

おかげ マット

答えて

12

私は、テストメソッド間でブラウザインスタンスを再利用することは、実際のブラウザを使用する場合、時間を大幅に節約していることがわかりました。 Firefox。 HtmlUnitDriverを使用してテストを実行する場合、ほとんど利点はありません。

不確定テストの危険性に関しては、完全に確定的なテストと時間との間にトレードオフがあります。統合テストには、しばしばこれらのトレードオフが含まれます。完全に確定的な統合テストが必要な場合は、テスト実行の間にデータベース/サーバー状態をクリアすることについても心配する必要があります。

ブラウザインスタンスを再利用する場合は、実行の間にCookieをクリア/保存することをお勧めします。

driver.manage().deleteAllCookies(); 

これはtearDown()メソッドで行います。また、アプリケーションがクライアント側にデータを格納する場合は、それをクリアする必要があります(おそらく、JavascriptExecutor経由で)。テスト中のアプリケーションには、これを実行した後に完全に無関係な要求のように見えるはずです。これは、非決定的な動作のリスクを本当に最小限に抑えます。

5

自動化された統合テストのあなたの目標は、再現性のテストを持っているのであれば、その後、私はすべてのテスト実行のための新しいwebdriverをインスタンスをお勧めします。

各テストは、他のテストまたは副作用とは独立して独立している必要があります。

個人的には、再現しにくいバグよりも不満を感じるのは、信頼できない非確定的なテストです。

(これは、より重要なあなたはCRUD操作のように、永続的なアプリケーションの状態を変更することができますテストを見て、特にテストデータ自体を、管理するためになります。)

はい、追加のテスト実行時間が、コストがかかるが、それをあなたのテストをデバッグするのに時間を費やすほうが良いでしょう。

このペナルティを相殺するのに役立つ解決策は、継続的ビルドから継続的統合へのアプローチを超えて、テストをビルドプロセスに直接転用することです。

また、統合テストの範囲を制限しようとします。あなたが実行時間を食べる、重い統合テストがたくさんある場合は、リファクタリングを試してみてください。代わりに、基本的なサービスコール(ビジネスロジックがある場合)の軽量単体テストのカバレッジを増やしてください。

+1

各テストの間に新しいドライバを起動するのにかかる時間が本当に嫌いです。しかし、代替案は悪化しています。共有ドライバがきれいに動作するように本当に努力しましたが、テストの間に奇妙なやりとりをデバッグするのに非常に時間を費やしていました。 –

関連する問題