2012-01-24 34 views
3

我有一個以下的硒測試套件從同一個基類繼承,當我運行整個測試套件時,如何讓測試使用相同的Web驅動程序實例?我也想單獨運行每個測試。我相信這將大大減少運行套件所需的時間。在整個硒套件中使用相同的網絡驅動程序

這個測試是從maven運行,然後運行每個測試類。

@RunWith(Suite.class) 
@SuiteClasses({ 
    AdminPortalTestSuite.class, 
    DevPortalTestSuite.class, 
    CommonTestSuite.class 
}) 
public class SeleniumTestSuite { 

} 

基類的所有測試從

@BeforeClass 
public static void setUp() throws Exception { 

    if (null == baseUrl || !baseUrl.startsWith("https://")) { 
     baseUrl = "https://localhost:8443"; 
    } 

    if (null == browser || browser.startsWith("${")) { 
     browser = "firefox"; 
    } 
    //retrieve properties including locale. 
    retrieveProperties(); 
    Thread.sleep(4000); 
    setUpDriver(); 
} 

@After 
public void tearDownAfterTest() { 
    openUrl(LIST_PARTNERS); 
    adminPortalLogout(); 
    openUrl(DASHBOARD); 
    developerPortalLogout(); 
    driver.manage().deleteAllCookies(); 
} 

@AfterClass 
public static void tearDown() throws Exception { 
    BaseFunctionalTestCase.driver.quit(); 
} 

測試例如

public class APApplicationFunctionalTestCase extends BaseFunctionalTestCase { 

/** 
* Test validation when creating a new application. 
*/ 
@Test 
public void testApplicationValidation() { 
    Assume.assumeTrue(preHtml5); 

    final String partnerName = randomize("partner"); 
    //create partner 
    createPartnerThroughAP(partnerName); 

    adminPortalLogin(); 
    openUrl(ADD_APPLICATION + partnerName); 
    waitForId("applicationView.applicationName"); 
    findById("submit-button").click(); 
    waitForId("submit-button"); 

    //check validation 
    assertTrue("Failed to validate application name", 
     isTextPresent(resolveAPMessage("partner", "application.messages", 
      "NotEmpty.applicationEditView.applicationView.applicationName"))); 

    assertTrue("Failed to validate application username", 
     isTextPresent(resolveAPMessage("partner", "application.messages", 
      "NotEmpty.applicationEditView.applicationView.applicationUserName"))); 

    assertTrue("Failed to validate application password", 
     isTextPresent(resolveAPMessage("partner", "application.messages", 
      "Password.applicationEditView.applicationView.applicationPassword"))); 

    assertTrue("Failed to validate application password confirmation", 
     isTextPresent(resolveAPMessage("partner", "application.messages", 
      "Length.applicationEditView.applicationPasswordConfirmation"))); 

} 

回答

1

繼承我不是偉大的使用JUnit ...貌似你試圖解決這裏建議: Before and After Suite execution hook in jUnit 4.x

這將建議您移動您的@BeforeClass到您的SeleniumTestSuite課程中。

+1

我用來做這種方式。現在我認爲你應該創建一個基本的Singleton模式類,該類有一個getDriver()方法,該方法在驅動程序等於null時初始化驅動程序,否則將該單例返回給調用者。 – djangofan

3

這就是我做到的。在SeleniumTestSuite中,我添加了一個靜態的WebDriver,並在用@BeforeClass註釋的setUp()方法中實例化它。然後,在所有硒測試繼承的Base類中,我添加了一個getDriver()方法,它將嘗試從SeleniumTestSuite獲取靜態驅動程序。如果該驅動程序爲空,則新實例化並返回。因此,當硒測試類通過套件運行時,它們將使用來自SeleniumTestSuite的驅動程序,並且當它們單獨運行時,它們將使用它們自己的驅動程序。

SeleniumTestSuite:

@RunWith(Suite.class) 
@SuiteClasses({ 
    AbcSeleniumTest.class, 
    XyzSeleniumTest.class 
}) 
public class SeleniumTestSuite { 

    private static WebDriver driver; 

    @BeforeClass 
    public static void setUp() { 
     driver = new FirefoxDriver(); 
    } 

    //driver getter/setter 

} 

BaseSeleniumTest:

public abstract class BaseSeleniumTest { 

    public WebDriver getDriver() { 
     WebDriver driver = SeleniumTestSuite.getDriver(); 
     if(driver != null) { 
      return driver; 
     } 

     return new FirefoxDriver(); 
    } 

} 

AbcSeleniumTest:

public class AbcSeleniumTest extends BaseSeleniumTest { 

    @Test 
    public void testAbc() { 
     WebDriver driver = getDriver(); 

     // test stuff 
    } 

} 
相關問題