Быстрое введение в 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>