<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>hudson@work &#187; java</title>
	<atom:link href="http://hudson.su/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://hudson.su</link>
	<description>статьи о web-разработке, менеджменте IT проектов и контроле качества</description>
	<lastBuildDate>Fri, 20 Jan 2012 13:15:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Selenium-grid quickstart</title>
		<link>http://hudson.su/2008/05/09/selenium-grid-quickstart/</link>
		<comments>http://hudson.su/2008/05/09/selenium-grid-quickstart/#comments</comments>
		<pubDate>Fri, 09 May 2008 13:09:00 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[selenium grid]]></category>
		<category><![CDATA[тестирование]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=62</guid>
		<description><![CDATA[Быстрое введение в Selenium-grid. На текущий момент grid тест отличается от “классического”, тем что он не наследуется от SelenseTestCase ( &#60;- jUnut TestCase ), т.о. suite содержит только выполнение selenium команд (DefaultSelenium) ну и какую-то базовую логику. Необходимые импорты (в двух словах) package ru.XXX; // Импорт grid компонент связанных с сессией import static com.thoughtworks.selenium.grid.tools.ThreadSafeSeleniumSessionStorage.session; import [...]]]></description>
			<content:encoded><![CDATA[<p>Быстрое введение в Selenium-grid.</p>
<p><span id="more-62"></span><br />
На текущий момент grid тест отличается от “классического”, тем что он не наследуется от SelenseTestCase ( &lt;- jUnut TestCase ), т.о. suite содержит только выполнение selenium команд (DefaultSelenium) ну и какую-то базовую логику.</p>
<p><strong>Необходимые импорты (в двух словах)</strong></p>
<pre>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</pre>
<p><strong>Определение класса test suite</strong></p>
<pre>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();
}
…
}</pre>
<p><strong>Тестовый метод</strong></p>
<pre>// параметры 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 ….
}</pre>
<p><strong>Запуск test suite</strong></p>
<div>Запуск тестов осуществляется через ant. В корне проекта расположен файл ./build.xml, который по умолчанию используется ant для сборок. Использование:</div>
<pre># ./ant [task_name]
# ./ant sanity-check</pre>
<p>основные таски:</p>
<ul>
<li><strong>sanity-check</strong> &#8211; проверка целостности (фактически проверка версии java и ant)</li>
<li><strong>launch-hub </strong>- запуск hub</li>
<li><strong>launch-remote-control </strong>- запуск отдельного экземпляра RC</li>
</ul>
<p>Для запуска собственно класса с тестами используется runner TestNG. В build.xml проекта вносится (если еще нет) соответствующий таск. Таски могут быть двух видов: для последовательного запуска тестов и для параллельного (отличаются набором параметров).</p>
<p><strong>Последовательный запуск тестов</strong></p>
<pre>&lt;target name="run-demo-in-sequence" description="Run Selenium tests one by one"&gt;
&lt;java classpathref="demo.classpath" classname="org.testng.TestNG" failonerror="true"&gt;
&lt;sysproperty key="java.security.policy" file="${basedir}/lib/testng.policy"/&gt;
&lt;sysproperty key="webSite" value="${webSite}" /&gt;
&lt;sysproperty key="seleniumHost" value="${seleniumHost}" /&gt;
&lt;sysproperty key="seleniumPort" value="${seleniumPort}" /&gt;
&lt;sysproperty key="browser" value="${browser}" /&gt;
&lt;arg value="-suitename" /&gt;
&lt;arg value="Selenium Grid Demo In Sequence" /&gt;
&lt;arg value="-d" /&gt;
&lt;arg value="${basedir}/target/reports" /&gt;
&lt;arg value="-testclass"/&gt;
&lt;arg value="com.thoughtworks.selenium.grid.demo.WebTestForASingleBrowser"/&gt;
&lt;/java&gt;
&lt;/target&gt;</pre>
<p>Подразумевается что basedir, webSite, seleniumHost, seleniumPort, browser определены ранее например вот так:</p>
<pre>&lt;property file="${basedir}/project.properties" /&gt;
&lt;property name="version" value="SNAPSHOT" /&gt;
&lt;property name="webSite" value="<a href="http://amazon.com/">http://amazon.com</a>" /&gt;
&lt;property name="seleniumHost" value="localhost" /&gt;
&lt;property name="seleniumPort" value="4444″ /&gt;
&lt;property name="browser" value="*chrome" /&gt;</pre>
<p><strong>Параллельный запуск тестов</strong></p>
<pre>&lt;target name="run-demo-in-parallel" description="Run Selenium tests in parallel"&gt;
&lt;java classpathref="demo.classpath" classname="org.testng.TestNG" failonerror="true"&gt;
&lt;sysproperty key="java.security.policy" file="${basedir}/lib/testng.policy"/&gt;
&lt;sysproperty key="webSite" value="${webSite}" /&gt;
&lt;sysproperty key="seleniumHost" value="${seleniumHost}" /&gt;
&lt;sysproperty key="seleniumPort" value="${seleniumPort}" /&gt;
&lt;sysproperty key="browser" value="${browser}" /&gt;
&lt;arg value="-d" /&gt;
&lt;arg value="${basedir}/target/reports" /&gt;
&lt;arg value="-suitename" /&gt;
&lt;arg value="Selenium Grid Demo In Parallel" /&gt;
&lt;arg value="-parallel"/&gt;
&lt;arg value="methods"/&gt;
&lt;arg value="-threadcount"/&gt;
&lt;arg value="10″/&gt;
&lt;arg value="-testclass"/&gt;
&lt;arg value="com.thoughtworks.selenium.grid.demo.WebTestForASingleBrowser"/&gt;
&lt;/java&gt;
&lt;/target&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2008/05/09/selenium-grid-quickstart/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

