2014-02-04 4 views
0

У меня возникли некоторые проблемы с аннотациями TestNG, и я не нашел хорошего ответа ни о потоке stackoverflow, ни в документации testng. То, что я пытаюсь сделать, это добавить слушателя testng, а также параметры из файла testng.xml в суперклассу «тестовой базы». Все тесты testng наследуют суперкласс. Это облегчит избыточность кода в файлах тестов testng. Но когда у меня есть @Listeners и @Parameters аннотация в суперклассе, а не класс, который содержит метод (ы) @Test, аннотации не работают. Другими словами, слушатель, похоже, не «видит» тесты, и параметры из testng.xml не попадают в суперкласс во время выполнения.TestNG Аннотации в суперклассе

В моей «тестовой базе» (суперкласс) есть тестовый прослушиватель из api Sauce Labs, который будет прослушивать тесты и обновлять результаты теста Sauce Labs при успешном удалении. Он также использует аннотацию @Parameters для вытягивания параметров из тестового прогона testng.xml.

TestBase суперкласс:

@Listeners(SauceOnDemandTestListener.class) 
public class TestBase implements SauceOnDemandSessionIdProvider, SauceOnDemandAuthenticationProvider { 
    private SauceOnDemandAuthentication authentication; 
    private DesiredCapabilities capabilities; 
    protected ParallelWebDriver parallelWebDriver; 

    @Parameters({"sauce_username", "sauce_accesskey", "platform", "browser", "version"}) 
    @BeforeClass(alwaysRun = true) 
    public void setUp(String userName, String accessKey, String platform, String browser, String version) { 
     // Set up Sauce Auth 
     if (userName != null && accessKey != null) { 
      this.authentication = new SauceOnDemandAuthentication(userName, accessKey); 
     } else { 
      this.authentication = new SauceOnDemandAuthentication(); 
     } 

     // Set up the DesiredCapabilities 
     if (platform != null) { 
      this.capabilities.setCapability("platform", platform); 
     } else { 
      throw new NullArgumentException("[Parameter] platform does not exist or is not a valid value in testng.xml:"); 
     } 

     if (browser != null) { 
      this.capabilities.setCapability("browser", browser); 
     } else { 
      throw new NullArgumentException("[Parameter] browser does not exist or is not a valid value in testng.xml:"); 
     } 

     if (version != null) { 
      this.capabilities.setCapability("version", version); 
     } else { 
      throw new NullArgumentException("[Parameter] version does not exist or is not a valid value in testng.xml:"); 
     } 

     // Set up the ParallelWebDriver for the test run 
     parallelWebDriver = new ParallelWebDriver(new RemoteParallelDriver(), this.testingPlatform, capabilities); 
     parallelWebDriver.setUserName(userName); 
     parallelWebDriver.setAccessKey(accessKey); 
    } 

    @Override 
    public String getSessionId() { 
     SessionId sessionId = ((RemoteWebDriver)((WebDriver)parallelWebDriver.getDriver())).getSessionId(); 
     return (sessionId == null) ? null : sessionId.toString(); 
    } 

    @Override 
    public SauceOnDemandAuthentication getAuthentication() { 
     return authentication; 
    } 
} 

Ниже приведен пример тестового класса, который наследует TestBase.

public class SauceLabsRemote_Test extends TestBase { 
    @BeforeTest 
    public void testSetUp() throws MalformedURLException { 
     parallelWebDriver.openBrowser(); 
    } 

    public void searchGoogle(String searchText) throws InterruptedException { 
     parallelWebDriver.getDriver().get("https://google.com"); 
     WebElement searchBox = parallelWebDriver.getDriver().findElement(By.id("gbqfq")); 
     searchBox.sendKeys(searchText); 
     WebElement searchButton = parallelWebDriver.getDriver().findElement(By.id("gbqfb")); 
     searchButton.click(); 

     Assert.assertEquals(searchBox.getText(), "banjo"); 
    } 

    @Test 
    public void searchGoogle_Test1() throws InterruptedException { 
     searchGoogle("banjo"); 
    } 

    @Test 
    public void searchGoogle_Test2() throws InterruptedException { 
     searchGoogle("guitar"); 
    } 

    @AfterTest 
    public void testTearDown() { 
     parallelWebDriver.closeBrowser(); 
    } 
} 

И вот макет моего testng.xml.

<suite name="Base Framework Unit Test Suite" verbose="1" > 

    <!-- Parameters required for Sauce Labs run --> 
    <parameter name="sauce_username" value="testuser" /> 
    <parameter name="sauce_accesskey" value="acc3-55k3y-t3st-t3st-t3st" /> 

    <test name="Sauce Labs Remote Execution Test" > 
     <parameter name="platform" value="OS X 10.6" /> 
     <parameter name="browser" value="firefox" /> 
     <parameter name="version" value="26" /> 
     <classes> 
      <class name="unittest.SauceLabsRemote_Test" /> 
     </classes> 
    </test> 

</suite> 

Итак, есть ли способ получить @Listeners и @Parameters TestNG, чтобы работать на суперкласса, который не содержит @test? Заранее спасибо! И извините за любые неправильные методы кодирования; весь этот код был взломан на лету.

+0

Есть ли конкретные тесты, для которых вы хотите? или вы хотите, чтобы все ваши тесты имели возможности ур-слушателей? –

+0

Это хороший вопрос! Я хочу только возможности слушателя, если я запускаю тест удаленно в Sauce Labs. Например, если я выполняю тесты против Selenium Grid, мне не нужен слушатель. Эта мысль заставляет меня поверить, что мне нужно будет написать пользовательский прослушиватель, который может обрабатывать удаленный запуск Sauce Labs против прогона Selenium Grid против локального запуска. На самом деле это может быть моя проблема! Я сделаю некоторое тестирование с этой теорией и вернусь к вам. Благодаря! – Shane

+0

:) Рад ответить на вопрос! –

ответ

0

@Listeners и @Parameters аннотации в суперклассе будут наследоваться в подклассе. Я проверил это и проверил, что он работает. Итак, как и в моем примере кода, аннотация @Listeners, используемая в моем родительском классе TestBase, прослушивала любые аннотации @Test для дочернего класса, унаследовавшего TestBase.

Проблема, с которой я столкнулась, была связана с выполнением теста Sauce Labs и выполнением теста селеновой сетки по сравнению с выполнением локального теста. Мне пришлось добавить логику в SauceOnDemandTestListener класса Sauce Lab, чтобы выяснить, действительно ли выполнение теста действительно направляется на работу в браузере Saau Labs VM. Эта логика выходит за рамки моего первоначального вопроса, поэтому я не буду публиковать ее здесь.

Смежные вопросы