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. Эта логика выходит за рамки моего первоначального вопроса, поэтому я не буду публиковать его здесь.

Другие вопросы по тегам