TestNG Аннотации в суперклассе
У меня возникли некоторые проблемы с аннотациями TestNG, и я не нашел хорошего ответа ни по stackru, ни в документации testng. Я пытаюсь добавить слушателя testng, а также параметры из файла testng.xml в суперкласс "test base". Все тестовые тесты будут наследовать суперкласс. Это уменьшит избыточность кода в файлах тестового класса 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? Заранее спасибо! И извините за любые плохие методы кодирования; весь этот код был написан на лету.
1 ответ
Аннотации @Listeners и @Parameters в суперклассе будут наследоваться в подклассе. Я проверил это и убедился, что это работает. Итак, как и в моем примере кода, аннотация @Listeners, используемая в моем родительском классе TestBase, прослушивала любые аннотации @Test для дочернего класса, который унаследовал TestBase.
У меня была проблема, связанная с выполнением теста Sauce Labs, выполнением теста Selenium Grid и локальным тестированием. Мне нужно было добавить логику в класс SauceOnDemandTestListener Sauce Lab, чтобы выяснить, действительно ли выполнение теста направлялось на задания браузера виртуальной машины Sauce Labs. Эта логика выходит за рамки моего первоначального вопроса, поэтому я не буду публиковать его здесь.