Testng BeforeSuite запускает только один тестовый класс - PullRequest
0 голосов
/ 27 июня 2011

У меня есть следующий testng.xml

<test name="CommonReportingTests" preserve-order="true">
<classes>
   <class name="com.blah.ReportRunTests">
        <methods>
            <include name="login" />
            <include name="checkHomeTab" />
            <include name="checkReportsTab" />
             <include name="checkReportsExist" />
             <include name="reportsCleanup" />               
        </methods>
   </class>

   <class name="com.blah.RestoreActivityTests">
        <methods>
            <include name="login" />
            <include name="checkHomeTab" />
            <include name="checkReportsTab" />
             <include name="checkReportsExist" />             
             <include name="expandReportsTabAndClickRestoreActivity" />    
        </methods>
   </class>
</classes>

Мой класс TestBase имеет это:

    @Parameters({ "webconsoleStartupURL" })
@BeforeSuite(description = "Perform class setup tasks")
public void beforeClass(final String webconsoleStartupURL)
        throws ClassNotFoundException, InstantiationException,
        IllegalAccessException {
    sm = new SeleniumMgr(webconsoleStartupURL);
    sm.startSelenium();
}

@AfterSuite(description = "Perform class teardown tasks")
public void afterClass() {
    sm.stopSelenium();
}

Когда я выполняю тесты, кажется, что запускается только второй тест в xml, т.е. RestoreActivityTests, а затем он выходит из пакета. Первый класс не выполнен, и я вижу NullPointerException для каждого из тестов в первом.

Я хочу только один экземпляр браузера и выполнить несколько тестов. Документ testng предполагает, что версия xml, которую я использовал выше, на самом деле верна. Что здесь не так?

Ответы [ 2 ]

4 голосов
/ 05 октября 2012

У меня была похожая проблема с @BeforeSuite и использованием xml для определения моих тестов - нулевой указатель для всех моих тестов в файле xml, но последний. TestNG использует отражение для создания класса, необходимого для запуска теста - из xml-файла он создает новый объект рефлексивно для каждого «теста» в xml в моем случае, и я подозреваю, что то же самое для вашего сценария, где у вас есть 2 класса , В первом нулевой указатель, потому что sm не инициализируется в первом тесте (так что вы получаете нулевой указатель), но инициализация произошла в экземпляре для второго теста.

Мое решение состояло в том, чтобы сделать мою ссылку статической (в вашем случае защищенной статической SeleniumMngr sm;

Другими словами, вам не нужно использовать @BeforeTest или @BeforeClass (в любом случае не будет работать так, как вы хотите, поскольку будет продолжать создавать экземпляр объекта sm).

1 голос
/ 28 июня 2011

Если вам нужен метод для запуска перед выполнением каждого класса, тогда вы должны использовать @BeforeClass @BeforeSuite будет выполнено только один раз - до запуска набора.

...