2013-08-29 12 views
1

我正在用webdriver編寫一些功能測試並使用JUnit執行它們。我正在嘗試使用TestWatcher類,因此每次發生事件時都可以執行特定的操作。我重寫完成和失敗的方法,但似乎是這些被幾乎同時觸發,所以在失敗的方法可以做到這一點之前,驅動程序已經被完成方法處理了。junit TestWatcher失敗並已完成方法開火時間

的TestWatcher是以下幾點:

public class TestRules extends TestWatcher { 

private static WebDriver driver; 
private static final Logger Log = LogManager.getLogger(TestRules.class); 

public TestRules() { 
    if (driver == null) 
     try { 
      driver = TestHelpers.getWebDriver(); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
} 

@Override 
protected void starting(Description description){ 
    Log.info(String.format("Started test: %s::%s", description.getClassName(), description.getMethodName())); 
    try { 
     new LoginTest().testDoLogin(); 
    } catch (Exception e) { 
     Log.error(e); 
    } 
} 

@Override 
protected void failed(Throwable e, Description description) { 
    File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); 

    String path = String.format("C:\\localdev\\screenshot\\%d__%s_%s.png", 
      Calendar.getInstance().getTimeInMillis(), description.getClassName(), description.getMethodName()); 
    try { 
     FileUtils.copyFile(scrFile, new File(path)); 
    } catch (IOException ioe) { 
     Log.error(ioe); 
    } 
    Log.error(String.format("Error: %s\nScreenshot: %s", e.getMessage(), path)); 
} 

@Override 
protected void finished(Description description) { 
    Log.info(String.format("Finished test: %s::%s", description.getClassName(), description.getMethodName())); 
    try { 
     // This actually calling driver.quit() <- (driver == WebDriver) 
     TestHelpers.close(); 
    } catch (Exception e) { 
     Log.error(e); 
    } 
} 

} 

測試可能是這樣的:

public class testSomething { 
private static final Logger Log = LogManager.getLogger(testSomething.class); 

@Rule 
public TestRules testRules = new TestRules(); 

@Test 
public void filterTableByNameWildcard() throws Exception { 
    Log.info("Starting the test filterTable"); 

    MainView mainView = getMainView(); 
    String searchString = "A*"; 
    mainView.setFilterParametersAndDoFilter(searchString, "", true, true); 
    mainView.validateWildCardSearchReturnsCorrectData(searchString); 
    // Random failing point for testing 
    Assert.assertTrue(false); 

當我運行我的測試,我得到一個以下錯誤:

java.lang.AssertionError: 
Expected :true 
Actual :false 
<Click to see difference> 
    at org.junit.Assert.fail(Assert.java:88) 
    at org.junit.Assert.failNotEquals(Assert.java:789) 
    at org.junit.Assert.assertEquals(Assert.java:118) 
    at org.junit.Assert.assertEquals(Assert.java:144) 
    at xxx.Tests.xxx.testSomething.filterSomething(TestSomething.java:34) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55) 
    at org.junit.rules.RunRules.evaluate(RunRules.java:20) 
.... skipped 


org.openqa.selenium.remote.SessionNotFoundException: The FirefoxDriver cannot be used after quit() was called. 
Build info: version: '2.33.0', revision: '4e90c97', time: '2013-05-22 15:33:32' 
System info: os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.7.0_21' 
Driver info: driver.version: FirefoxDriver 
    at org.openqa.selenium.firefox.FirefoxDriver$LazyCommandExecutor.execute(FirefoxDriver.java:352) 
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:527) 
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:569) 
    at org.openqa.selenium.firefox.FirefoxDriver.getScreenshotAs(FirefoxDriver.java:316) 
    at xxx.TestHelpers.TestRules.failed(TestRules.java:47) 
    at org.junit.rules.TestWatcher.failedQuietly(TestWatcher.java:84) 
    at org.junit.rules.TestWatcher.access$300(TestWatcher.java:46) 
    at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:62) 
    at org.junit.rules.RunRules.evaluate(RunRules.java:20) 

任何想法如何獲得通過它?

編輯: 從文檔:

保護無效成品(描述描述) 時調用的測試方法完成(是否通過或失敗的)

保護無效失敗(Throwable的E,說明描述) 調用當測試失敗時

這將是有道理的,首先調用「失敗」,然後調用「完成」,但似乎是另一種方式。

回答

3

你的問題是一個共享資源,不是在每次執行時新鮮創建。我創建了一個小例子來展示這一點。看看my comment to your comment

+0

很酷,謝謝。我通過使TestHelpers中的方法(TestHelpers.close())非靜態來解決問題。 –