2012-01-24 11 views
3

同じ基本クラスを継承した以下のセレンテストスイートがあります。テストスイート全体を実行すると、同じWebドライバインスタンスを使用する方法は?また、各テストを独立して実行したい私はこれがスイートをかなり動かすのにかかる時間を短縮すると信じています。セレンスイート全体で同じWebドライバを使用

このテストはmavenから実行され、各テストクラスが実行されます。

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

} 

基底クラスのすべてのテストは、あなたがここで提案解決しようとしているように見える...私はJUnitを用いた素晴らしいじゃない

@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

継承: をBefore and After Suite execution hook in jUnit 4.x

あなたの@BeforeClass SeleniumTestSuiteクラスに追加します。

+1

私はそのように行うために使用。ここでは、ドライバがnullに等しい場合にドライバを初期化するgetDriver()メソッドを持つ基本的なSingletonパターンクラスを作成する必要があると思いますが、それ以外の場合は呼び出し元にシングルトンを返します。 – djangofan

3

これが私のやり方です。 SeleniumTestSuiteでは、静的WebDriverを追加し、@BeforeClassで注釈を付けたsetUp()メソッドでインスタンス化しました。次に、すべてのセレニウムテストが継承するBaseクラスで、getDriver()メソッドを追加しました。これは、SeleniumTestSuiteからスタティックドライバを取得しようとします。ドライバがnullの場合、新しいドライバがインスタンス化されて返されます。したがって、セレンテストクラスがスイートを介して実行されている場合、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 
    } 

}