Быстрое введение в Selenium-grid.
На текущий момент grid тест отличается от “классического”, тем что он не наследуется от SelenseTestCase ( <- jUnut TestCase ), т.о. suite содержит только выполнение selenium команд (DefaultSelenium) ну и какую-то базовую логику.
Необходимые импорты (в двух словах)
package ru.XXX; // Импорт grid компонент связанных с сессией import static com.thoughtworks.selenium.grid.tools.ThreadSafeSeleniumSessionStorage.session; import static com.thoughtworks.selenium.grid.tools.ThreadSafeSeleniumSessionStorage.closeSeleniumSession; import static com.thoughtworks.selenium.grid.tools.ThreadSafeSeleniumSessionStorage.startSeleniumSession; // Импорт TestNG аннотаций для параметров import org.testng.annotations.Parameters; import org.testng.annotations.Test; import org.testng.annotations.BeforeTest; import org.testng.annotations.AfterTest; // Импорт вспомогательных инструментов import ru.masterhost.utils.TestUtils; import static junit.framework.Assert.assertEquals
Определение класса test suite
public class TestsControlPanelGrid
{
// Операции, выполняемые перед каждым тестом. В данном случае это старт сессии Selenium
@BeforeTest(alwaysRun = true)
@Parameters({"seleniumHost", "seleniumPort", "browser", "webSite"})
protected void startSession(String seleniumHost, int seleniumPort, String browser, String webSite) throws Exception {
startSeleniumSession(seleniumHost, seleniumPort, browser, webSite);
}
// Операции, выполняемые после каждого теста. В данном случае это завершение сессии Selenium
@AfterTest(alwaysRun = true)
protected void closeSession() throws Exception {
closeSeleniumSession();
}
…
}
Тестовый метод
// параметры Test:
// enabled = true | false - определяет будет ли выполнен тест или нет
// groups = {"group1", "group2"…} - группировка тестов в отчете
// description = "текст…" - описание теста для отчета
// параметры Parameters. Если используются @BeforeTest методы (как указано выше), то передавать параметры
// в каждый тест уже не нужно
@Test(enabled = true, groups = {"group1", "group2"}, description = "Тест регистрации")
public void DoRegistrationPerson () throws Exception
{
// Вместо инстанса Selenium используем session() который статически импортировали
session().open( "/" );
session().click("link=Blah-blah-blah");
// some cool test stuff ….
}
Запуск test suite
# ./ant [task_name] # ./ant sanity-check
основные таски:
- sanity-check – проверка целостности (фактически проверка версии java и ant)
- launch-hub - запуск hub
- launch-remote-control - запуск отдельного экземпляра RC
Для запуска собственно класса с тестами используется runner TestNG. В build.xml проекта вносится (если еще нет) соответствующий таск. Таски могут быть двух видов: для последовательного запуска тестов и для параллельного (отличаются набором параметров).
Последовательный запуск тестов
<target name="run-demo-in-sequence" description="Run Selenium tests one by one">
<java classpathref="demo.classpath" classname="org.testng.TestNG" failonerror="true">
<sysproperty key="java.security.policy" file="${basedir}/lib/testng.policy"/>
<sysproperty key="webSite" value="${webSite}" />
<sysproperty key="seleniumHost" value="${seleniumHost}" />
<sysproperty key="seleniumPort" value="${seleniumPort}" />
<sysproperty key="browser" value="${browser}" />
<arg value="-suitename" />
<arg value="Selenium Grid Demo In Sequence" />
<arg value="-d" />
<arg value="${basedir}/target/reports" />
<arg value="-testclass"/>
<arg value="com.thoughtworks.selenium.grid.demo.WebTestForASingleBrowser"/>
</java>
</target>
Подразумевается что basedir, webSite, seleniumHost, seleniumPort, browser определены ранее например вот так:
<property file="${basedir}/project.properties" />
<property name="version" value="SNAPSHOT" />
<property name="webSite" value="http://amazon.com" />
<property name="seleniumHost" value="localhost" />
<property name="seleniumPort" value="4444″ />
<property name="browser" value="*chrome" />
Параллельный запуск тестов
<target name="run-demo-in-parallel" description="Run Selenium tests in parallel">
<java classpathref="demo.classpath" classname="org.testng.TestNG" failonerror="true">
<sysproperty key="java.security.policy" file="${basedir}/lib/testng.policy"/>
<sysproperty key="webSite" value="${webSite}" />
<sysproperty key="seleniumHost" value="${seleniumHost}" />
<sysproperty key="seleniumPort" value="${seleniumPort}" />
<sysproperty key="browser" value="${browser}" />
<arg value="-d" />
<arg value="${basedir}/target/reports" />
<arg value="-suitename" />
<arg value="Selenium Grid Demo In Parallel" />
<arg value="-parallel"/>
<arg value="methods"/>
<arg value="-threadcount"/>
<arg value="10″/>
<arg value="-testclass"/>
<arg value="com.thoughtworks.selenium.grid.demo.WebTestForASingleBrowser"/>
</java>
</target>