2016-08-01 63 views
0

我有一個代碼與許多類。
有它創建驅動程序類 -Java Selenium關閉瀏覽器後assertTrue

public class DriverDelegate { 

    private String baseURL = "someLink"; 
    private WebDriver driver; 
    private WebDriverWait wait; 

    DriverDelegate(String url) { 
     System.setProperty("webdriver.chrome.driver", "${directory}"); 
     driver = new ChromeDriver(); 
     driver.get(baseURL + url); 
     driver.manage().window().maximize(); 
     driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 
     wait = new WebDriverWait(driver, 5); 
    } 

    public WebDriver getDriver() { 
     return driver; 
    } 

我爲每個測試創建新的驅動程序。而且我的大部分線路都包含assertTrue喜歡這個 -

public class UserInterfaceTests extends BaseTest{ 


    @Test 
    public void headerClicker() throws java.lang.Exception { 

     //Startup 
     DriverDelegate driverDelegate = new DriverDelegate("url"); 
     WebDriver driver = driverDelegate.getDriver(); 

     //Some random assertTrue 
     assertTrue("Test(HeaderClicker) - NoSuchElementException click", TestHelper.headerClicker(schedule, driver)); 

     //I hope that it is not neccessary to put up all helper classes like TestHelper or BaseTest 

現在,我從一個類調用啓動時啓動我的測試者 -

public class Startup{ 
    @Test 
    public void HeaderClicker() throws Exception{ UserInterfaceTests UI = new UserInterfaceTests(); UI.headerClicker();} 

我在這裏的問題是如何就給assertTrue後關閉瀏覽器失敗。像@AfterTest,@AfterSuite等東西無法正常工作,因爲其他方法不能使用與測試中使用的驅動程序相同的驅動程序。
任何想法?

+0

你使用什麼測試框架? TestNG的?在'@test'中使用'@test'是非常糟糕的做法。 –

+0

目前我正在使用testNG。如果你說這是不好的做法,那麼我應該用什麼來代替它,爲什麼它不好? – Syord

+0

如果你想要有清晰和漂亮的代碼,那麼你應該使用xml配置文件testNG,也是https://github.com/SeleniumHQ/selenium/wiki/LoadableComponent 是個好主意。然後閱讀有關設計模式的內容。 '@Test'應該儘可能短。 –

回答

0

好吧有幾件事我想在這裏觸及。首先,@shutdown -h現在在他們的評論中是正確的,您不應該以編程方式自己創建測試類並運行他們的@Test方法。讓測試運行框架處理(例如TestNG,JUnit等)。

但是,您的實際問題的要點是,您需要預測試和測試後方法來處理在實際測試方法之前和/或之後發生的行爲。但是,爲了這些工作,您需要讓測試框架處理測試的運行。您提到@AfterTest@AfterSuite對您的用例不正確,但不是您指定(完全)指定的原因。 TestNG中的@AfterTest僅在套件中指定的<test>節點內的所有類中的所有測試方法之後執行一次。 @AfterSuite僅在整個套件中的所有測試方法之後執行一次。您正在尋找的是@AfterMethod註釋。

實施例:

public class FooTest { 

    private DriverDelegate driver; 

    @BeforeMethod 
    public void setup() { 
     try { 
      driver = new DriverDelegate("url"); 
     } catch (Exception ignore) { } 
    } 

    @AfterMethod 
    public void tearDown() { 
     try { 
      driver.quit(); 
     } catch (Exception ignore) { } 
     driver = null; 
    } 

    @Test 
    public void foo() { 
     // do test stuff 
    } 
} 

在上面的代碼中,當TestNG的運行此測試類,在這種類@Test註釋每個方法將具有對應的@BeforeMethod執行初始化的驅動器和@AfterMethod封閉駕駛員即使測試失敗。 TestNG使用這種設置的幾點要點:

(1)TestNG不會創建單獨的測試類實例,所以如果您在類對象上保存狀態,那麼您不能自己並行運行測試方法一個類,因爲你會有多個方法試圖創建新的驅動程序並將它們保存到同一個變量中,從而破壞了正在運行的其他測試的狀態。你可以使用以每個類的並行模式運行(例如,有5個線程,每個線程同時運行一個單獨的測試類)。 (2)爲什麼我將@BeforeMethod@AfterMethod正文包裝在try-catch塊中?由於TestNG在配置方法異常上快速失敗,並可能導致尚未運行的其他測試被跳過,因此您需要處理任何可能失敗的代碼。通過包裝創建和關閉Web驅動程序,您可以忽略錯誤並繼續運行其他測試。例如,如果驅動程序未能創建,則driver變量將爲空,並且@Test方法將失敗,但其他方法可能會成功。理想情況下,您應該有一些異常日誌記錄,以便您可以調查爲什麼驅動程序未能創建,例如。另外,如果您需要在很多測試類中使用驅動程序,您可以創建一個基類,並在每個方法結束後創建驅動程序並將其關閉,並讓測試類擴展該驅動程序。如果你有一個帶有註解爲@Test的方法的類,它將在該測試類和所有超類上運行任何@BeforeMethod方法。保證類之間方法的排序(如果在同一個類中有多個@BeforeMethod方法,則不會)。

public abstract class A { 
    @BeforeMethod 
    public void setupA() { } 
} 

public class B extends A { 
    @BeforeMethod 
    public void setupB() { } 

    @Test 
    public void foo() { } 
} 

在上文中,當運行foo,它將已運行第一setupA然後setupB。方法以相同的方式工作後,但以相反的順序。