<?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>Alex Sergeev @ ALSEDI &#187; Инструменты</title>
	<atom:link href="http://alsedi.com/blog/category/instrumentarij/feed/" rel="self" type="application/rss+xml" />
	<link>http://alsedi.com/blog</link>
	<description>Блог о собственных наблюдениях, ошибках и находках в QA, софтверном бизнесе и жизни.</description>
	<lastBuildDate>Fri, 26 Mar 2010 21:08:25 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>CubicTest плюсы и минусы</title>
		<link>http://alsedi.com/blog/cubictest-plyusy-i-minusy/</link>
		<comments>http://alsedi.com/blog/cubictest-plyusy-i-minusy/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 16:28:02 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[QA]]></category>
		<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[CubicTest]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[user story]]></category>
		<category><![CDATA[обучение]]></category>
		<category><![CDATA[тест]]></category>
		<category><![CDATA[тестирование]]></category>
		<category><![CDATA[тесткейсы]]></category>

		<guid isPermaLink="false">http://alsedi.com/blog/?p=502</guid>
		<description><![CDATA[Продолжаем разговор о тестах в CubicTest.
Хочу отметить, что технические возможности пристально разглядывали мои сотрудники (Лиля и Ира), а я лишь ковылял вслед за ними, всего лишь их подбадривая и горячо надеясь в полезность кубика.
Но при близком рассмотрении CubicTest разочаровал (хотя концепция неплоха, но подвела текущая реализация). Он плохо подходит для создания сложных тестов. Есть проблемы [...]]]></description>
			<content:encoded><![CDATA[<p>Продолжаем <a href="http://alsedi.com/blog/funkcionalnye-web-testy-dlya-selenium-v-cubictest/" target="_blank">разговор о тестах в CubicTest</a>.</p>
<p>Хочу отметить, что технические возможности пристально разглядывали мои сотрудники (Лиля и Ира), а я лишь ковылял вслед за ними, всего лишь их подбадривая и горячо надеясь в полезность кубика.</p>
<p>Но при близком рассмотрении CubicTest разочаровал (хотя концепция неплоха, но подвела текущая реализация). Он плохо подходит для создания сложных тестов. Есть проблемы с рекордером — запись возможна только в Firefox и Opera, не все элементы определяются корректно. Проблемы с использованием переменных в тестах, например зациклить тест для прохода сценария по одному тест кейсу, но с разными параметрами в текущей версии (1.9.6) не получится. Такую поддержку обещают в будущем. Единственная возможность перевести тесты в Selenium — это экспорт тестов в скрипты, совместимые с Selenium, но даже после этого для запуска теста в Selenium RC его нужно шлифовать руками. Существует теоретическая возможность интеграции CubicTest в Selenium Grid, но у нас этого не получилось.</p>
<p>Но есть и плюсы, которые делают CubicTest отличным инструментом для обучения неопытных тестировщиков и составления простых функциональных тестов. А также для общения с заказчиком, для получения User Story.</p>
<p><strong>Плюс 1.</strong> Визуальное представление тестов, операций, связей между тестами и элементов страниц. Ошибки и удачные проходы условий при выполнении теста тоже подсвечиваются прямо в редакторе.</p>
<p><a href="http://www.alsedi.com/blog/blogimg/cubictest/visual.jpg"><img class="alignnone" title="Визуальное представление теста" src="http://www.alsedi.com/blog/blogimg/cubictest/visual_th.jpg" alt="" width="400" height="188" /></a></p>
<p><strong>Плюс 2. </strong>Возможность расширять тестовые наборы с помощью Java (но не залезать внутрь существующего теста).<br />
<a href="http://www.alsedi.com/blog/blogimg/cubictest/java.jpg"><img class="alignnone" title="Визуальное представление теста" src="http://www.alsedi.com/blog/blogimg/cubictest/java_th.jpg" alt="" width="400" height="158" /></a></p>
<p><strong>Плюс 3. </strong>Создание прототипа HTML по тесту (на лицо попытка адаптации к TDD или User Story). Сама идея мне очень даже понравилась, остаётся только проверить её на профпригодность.</p>
<p>Код генерируется чистенький (судя по всему из одного темплейта, просто подставляются новые элементы), с использованием li, div, css и js. Есть несогласованность языковых настроек, по умолчанию HTML создаётся с кодировкой ISO-8859-1, хотя из Eclipse, в моей инсталляции, приходит Cp1251 (эта же кодировка используется при записи тестов).</p>
<p>Теоретически этот прототип можно использовать для дальнейшей разработки, либо для показа заказчику, на этапе проектирования.</p>
<p><strong>Плюс 4. </strong>Обилие поддерживаемых браузеров и режимов их работы (всего семь) и возможность указывать профайлы для Firefox и Opera.<br />
<code><br />
*firefox -&gt; Firefox (chrome mode)<br />
*opera -&gt; Opera<br />
*googlechrome -&gt; Google Chrome<br />
*iexplore -&gt; Internet Explorer (HTA mode)<br />
*safari -&gt; Safari<br />
*pifirefox -&gt; Firefox - Proxy injection mode<br />
*piiexplore -&gt; Internet Explorer - Proxy injection mode</code></p>
<p>Proxy Injection Mode достался от Selenium. HTA (HTML Application?) у меня просто отказался работать, IE8 упорно валился с ошибками в JS.</p>
<p><strong>Плюс 5. </strong>При записи теста в Recorder Plugin прямо на странице указывать какие элементы нужно проверять, условия автоматически добавятся в тест.</p>
<p><strong>Плюс 6. </strong>Интеграция с Maven.</p>
<p>Об использовании CubicTest, еще можно поспорить, но познакомить с ним тестировщиков web приложений точно стоит, вполне возможно, что найдутся такие рутинные операции, которые CubicTest позволит очень быстро автоматизировать и вынести за пределы ручной переборки.</p>
]]></content:encoded>
			<wfw:commentRss>http://alsedi.com/blog/cubictest-plyusy-i-minusy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Функциональные web-тесты для Selenium в CubicTest [вводная]</title>
		<link>http://alsedi.com/blog/funkcionalnye-web-testy-dlya-selenium-v-cubictest/</link>
		<comments>http://alsedi.com/blog/funkcionalnye-web-testy-dlya-selenium-v-cubictest/#comments</comments>
		<pubDate>Mon, 24 Aug 2009 18:00:07 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[QA]]></category>
		<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[CubicTest]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Galileo]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[web-тесты]]></category>
		<category><![CDATA[тестирование]]></category>

		<guid isPermaLink="false">http://alsedi.com/blog/?p=463</guid>
		<description><![CDATA[В одну статью всё не уместится, в этой будут даны основы, которые будут необходимы для общего понимания и использования CubicTest.
CubicTest приятный инструмент для тех, кто занимается функциональным тестированием веб-страниц. Самостоятельной версии нет и для его использования потребуется Eclipse (я использовал Galileo). Тесты в итоге можно экспортировать либо в скрипты Selenium Core, либо в скрипты Watir, [...]]]></description>
			<content:encoded><![CDATA[<p>В одну статью всё не уместится, в этой будут даны основы, которые будут необходимы для общего понимания и использования <a href="http://cubictest.seleniumhq.org/" target="_blank">CubicTest</a>.</p>
<p>CubicTest приятный инструмент для тех, кто занимается функциональным тестированием веб-страниц. Самостоятельной версии нет и для его использования потребуется <a href="http://www.eclipse.org/" target="_blank">Eclipse </a>(я использовал Galileo). Тесты в итоге можно экспортировать либо в скрипты <a href="http://seleniumhq.org/projects/core/" target="_blank">Selenium Core</a>, либо в скрипты <a href="http://wtr.rubyforge.org/" target="_blank">Watir</a>, а можно никуда не экспортировать и запускать из Eclipse. В документации особо указывается, что с CubicTest можно протестировать всё, что основано на HTML, но Java апплеты и Flash ему не по зубам (<em>какой сюрприз</em>).</p>
<p>Но, обо всём по-порядку.</p>
<h2>Установка</h2>
<p>Установка CubicTest в Galileo, проще, чем описано на странице с <a href="http://boss.bekk.no/cubictest/installDetails.html" target="_blank">инструкциями по установке</a> (там используется старая версия Eclipse). Отчасти потому, что требуемые компоненты уже содержатся в Eclipse.</p>
<p>1. В Eclipse откройте меню <strong>Help </strong>&gt; <strong>Install New Software</strong></p>
<p><a href="http://www.alsedi.com/blog/blogimg/cubictest/install1.jpg"><img class="alignnone" title="Установка CubicTest в Eclipse" src="http://www.alsedi.com/blog/blogimg/cubictest/install1_th.png" alt="" width="350" height="179" /><br />
</a></p>
<p>2. В новом окне в поле <strong>Work with</strong> нужно ввести <a href="http://boss.bekk.no/cubictest/update/" target="_blank">http://boss.bekk.no/cubictest/update/</a> и нажать <strong>Add</strong>. После этого в списке доступных программ появится краткий список Web Testing Tool (в моём случае всего один).</p>
<p><a href="http://www.alsedi.com/blog/blogimg/cubictest/install2.jpg"><img class="alignnone" title="Выбор CubicTest из списка" src="http://www.alsedi.com/blog/blogimg/cubictest/install2_th.png" alt="" width="350" height="300" /></a></p>
<p>3. Напротив CubicTest нужно поставить галочку и нажать <strong>Finish</strong>. После этого инсталятор проверит зависимости и выдаст список на загрузку и установку после чего нужно будет перегрузить Eclipse.</p>
<p>С установкой всё.</p>
<h2>Создание проекта.</h2>
<p>Ничего необычного нет, есть только несколько специфичных опций.</p>
<p>1. Выбор точки отсчёта (Startpoint)</p>
<p>Точка отсчёта это откуда начинается тест. Есть три варианта (v 1.9.6):</p>
<ul>
<li><strong>URL </strong>- привязываемся к реальной страничке.</li>
<li><strong>Extension </strong>- привязываемся к страничке (или шагу) из другого теста</li>
<li><strong>Sub test </strong>- тест нельзя будет запустить самостоятельно, он может быть только частью другого теста.</li>
</ul>
<p>После этого будут только вопросы о том, добавлять ли CubicTest и Selenium в classpath. Тут уже личное дело каждого.</p>
<p>Так же в каждом проекте по умолчанию создаётся файл <strong>test-project.properties</strong>, в нём хранится информация о том, какой браузер и в каком режиме использовать для тестов. Google Chrome поддерживается изначально и никаких танцев с бубном не потребуется.</p>
<h2>Концепция.</h2>
<p>Проще пока не придумали.</p>
<p>В CubicTest <a href="http://boss.bekk.no/display/BOSS/Essential+Concepts+in+CubicTest" target="_blank">реализовано несколько сущностей</a>, которые и позволяют эффективно создавать тесты с помощью визуального редактора:</p>
<p><strong>Наборы тестов (test suites</strong>) &#8211; наборы отдельных тестов (tests), собранных в логическую группу и взаимодействующих (прямо или косвенно) друг с другом.</p>
<p><strong>Тесты (tests</strong>) &#8211; собственно тесты, описание последовательностей действий и состояний web приложения.</p>
<p><strong>Страницы (page</strong>) и<strong> Состояния (states</strong>) &#8211; страницы или состояния. Например, если на тестируемой странице ввести текст, то это измени её состояние и добавит <strong>state</strong> в <strong>test</strong>.</p>
<p><strong>Транзакции (transactions)</strong> и <strong>взаимодействие с пользователем (user interactions)</strong>. Взаимодействие с пользователем &#8211; это те действия, которые совершаются на страницы &#8211; клики, ввод текста, выбор элементов списка. Несколько таких действий &#8211; это транзакция, которая меняет состояние (state) страницы (page).</p>
<p><strong>Элементы страницы (Page elements)</strong> &#8211; это сущности представляющие элементы html, которые присутствуют или не присутствуют на странице. Через них осуществляется взаимодействие с пользователем (user interactions) и они используются для проверок.</p>
<p><strong>Контекст (Context)</strong> &#8211; это элементы разметки одним махом &#8211; div, table (tr, td), span. Логически же это представление вложенности в DOM дереве, а их использование позволяет тестировать эквивалентные значения в разных частях HTML документа.</p>
<p><strong>Идентификаторы (Itentifiers)</strong> &#8211; это свойства, по которым можно найти контекст и определить элемент на страницы. Идентификаторов не мало, часть из &#8211; атрибуты элементов, а часть HTML теги. В зависимости от элемента страницы набор идентификаторов раз и с помощью комбинаций элементов и контекста можно задавать элменты достаточно гибко. При исполнении теста CubicTest автоматически строит <a href="http://www.w3.org/TR/xpath" target="_blank">XPath</a> по выставленным идентификаторам.</p>
<p><strong>Точка отсчета (Start point)</strong> и <strong>расширения (Extentions)</strong> &#8211; об этом уже говорилось чуть выше. Это точки откуда начинается тест &#8211; web страница или другой тест.</p>
<p><strong>Виртуальные страницы (Commons)</strong> &#8211; это страницы почти как настоящие, но на самом деле не существуюющие. Содержащиеся на них элементы можно использовать для проверок на разных страницах (что то вроде Data Module в Delphi).</p>
<p><strong>Сабтесты (Sub Tests)</strong> &#8211; практически любой тест может быть включен в состав другого теста и будет выполнен в соответствии с порядком подключения.</p>
<p>Из всего этого складывается довольно простая матрёшка:</p>
<p><img class="alignnone" title="Концепция CubicTest" src="http://www.alsedi.com/blog/blogimg/cubictest/concept.png" alt="" width="450" height="550" /></p>
<p>На этом я пока закончу и в продолжении расскажу уже о сами принципы и подходах к написанию тестов веб приложений с помощью CubicTest.</p>
]]></content:encoded>
			<wfw:commentRss>http://alsedi.com/blog/funkcionalnye-web-testy-dlya-selenium-v-cubictest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CI Joe пополнение в continuous integration</title>
		<link>http://alsedi.com/blog/ci-joe-popolnenie-v-continuous-integration/</link>
		<comments>http://alsedi.com/blog/ci-joe-popolnenie-v-continuous-integration/#comments</comments>
		<pubDate>Sat, 08 Aug 2009 12:19:41 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[QA]]></category>
		<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[campfire]]></category>
		<category><![CDATA[CI]]></category>
		<category><![CDATA[ci joe]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[github]]></category>

		<guid isPermaLink="false">http://alsedi.com/blog/?p=447</guid>
		<description><![CDATA[Разработчики из Logic Awesome (GitHub) представили новый сервер CI с открытым кодом &#8211; CI Joe. Этот сервер интегруруется с GitHub и использует Campfire для нотификаций. CI Joe может запустить любые тесты, которые работают из командной строки.
]]></description>
			<content:encoded><![CDATA[<p>Разработчики из Logic Awesome (<a href="http://github.com" target="_blank">GitHub</a>) представили новый сервер CI с открытым кодом &#8211; <a href="http://github.com/blog/471-continuous-integration-spring-cleaning" target="_blank">CI Joe</a>. Этот сервер интегруруется с GitHub и использует <a href="http://campfirenow.com/" target="_blank">Campfire</a> для нотификаций. CI Joe может запустить <a href="http://github.com/defunkt/cijoe/tree/master#readme">любые тесты</a>, которые работают из командной строки.</p>
]]></content:encoded>
			<wfw:commentRss>http://alsedi.com/blog/ci-joe-popolnenie-v-continuous-integration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Коллекции браузеров против VM</title>
		<link>http://alsedi.com/blog/kollekcii-brauzerov-protiv-vm/</link>
		<comments>http://alsedi.com/blog/kollekcii-brauzerov-protiv-vm/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 14:14:42 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[QA]]></category>
		<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[IETester]]></category>
		<category><![CDATA[internet explorer collection]]></category>
		<category><![CDATA[multiply ie]]></category>
		<category><![CDATA[virtual pc]]></category>
		<category><![CDATA[коллекции браузеров]]></category>
		<category><![CDATA[кросс-брузерное]]></category>
		<category><![CDATA[тестирование]]></category>

		<guid isPermaLink="false">http://alsedi.com/blog/?p=386</guid>
		<description><![CDATA[Не получается использовать суррогаты IETester, Internet Explorer Collection, Multiply IE и прочих. Нет ни одного пака браузеров, в котором браузеры бы работали так, как если бы стояли в одиночестве. Тоже касается и Multi-Safari, хотя его глюки не столь критичны.
На страницах где AJAX не используется всё более менее хорошо. Как только появляется часто меняющиеся части или ссылки [...]]]></description>
			<content:encoded><![CDATA[<p>Не получается использовать суррогаты <a href="http://alsedi.com/blog/ietester-03/">IETester</a>, <a href="http://finalbuilds.edskes.net/iecollection.htm" target="_blank">Internet Explorer Collection</a>, <a href="http://tredosoft.com/multiple_ie" target="_blank">Multiply IE</a> и прочих. Нет ни одного пака браузеров, в котором браузеры бы работали так, как если бы стояли в одиночестве. Тоже касается и <a href="http://michelf.com/projects/multi-safari/" target="_blank">Multi-Safari</a>, хотя его глюки не столь критичны.</p>
<p>На страницах где AJAX не используется всё более менее хорошо. Как только появляется часто меняющиеся части или ссылки на внешний контент тут же начинаются проблемы, которые не всегда получается понять. Так мы некоторое время мучались с тем, что при помощь Java Script в IETester не подгружались внешние страницы внутрь загруженной.</p>
<p>В результате оказалось дешевле доставить памяти и установить VM с нужными операционками и браузерами.  Этим удалось добиться не только адекватного рендеринга, но и возможности достаточно точно увидеть производительность приложения и ситуации при которых приложение оттормаживается.</p>
<p>Раньше я считал использование коллекций браузеров очень удачным решением, но поработав с ними решение своё изменил. Это решение только для ленивых или для &#8220;бедных&#8221;, лучше ставить VM. Тем более, что сейчас это не проблема, нужно только побольше памяти (мне хватило 2х ГБ) и небольшое упорство при чтении документации по настройке виртуалки (в основном сеть).</p>
<p>Я решил использовать <a href="http://www.microsoft.com/windows/downloads/virtualpc/default.mspx" target="_blank">Virtual PC</a> от Microsoft. На которой было создано несколько виртуальных машин XP и Vista с разными версиями браузеров. Файлы созданных VM к железу не привязаны и их можно клонировать как угодно, а так же сохранять разные состояния &#8220;замораживая&#8221; таким образом особые условия для повторения ошибок.</p>
<p>Впрочем я это знал и несколько лет назад, но просто ленился разобраться в настройках VM, а оказалось, что от оптимального решения меня отделяло прочтение пяти страничек из встроенного хелпа.</p>
]]></content:encoded>
			<wfw:commentRss>http://alsedi.com/blog/kollekcii-brauzerov-protiv-vm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IP Location Tools</title>
		<link>http://alsedi.com/blog/ip-location-tools/</link>
		<comments>http://alsedi.com/blog/ip-location-tools/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 08:55:51 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Shareware]]></category>
		<category><![CDATA[Заметки]]></category>
		<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[geo location]]></category>
		<category><![CDATA[ip location]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://alsedi.com/blog/?p=383</guid>
		<description><![CDATA[Бесплатная (а на данный момент и актуальная) база по IP. Сервис можно использовать через Web, обращаясь к сайту через сервлет &#8220;ip_query.php?ip=Xxx.Xxx.Xxx.Xxx&#8220;, данные можно получить в XML, JSON и CSV форматах.
Если этого недостаточно, можно обратиться к базе данных напрямую.
IP Location Tools
]]></description>
			<content:encoded><![CDATA[<p>Бесплатная (а на данный момент и актуальная) база по IP. Сервис можно использовать через Web, обращаясь к сайту через сервлет &#8220;<strong>ip_query.php?ip=Xxx.Xxx.Xxx.Xxx</strong>&#8220;, данные можно получить в XML, JSON и CSV форматах.</p>
<p>Если этого недостаточно, можно обратиться к базе данных напрямую.</p>
<p><a href="http://www.iplocationtools.com/index.php" target="_blank">IP Location Tools</a></p>
]]></content:encoded>
			<wfw:commentRss>http://alsedi.com/blog/ip-location-tools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Инструменты для проверки страниц и сайтов</title>
		<link>http://alsedi.com/blog/instrumenty-dlya-proverki-stranic-i-sajtov/</link>
		<comments>http://alsedi.com/blog/instrumenty-dlya-proverki-stranic-i-sajtov/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 14:59:56 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[QA]]></category>
		<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[W3C]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[xenu]]></category>
		<category><![CDATA[тестирование]]></category>

		<guid isPermaLink="false">http://alsedi.com/blog/?p=372</guid>
		<description><![CDATA[Очередная порция полезных инструментов для тестирования.
Xenu&#8217;s Link Sleuth
Древний инструмент для проверки ссылок на сайте. Различает ссылки и почтовые адреса, оценки наличия страниц идут по HTTP кодам (то есть если запрашиваемой страницы нет, но сервер не возвращает ошибку 404, то Xenu посчитает, что страница есть. Поддерживаются ссылки в JavaScript, подробнее об этом написал Франк Виссер &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>Очередная порция полезных инструментов для тестирования.</p>
<p><strong><a href="http://home.snafu.de/tilman/xenulink.html" target="_blank">Xenu&#8217;s Link Sleuth</a></strong></p>
<p>Древний инструмент для проверки ссылок на сайте. Различает ссылки и почтовые адреса, оценки наличия страниц идут по HTTP кодам (то есть если запрашиваемой страницы нет, но сервер не возвращает ошибку 404, то Xenu посчитает, что страница есть. Поддерживаются ссылки в JavaScript, подробнее об этом написал Франк Виссер &#8211; &#8220;<a href="http://members.chello.nl/f.visser3/xenu/6-handling-javascript.html#regex" target="_blank">Checking Links with Xenu: Handling javascript links</a>&#8220;. Полный список возможностей и ограничений доступен на официальной странице и информации там предостаточно. Последнее обновление в Декабре 2008.</p>
<p><strong>WWW Consortium</strong> предоставляет целый ряд сервисов для проверки соответствия страниц стандартам (Полный список тут: <a href="http://www.w3.org/QA/Tools/" target="_blank">W3C QA Toolbox</a> ):<br />
- <a href="http://validator.w3.org/" target="_blank">W3C Markup Validation</a> &#8211; проверка html (в том числе и пятой версии), xhtml, svg (формат график в XML), smil (язык представления, отображения и синхронизации медиа объектов. Объекты описываются в виде XML), mathml (язык для представления и вычисления математических формул в веб).</p>
<p>- <a href="http://jigsaw.w3.org/css-validator/" target="_blank">W3C CSS Validation</a> &#8211; проверка CSS. Валидатор может работать с CSS внутри HTML. Можно сделать проверку на соответствие определенному стандарту. Кроме стандратных уровней CSS можно проверить на соответствие Mobile CSS (базирующийся на CSS 2.1), TV/ATSC (CSS с учётом правил отображения и ограничений телевизионных устройств), а также правилам стилей в SVG.</p>
<p>- <a href="http://validator.w3.org/mobile/" target="_blank">W3C mobileOK Checker</a> &#8211; Проверка, насколько хорошо раметка страницы адаптирована для отображения на мобильных устройствах. Проверяется валидность (XHTML), размеры элементов и объемы данных, использование CSS и скриптов.</p>
<p>Для тестирования страниц в браузере существуют разнообразные <a href="http://alsedi.com/blog/plaginy-firefox-dlya-uproshheniya-veb-testirovaniya/" target="_blank">плагины для Firefox</a> и Safari.</p>
]]></content:encoded>
			<wfw:commentRss>http://alsedi.com/blog/instrumenty-dlya-proverki-stranic-i-sajtov/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IETester 0.3</title>
		<link>http://alsedi.com/blog/ietester-03/</link>
		<comments>http://alsedi.com/blog/ietester-03/#comments</comments>
		<pubDate>Mon, 16 Mar 2009 15:52:24 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[IETester]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[браузер]]></category>
		<category><![CDATA[обновление]]></category>
		<category><![CDATA[тестирование]]></category>
		<category><![CDATA[эмуляция]]></category>

		<guid isPermaLink="false">http://alsedi.com/blog/?p=361</guid>
		<description><![CDATA[Продукт по прежнему в статусе Alpha. Из нового поддержка IE RC1, множество исправлений и зум. У нас на AJAX приложениях с Alpha диалогами было много глюков в отрисовке под IE7, IE8.
Скачать: install-ietester-v0.3.exe
]]></description>
			<content:encoded><![CDATA[<p>Продукт по прежнему в статусе Alpha. Из <a href="http://www.my-debugbar.com/wiki/IETester/ChangeLog" target="_blank">нового</a> поддержка IE RC1, множество исправлений и зум. У нас на AJAX приложениях с Alpha диалогами было много глюков в отрисовке под IE7, IE8.</p>
<p>Скачать: <a href="http://www.my-debugbar.com/ietester/install-ietester-v0.3.exe" target="_blank">install-ietester-v0.3.exe</a></p>
]]></content:encoded>
			<wfw:commentRss>http://alsedi.com/blog/ietester-03/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firescope от Sitepoint</title>
		<link>http://alsedi.com/blog/firescope-ot-sitepoint/</link>
		<comments>http://alsedi.com/blog/firescope-ot-sitepoint/#comments</comments>
		<pubDate>Tue, 27 Jan 2009 11:09:59 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[QA]]></category>
		<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Разработка ПО]]></category>
		<category><![CDATA[firebug]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[firescope]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[opera]]></category>
		<category><![CDATA[safati]]></category>
		<category><![CDATA[sitepoint]]></category>
		<category><![CDATA[W3C]]></category>
		<category><![CDATA[совместимость]]></category>
		<category><![CDATA[тестирование]]></category>

		<guid isPermaLink="false">http://alsedi.com/blog/?p=265</guid>
		<description><![CDATA[Sitepoint анонсировали новую надстройку над Firebug &#8211; FireScope. Этот плагин позволяет получать справочную информацию по поддержке HTML элементов в разных браузерах. После установки плагин добавляет новую панель Reference в Firebug, в которой для каждого элемента в загруженной странице будет приведет список совместимости со стандартом W3C и с браузерами. Есть информация далеко не по всем браузерам:

Internet [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.sitepoint.com/blogs/2009/01/27/introducing-firescope-the-sitepoint-reference-tool-for-firebug/" target="_blank">Sitepoint анонсировали новую надстройку над Firebug &#8211; FireScope</a>. Этот плагин позволяет получать справочную информацию по поддержке HTML элементов в разных браузерах. После установки плагин добавляет новую панель Reference в Firebug, в которой для каждого элемента в загруженной странице будет приведет список совместимости со стандартом W3C и с браузерами. Есть информация далеко не по всем браузерам:</p>
<ul>
<li>Internet Explorer (5.5 &#8211; 7.0)</li>
<li>Firefox (1, 1.5, 2)</li>
<li>Safari (1.3, 2.0, 3)</li>
<li>Opera (9.2, 9.5)</li>
</ul>
<p>Так же плагин поддерживает поиск по элементам и атрибутам HTML и по свойствам CSS.</p>
<p>Домашняя страниц: <a href="http://tools.sitepoint.com/firescope" target="_blank">Firescope</a></p>
]]></content:encoded>
			<wfw:commentRss>http://alsedi.com/blog/firescope-ot-sitepoint/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Приёмочное тестирование (Acceptance testing) web-приложений с PHP</title>
		<link>http://alsedi.com/blog/priyomochnoe-testirovanie-acceptance-testing-web-prilozhenij-s-php/</link>
		<comments>http://alsedi.com/blog/priyomochnoe-testirovanie-acceptance-testing-web-prilozhenij-s-php/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 21:04:45 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[QA]]></category>
		<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Переводы]]></category>
		<category><![CDATA[Разработка ПО]]></category>
		<category><![CDATA[acceptance testing]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[functional testing]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[selenium core]]></category>
		<category><![CDATA[selenium rc]]></category>
		<category><![CDATA[unit testing]]></category>
		<category><![CDATA[браузер]]></category>
		<category><![CDATA[тестирование]]></category>

		<guid isPermaLink="false">http://alsedi.com/blog/?p=250</guid>
		<description><![CDATA[Перевод статьи padraic, с сайта ZEND Developer Zone. Статья была написана в середине 2007 года и некоторые ссылки на версии и пакеты могут быть не действительны. Примечания по поводу версий я добавлю прямо в тексте.
Некоторые моменты в переводе были для меня сложны и некоторые термины и определения переведены на русский дословно. При первом появлении для [...]]]></description>
			<content:encoded><![CDATA[<p>Перевод статьи <a href="http://devzone.zend.com/member/2912-padraic" target="blank">padraic</a>, с сайта <a href="http://devzone.zend.com/article/2242-Acceptance-Testing-of-Web-Applications-with-PHP" target="blank">ZEND Developer Zone</a>. Статья была написана в середине 2007 года и некоторые ссылки на версии и пакеты могут быть не действительны. Примечания по поводу версий я добавлю прямо в тексте.</p>
<p>Некоторые моменты в переводе были для меня сложны и некоторые термины и определения переведены на русский дословно. При первом появлении для каждого специального термина в скобках приводится его английский источник. Например, для User Stories я предпочитаю использовать перевод «пользовательские истории», поскольку в большинстве случаев это подходит лучше, чем «пользовательские рассказы» или «идеи пользователя».</p>
<p>Так же в некоторых случаях, когда трудно подобрать синоним, либо одно слово объясняется предложением, используется принятый за стандартный жаргон, например: логин – как сущность, так и как действие.<br />
<span id="more-250"></span></p>
<h1>Приёмочное тестирование (Acceptance testing) web-приложений с PHP</h1>
<h2>Введение</h2>
<p>В этой статье я расскажу  о приёмочном тестировании (также известного как &#8211; функциональное тестирование), кое-что большинство PHP программистов смогут использовать в своей повседненвной практике. Я уверен, что многие из нас хорошо знакомы с юнит тестированием (unit testing), и даже интеграционным тестированием (Integration Testing), где же эта «лишняя спица в колесе» появляется при тестировании веб-приложений при нашей растущей одержимости Web 2.0 и AJAX, и как она отличается от первых двух методов? Ниже я объясню это. Также я покажу, как сделать приёмочное испытание с использованием убийственного сочетания PHPUnit и Selenium.</p>
<h2>Зачем нужны приёмочные испытания?</h2>
<p>Приёмочные испытания позволяют определить работает ли приложение так, как ожидает клиент (тот, кто заказал приложение). Теперь о том, что это означает&#8230;</p>
<p>Иногда трудно понять, как использовать приёмочные тесты при тестировании. Некоторые люди видят их подозрительно похожими (если не идентичными) на интеграционное тестирование. Интеграционное тестирование другой уровень процесса тестирования, отличный от юнит тестирования, которое проверяет, что компоненты приложения работают так, как ожидалось. Как и в случае с юнит тестами, это тестирование, как правило, занимается проверкой мест изолированных от остального кода с помощью MOCK объектов, заглушек и специальных тестовых классов.</p>
<p>Главное отличие приёмочных тестов в том, что они довольно просты. Интеграционные тесты работают по аналогии с юнит тестами, но с целыми группами связанных классов. Акцент делается на концепции «группы». Мы не тестируем каждый класс в отдельности, как с юнит тестами, а тестируем группы классов, которые вместе создают желаемый результат. Интеграционные тесты, поэтому написаны для и пишутся самими программистами. С другой стороны, приёмочные тесты работают для всего приложения (без изоляции классов и компонентов), как правило, по отношению к интерфейсу пользователя (<em>прим. в данном случае имеется ввиду не только графический интерфейс, но и любой другой реализованный в виде запросов и видимых ответов</em>), не важно для браузеров или веб-служб. Они пишутся для обеспечения соответствия приложения целям определенных клиентом. По сути, клиент даже может отвечать за написание тестов!</p>
<p>Теперь мы знаем, что приёмочное тестирование является самостоятельной практикой, но зачем нам её использовать?</p>
<ol>
<li> Она отражает ожидания клиента (а не для разработчиков!);</li>
<li>Она оценивает, когда функциональность значимая для клиента закончена (знание о том, когда нужно остановиться);</li>
<li>Она гарантирует быстрое определение будущего поведения, которое отличается от ожидаемого (регрессионное тестирование);</li>
<li>Как любой хороший набор тестов она поддерживает рефакторинг в том же порядке, как юнит и интеграционные тесты.</li>
</ol>
<h2>О пользовательских историях (User Stories) и приёмочных тестах</h2>
<p>Для тех, кто практикует экстремальное программирование, приёмочные тесты обычно пишутся для того, чтобы установить, что соответствие &#8220;пользовательским историям&#8221; является полным и не отклоняется от них в течение разработки.</p>
<p>Пользовательские истории &#8211; это краткое описание заказчиком некоторых частей значимой функциональности приложения, то есть ожидаемое поведение, которое должны проверять при приёмочных тестах. В плане XP (<em>eXtreme Programming</em>) это заменяет традиционную зависимость от спецификации, которая описывает каждый шаг в развитии, за счет жесткости в исполнении, с более гибким подходом, где наборы пользовательских историй отслеживают текущие требования. Пользовательские истории ведутся с пониманием положения, что план любого релиза, основанного на них, может подвергаться частым изменениям.</p>
<p>Давайте кратко посмотрим на написание пользовательских историй.</p>
<blockquote><p>Клиент может авторизоваться на сайте.</p></blockquote>
<p>Как PHP разработчики некоторые из нас могут посчитать это тупым и очевидным требованием. Старайтесь не думать так. Для клиента это важная функция. Если предположить, что дальнейшие обсуждения с клиентом не вызовут никаких изменений в этой пользовательской истории, то мы можем написать приёмочные тесты еще до начала разработки. Этот процесс звучит похоже на юнит тестирование &#8211; сначала тесты, потом код (<em>прим. На самом деле не совсем так и тут сказывается то, что автор больше работал в условиях XP или TDD, в условиях многомодульных проектов следование такому правилу себе дороже</em>). Вы можете оценить успешность реализации, независимо от того, все ли предварительно написанные тесты успешно пройдены (в нашем случае для веб-интерфейса). Дальше, после обсуждения идей с программистами клиент написал следующие тесты.</p>
<ol>
<li>Страница авторизации отображает форму для входа;</li>
<li>Отправка правильного сочетания идентификатора пользователя и пароля приводит к успешной авторизации;</li>
<li>Отправка недействительной пары логин – пароль, показать регистрационную форму с указанием ошибок;</li>
<li>Форма для логина всегда сопровождается гиперссылкой &#8220;Забыли логин или пароль?&#8221;.</li>
</ol>
<p>Неплохо выглядит, не так ли? Эта четверка тестов уже вторая пользовательская история, дополнительные ценные знания о важной функциональности для клиента.</p>
<blockquote><p>Клиент может восстановить забытый логин и пароль</p></blockquote>
<p>Если каждый из четырех тестов проходит, мы можем считать, что обе пользовательских истории реализованы. Кроме того, при приёмочных тестах это явный сигнал, что пора прекратить разработку для этой функциональности. Если только клиент не придёт с новыми идеями (или уточнением существующих) нет причин расходовать ресурсы на неё. Это сделано! Вперёд!</p>
<h2>Итерации</h2>
<p>В нашей команде, несущейся в авангарде экстремального программирования, мы также занимаемся привязыванием пользовательских историй к конкретным &#8220;Итерациям (Iterations)&#8221;. Итерация, в общем смысле, это определенный период разработки, к концу которого у нас должна быть полностью протестированная, рабочая (хотя и неполная) версия приложения, которая будет проходить все приёмочные тесты для всех пользовательских историй, привязанных к этой итерации. Я уверен, что многие из вас сталкивались с итерационной разработкой. Итерация, как правило, длится не более нескольких недель. Учитывая, что проект может длиться несколько месяцев в плане разработки будет множество итераций, и каждая новая планируется на основе предыдущей.<br />
Возвращаясь к нашему примеру. Пользовательская история про авторизацию была записана в итерацию # 1. Уверенный, что пришло время для разработки, вы загружаете ваш любимый редактор и принимаетесь за воплощение идеи. Следующий шаг? Написать приёмочные тесты в виде автоматизированного тестирования там, где это возможно.</p>
<h2>Подготовка к приёмочному тестированию</h2>
<p>Требования:</p>
<ul>
<li>PHPUnit 3.0 <a href="http://www.phpunit.de">http://www.phpunit.de</a></li>
<li>Testing_Selenium<a href="http://pear.php.net/"> http://pear.php.net/</a></li>
<li>Java 5 (1.5.0) требуется для Selenium RC <a href="http://java.sun.com">http://java.sun.com</a></li>
<li>Selenium Remote Control (RC) <a href="http://openqa.org/">http://openqa.org/</a></li>
</ul>
<p>Многие PHP программисты стремятся использовать PHP библиотеки для написания приёмочных тестов, и это подход я использую здесь. В этой статье мы будем использовать PHPUnit, который с версии 3.0 содержит класс <strong>PHPUnit_Extensions_SeleniumTestCase</strong>, который может быть использован для определения приёмочных тестов и используется с Selenium Core при тестировании. Важно отметить, что эти тесты не являются юнит тестами. Да, PHPUnit это библиотеки для юнит тестирования, но они столь же эффективны для интеграционных и приёмочных тестов.</p>
<p>Руководство по использованию PHPUnit с Selenium можно почитать тут:  <a href="http://www.phpunit.de/pocket_guide/3.1/en/selenium.html">http://www.phpunit.de/pocket_guide/3.1/en/selenium.html</a>. Расширение PHPUnit для Selenium также потребует, установленного пакета PEAR Testing_Selenium. PHPUnit и Testing_Selenium могут быть взяты из PEAR (PHPUnit 3 доступен только через phpunit.de, руководство по установке тут <a href="http://www.phpunit.de/pocket_guide/3.1/">http://www.phpunit.de/pocket_guide/3.1/</a>).</p>
<p>Selenium это веб-приложение для приёмочного тестирования (	<em>прим. не совсем верно. Selenium это всё-таки функциональное тестирование, но может быть использован и для приёмочного</em>) веб-приложений, созданное ThoughtWorks. В него входит несколько пакетов приложений, включая Selenium Core, Selenium RC и Selenium IDE. Его цель состоит в том, чтобы запустить тесты в реальном браузере (со всеми тараканами и примочками!), используя Selenium Core для воспроизведения действия пользователя, их проверки и создания отчетов с результатами тестирования. Selenium Core написан на Javascript и содержит в себе &#8220;BrowserBot&#8221;. Selenium Remote Control &#8211; это дополнительный сервер, который потребуется для запуска тестов приведенных в этой статье. Он позволяет использовать любой язык программирования для взаимодействия с Selenium Core в браузере через посылку простых HTTP GET запросов на сервер RC. Все это звучит сложно, но работать с ним просто.</p>
<p>Обратите внимание, что прошло много времени с момента последнего релиза Selenium RC 0.9.0 (привет 2006 году),в этой статье я рекомендую использовать снапшот Selenium 0.9.2. Это необходимо, поскольку версия 0.9.0 не очень хорошо работает с последними версиями Firefox 2 и Internet Explorer 7 (<em>прим. последние релизы Selenium RC и Core были сделаны в январе 2009 (буквально вчера), поэтому плясать с бубном не нужно, но нет гарантий, что тесты из этой статьи заработают</em>). Из архива Selenium RC потребуется только один JAR файл с названием &#8220;selenium-server-standalone.jar&#8221;.</p>
<p>Базовая форма приёмочных тестов с применением PHPUnit и Selenium RC очень проста.</p>
<p><code>/** PHPUnit_Extensions_SeleniumTestCase */<br />
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';</code></p>
<p>class GoogleIndexTest extends PHPUnit_Extensions_SeleniumTestCase<br />
{<br />
protected function setUp()<br />
{<br />
/**<br />
* &#8216;*firefox&#8217; =&gt; Firefox 1 or 2<br />
* &#8216;*iexplore&#8217; =&gt; Internet Explorer (all)<br />
* &#8216;*custom /path/to/browser/binary =&gt; Любые другие браузеры (включая Firefox в Linux)<br />
* &#8216;*iehta&#8217; =&gt; экспериментальный встроенный IE<br />
* &#8216;*chrome&#8217; =&gt; Экспериментальный профайл для Firefox (не браузер Chrome)<br />
*/<br />
$this-&gt;setBrowser(&#8216;*firefox&#8217;);<br />
$this-&gt;setBrowserUrl(&#8216;http://www.google.ie/&#8217;); // сайт, который будем тестировать<br />
}</p>
<p>public function testTitle()<br />
{<br />
$this-&gt;open(&#8216;http://www.google.ie/&#8217;); // открыть дефолтную страницу<br />
$this-&gt;assertTitleEquals(&#8216;Google&#8217;); // проверить существует ли ожидаемый заголовок (title).<br />
}<br />
}</p>
<p>Метод SetUp ()используется для определения наших тестов, начнём тут с указания какой браузер использовать. Firefox – один из возможных вариантов. Если Selenium RC не содержит ссылка на ваш браузер вы можете использовать префикс &#8220;*custom&#8221; и путь до браузера. Функция setBrowserUrl () устанавливает основной URL для тестов. Обычно это главная (начальная) страница вашего приложения (например, index.php). Страница доступна для тестов, только когда она открыта (если это не очевидно). Поэтому тесты лучше начинать с открытия страницы с помощью функции open().</p>
<p>Selenium Core (Javascript BrowserBot) работает в окне браузера, что происходит достаточно просто понять после небольшой практики. Существует пять концепций, которые необходимо понять с самого начала:</p>
<ol>
<li>Действия (Actions, Selenium Actions)</li>
<li> Accessors</li>
<li> Assertions</li>
<li> Локатор элементов (Element Locators)</li>
<li> Шаблоны (Patterns)</li>
</ol>
<p>Действия просто все ожидаемые действия, которые могут манипулировать состоянием веб интерфейса. Действия включают в себя нажатие на ссылку, нажатие клавиш, позиционирование мыши (например, onmouseover) и так далее. Все, что пользователь может сделать, Selenium Actions могут сделать тоже. Многим действия может быть указано ожидать определенного состояния. Самым простым является суффикс &#8220;AndWait&#8221;, который можно прикрепить к действиям, например, clickAndWait(). Это указывает Selenium, что после нужно отправить запрос на веб сервер и дождаться ответа перед тем как продолжить. Из-за изворотливого характера Selenium RC я рекомендую вам избегать использования &#8220;WaitFor&#8221; (ужасно работает в версии 0.9 и снапшоте 0.9.2 (прим. в 1.0 вроде ничего так)) и использовать отдельный вызов &#8220;waitForPageToLoad()&#8221;, &#8211; мы рассмотрим это действие позже.</p>
<p>Accessors – отслеживание состояния. Они могут быть использованы для хранения значений в переменных для последующего использования или сравнения. Использование accessors может быть весьма полезно во многих случаях, но тут мы о них только упомянем.</p>
<p>Assertions так же, как и Accessors оценивают состояние. Но они также позволяют сравнить хранимое значение с ожидаемым. Есть два основных типа &#8220;assert (прим. упрощая – это жесткое сравнение – хоть тресни, а должно быть)&#8221; и &#8220;verify (проверить)&#8221;. В Selenium Core неравенство при assert приведет к окончанию теста, в то время как неравенство при сравнении приведет только к записи в лог.<br />
Чтобы получить информативный результат теста, попробуйте использовать методы assert только при крайней необходимости, где неравенство или несоответствие делает продолжение теста бессмысленным.</p>
<p>NB: При тестировании AJAX веб-интерфейсов &#8220;WaitFor&#8221; методы чрезвычайно удобны для определения того, когда AJAX манипулирует с DOM, после чего вы можете использовать обычные verify / assert. Лучше всего в таких случаях функция waitForCondition(), которая использует Javascript выражения, делающие проверки, в цикле или в течение определенного времени.</p>
<p>Полный список возможных действий, Accessors и Assertions существующих в Selenium Core тут:  <a href="http://www.openqa.org/selenium-core/reference.html">http://www.openqa.org/selenium-core/reference.html</a>. Список большой, так что при тестировании можно долго развлекаться.</p>
<p>Два последних понятия это локатор элементов и шаблоны. Локатор – это метода для поиска элементов HTML/XML для тестирования. Selenium Core поддерживает поиск с помощью идентификатора и имени элемента, выражений Javascript DOM, XPath, CSS селекторов, и текста ссылки.</p>
<p>Шаблоны это методы для определения текста для поиска. По умолчанию используется метод &#8220;glob&#8221; (например, «*»/«?»). Также можно использовать точный поиск (полное совпадение). Ну, и где бы мы были без &#8220;регулярного выражения&#8221;! Несколько примеров я приведу позже.</p>
<h2>Реализация пользовательских историй (или &#8211; вот одна из подготовленных ранее)</h2>
<p>Чтобы не уходить в сторону от темы, будем считать, что пользовательские истории уже реализованы в коде. Необходимо скачать и установить локальную копию. Код написан с использованием Zend Framework), и уже протестирован с PHPUnit и Slenium.<br />
<a href="http://downloads.astrumfutura.org/devzone/Acceptance_Testing_Tutorial_Application.tar.bz2">http://downloads.astrumfutura.org/devzone/Acceptance_Testing_Tutorial_Application.tar.bz2</a> (<em>прим. файл доступен</em>)</p>
<p>Для установки, просто импортируйте /INSTALL.sql в базу данных, скопируйте файл <strong>/src/config/config.ini.dist</strong> в <strong>/src/config.ini</strong> и поменяйте настройки под ваше окружение, тоже самое сделайте для <strong>/tests/TestConfiguration.php</strong>. В этом конфигурационном файле, вы можете изменить значение TESTS_SELENIUM_BROWSER на любой другой вариант (список выше в примере). Baseurl также должен быть изменен и указывать на наше приложение в /WWW каталоге.</p>
<p>Что еще? Предположим, что установка была в корень сайте: зайдите на http://localhost/www/. Вы можете запустить все тесты, которые мы напишем ниже, они расположены тут: http://localhost/tests/AllTests.php</p>
<h2>Написание  и проведение приёмочных испытаний</h2>
<p>Приступим к делу. Я уверен, что достаточно теории на этот момент! Итак, какой был первый приёмочный тест поставленный клиентом?</p>
<h3>1. Страница авторизации отображает форму для входа</h3>
<p>Наша форма для авторизации находится по адресу “/login” главного файла приложения. Это тот самый URL который нужно открыть в Selenium Core. Во-вторых, наш тест должен проверять наличие регистрационной формы на странице. Мы уже (см. <strong>/src/default/views/scripts/login_index.phtml</strong>) обозначили форму для входа, и установили уникальный идентификатор &#8220;login-form&#8221;, по которому мы можем её найти. Также мы уже знаем (из того же шаблона), что должны существовать два поля с идентификаторами &#8220;identity&#8221; и &#8220;password&#8221;. Для расширения кругозора мы будем использовать разные шаблоны в локаторе элементов</p>
<p><code>/** PHPUnit_Extensions_SeleniumTestCase */<br />
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';</code></p>
<p>class LoginIndexTest extends PHPUnit_Extensions_SeleniumTestCase<br />
{<br />
protected function setUp()<br />
{<br />
$this-&gt;setBrowser(&#8216;*firefox&#8217;); // или *iexplore для IE<br />
$this-&gt;setBrowserUrl(&#8216;http://localhost/&#8217;);<br />
}</p>
<p>public function testLoginFormExists()<br />
{<br />
$this-&gt;open(&#8216;http://localhost/login&#8217;);</p>
<p>$this-&gt;assertElementPresent(&#8220;id=login-form&#8221;);<br />
$this-&gt;assertElementPresent(&#8220;dom=document.forms['login-form'].identity&#8221;);<br />
$this-&gt;assertElementPresent(&#8220;dom=document.forms['login-form'].password&#8221;);<br />
$this-&gt;assertElementPresent(&#8220;xpath=//form[@id='login-form']/input[@type='submit']&#8220;);<br />
}<br />
}</p>
<p>Если вы скачали готовое приложение, то уже, вероятно запускали этот тест. Полный тест файл находится в файле /tests/AcceptanceTests/UserLoginTest.php. Возможно, вы уже догадываетесь, что добавление браузера и URL напрямую в код приведет к постоянным изменениям – поэтому в этих тестах используется набор констант из файла /tests/TestConfiguration.php.dist.</p>
<p>В примере выше встречается функция assertElementPresent(). Это проверка на наличие определенных элементов HTML / XML. Аргументом является строка, где тип локатора указывается слева от знака равно, а аргумент справа. Я использовал три различных типа. ID проверяет существование  элемента с ID равным &#8220;login-form&#8221;. Наличие двух полей ввода проверяется с помощью выражений Javascript DOM. Наличие кнопки проверяется с помощью XPath.</p>
<p>Достаточно ли этих тестов? Существует риск, что если мы будем делать тесты слишком конкретизированными, то потом потребуется много времени на их редактирование при изменении интерфейса. Тем не менее, кое что еще должно быть проверено. Например, совпадает ли максимальная длина поля (maxlength) с длиной поля VARCHAR в базе данных или превышает его?</p>
<p><code>$this-&gt;assertElementPresent("xpath=//input[@id='identity' and @maxlength='20']");<br />
$this-&gt;assertElementPresent("xpath=//input[@id='password' and @maxlength='64']");<br />
</code></p>
<h3>2. Отправка правильного сочетания идентификатора пользователя и пароля приводит к успешной авторизации.</h3>
<p>Теперь мы добавим тест, который будет отправлять валидные данные пользователя и проверять появилось ли сообщение, определенное в темплейте (см. темлейт login_index.phtml)<br />
<code><br />
public function testValidAuthentication()<br />
{<br />
$this-&gt;open('http://localhost/login');</code></p>
<p>// заполняем форму<br />
$this-&gt;type(&#8220;dom=document.forms['login-form'].identity&#8221;, &#8216;Padraic&#8217;);<br />
$this-&gt;type(&#8220;dom=document.forms['login-form'].password&#8221;, &#8216;KSkjduj$!hjj*927&#8242;);</p>
<p>// отправляем данные<br />
$this-&gt;click(&#8220;xpath=//form[@id='login-form']/input[@type='submit']&#8220;);<br />
$this-&gt;waitForPageToLoad(30000); // 30 секунд по умолчанию</p>
<p>// проверяем сообщение<br />
$this-&gt;assertTextPresent(&#8216;exact:Welcome, Padraic&#8217;);</p>
<p>// проверяем, что нет сообщений об ошибке<br />
$this-&gt;assertTextNotPresent(&#8216;*invalid*&#8217;);<br />
}</p>
<p>В примере виден ряд новых действий (action) и assertion методов. Первый type().type() имитирует ввод данные пользователем в текстовое поле, и мы используем его здесь, чтобы Selenium Core заполнил регистрационную форму. Действие click() определяет элемент для которого Selenium Core смоделирует нажатие (есть также метод submit() который можно использовать вместо click()). Дополнительный метод waitForPageToLoad() указывает Selenium, что после запроса будет ответ с сервера, и он должен ждать ответа перед тем, как продолжить. Оба PHPUnit и Selenium поддерживают метод clickAndWait(), который объединяет методы click() и waitForPageToLoad(). На момент написания статьи этот метод не работал, видимо будет в «следующем релизе», ну что же подождем и посмотрим…</p>
<p>Также в примере представлены методы assertTextPresent() и assertTextNotPresent(). Оба метода содержат шаблоны. Если вы вспомните, шаблоны используются для поиска текста на странице, используя различные методы, включая поиск glod, регулярные выражения и точное соответствие. В примере используется точное соответствие. Если вы не определите тип шаблона, по умолчанию будет использован &#8220;glob&#8221;. Хотя это и не плохо, вы, возможно, промахнетесь при поиске строк, которые содержат элементы glob &#8211; звездочка или знак вопроса.</p>
<h3>3. Она гарантирует быстрое определение будущего поведения, которое отличается от ожидаемого (регрессионное тестирование)</h3>
<p><code><br />
public function testInvalidAuthenticationWithError()<br />
{<br />
$this-&gt;open('http://localhost/login');</code></p>
<p>// заполняем<br />
$this-&gt;type(&#8220;dom=document.forms['login-form'].identity&#8221;, &#8216;Maugrim&#8217;);<br />
$this-&gt;type(&#8220;dom=document.forms['login-form'].password&#8221;, &#8216;badpass&#8217;);</p>
<p>// отсылаем<br />
$this-&gt;click(&#8220;xpath=//form[@id='login-form']/input[@type='submit']&#8220;);<br />
$this-&gt;waitForPageToLoad(30000); // 30 secs</p>
<p>// проверяем, что логин не прошел<br />
$this-&gt;assertTextNotPresent(&#8216;regexp=Welcome,[a-zA-Z0-9 -_aouieAOUIE]&#8216;);</p>
<p>// проверяем, что ошибка появилась на странице<br />
$this-&gt;assertTextPresent(&#8216;*invalid*&#8217;);<br />
}</p>
<p>Ничего нового здесь не появилось, за исключением использования регулярного выражения поскольку текст ошибки может содержать любое валидное имя пользователя. Поэтому мы подходим широко и отсекаем любые правильные логины. Это будет означать, что регулярное выражение соответствует насколько это возможно (или чуть шире) логике в нашем приложении.<br />
И наконец, четвертый тест!</p>
<h3>4. Форма для логина всегда сопровождается гиперссылкой &#8220;Забыли логин или пароль?&#8221;.</h3>
<p>Это больше изменение теста testLoginFormExists, чем новый тест. Мы просто добавим следующее:<br />
[code]<br />
public function testLoginFormExists()<br />
{<br />
//  ...</p>
<p>// проверяем существует ли ссылка<br />
$this-&gt;assertElementPresent('link=regexp:^Forgot identity or password?$');<br />
}<br />
[/code]</p>
<p>Когда мы соберем этим тесты вместе, мы, наконец, получи приёмочные тесты достаточные, чтобы сказать, что пользовательская история была реализована и работает. Это, скорее всего, минимальный тесты, так как мы не включили тесты, ориентированные на разработчиков, таких как проверка maxlength, чтобы они соответствовали нашей базе данных, но пока этого достаточно.</p>
<h2>Как запускать тесты?</h2>
<h3>1. Запуск сервера Selenium RC</h3>
<p><code>java -jar selenium-server-standalone.jar</code></p>
<p>Перед запуском нужно убедиться, что пути до выбранного браузера и Java добавлены в переменную PATH.</p>
<h3>2. Запустите файл AllTests.php из каталога /test в браузере.</h3>
<p>Если все пойдет хорошо, вы увидите, как трижды браузер открылся и закрылся (можно использовать опцию прокси в Selenium RC, чтобы использовать один и тот же браузер), и результаты будут показаны в браузере.</p>
<h2>Заключение</h2>
<p>Приёмочное тестирование – это ценная обучающая практика. При оценке как приложение работает против набора тестовых ожиданий мы можем оценить завершенность продукта в целом и попадание в сроки разработки. При отсутствии приёмочного тестирования у нас нет уверенности, и придется тратить больше времени на ручное тестирование приложений. Ручное тестирования требует гораздо больше времени, и оно в меньшей степени, охватывает все потенциальные проблемы. Кроме того, интеграционные и юнит тесты не являются заменой приёмочным. Приёмочные тесты – это просто, и требуют совсем немного практики, чтобы начать работу. Я надеюсь, что эта статья поможет вам на этом поприще!</p>
]]></content:encoded>
			<wfw:commentRss>http://alsedi.com/blog/priyomochnoe-testirovanie-acceptance-testing-web-prilozhenij-s-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IETester</title>
		<link>http://alsedi.com/blog/ietester/</link>
		<comments>http://alsedi.com/blog/ietester/#comments</comments>
		<pubDate>Sun, 21 Dec 2008 17:39:29 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[IETester]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[браузер]]></category>
		<category><![CDATA[тестирование]]></category>
		<category><![CDATA[эмуляция]]></category>

		<guid isPermaLink="false">http://alsedi.com/blog/?p=210</guid>
		<description><![CDATA[Эмулятор IE8 beta 2, IE7 IE 6 и IE 5.5, работающий под XP и Vista. На сайте доступна альфа версия, которая работает достаточно стабильно, но сам по себе инструмент очень полезен.
Сайт: Debug Bar
Ссылка на скачивание: install-ietester-v0.2.3.exe
]]></description>
			<content:encoded><![CDATA[<p>Эмулятор IE8 beta 2, IE7 IE 6 и IE 5.5, работающий под XP и Vista. На сайте доступна альфа версия, которая работает достаточно стабильно, но сам по себе инструмент очень полезен.</p>
<p>Сайт: <a href="http://www.my-debugbar.com/wiki/IETester/HomePage">Debug Bar</a><br />
Ссылка на скачивание: <a href="http://www.my-debugbar.com/ietester/install-ietester-v0.2.3.exe">install-ietester-v0.2.3.exe</a></p>
]]></content:encoded>
			<wfw:commentRss>http://alsedi.com/blog/ietester/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
