У меня возникли некоторые проблемы с аннотациями 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? Заранее спасибо! И извините за любые неправильные методы кодирования; весь этот код был взломан на лету.
Есть ли конкретные тесты, для которых вы хотите? или вы хотите, чтобы все ваши тесты имели возможности ур-слушателей? –
Это хороший вопрос! Я хочу только возможности слушателя, если я запускаю тест удаленно в Sauce Labs. Например, если я выполняю тесты против Selenium Grid, мне не нужен слушатель. Эта мысль заставляет меня поверить, что мне нужно будет написать пользовательский прослушиватель, который может обрабатывать удаленный запуск Sauce Labs против прогона Selenium Grid против локального запуска. На самом деле это может быть моя проблема! Я сделаю некоторое тестирование с этой теорией и вернусь к вам. Благодаря! – Shane
:) Рад ответить на вопрос! –