JUnit と Selenium2 を使用してアプリケーションをテストしています。Jenkinsで実行されているsurefireプラグインでMavenを使用してテストを実行します。数週間うまくいったテストで、さらに多くのテストを追加したところ、テストは次のメッセージで失敗しました。
Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.11:test (default-test) on project guitest: Failure or timeout
...
Process leaked file descriptors
たとえば、WebDriver (およびそれらをコピーするための apache commons IO) を使用してスクリーンショットを撮るときなど、コードでファイルを開いたままにしておくだけだと最初に考えました。
File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
File destFile = new File(...);
FileUtils.copyFile(scrFile, destFile);
ただし、スクリーンショットの記録を削除しても問題は解決しません。
ここで何が問題なのか、および/またはこの問題に取り組む方法についての指針はありますか?
編集:
WebDrivers / browser インスタンスを再利用するために、WebdriverPool を実装しました。テストが終了したら、シャットダウン フックを使用して、開いているすべてのインスタンスを閉じます。
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run(){
for (WebDriver driver : drivers.values())
driver.close();
if (!driversInUse.isEmpty())
throw new IllegalStateException("There are still drivers in use (" + driversInUse.size() + ")");
}
});
これが問題ではないでしょうか?