<?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/development/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>SQA Days в контексте SECR</title>
		<link>http://alsedi.com/blog/sqa-days-v-kontekste-secr/</link>
		<comments>http://alsedi.com/blog/sqa-days-v-kontekste-secr/#comments</comments>
		<pubDate>Wed, 19 Aug 2009 15:32:19 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[QA]]></category>
		<category><![CDATA[Разработка ПО]]></category>
		<category><![CDATA[События]]></category>
		<category><![CDATA[google chrome]]></category>
		<category><![CDATA[secr]]></category>
		<category><![CDATA[sqadays]]></category>
		<category><![CDATA[конференция]]></category>

		<guid isPermaLink="false">http://alsedi.com/blog/?p=450</guid>
		<description><![CDATA[Обычно специализированные конференции проходят не чаще, чем раз в год. Причины известны &#8211; интерес к конференции, финансы слушателей и спонсоров и новые неокрепшие умы, которые пьянеют просто от осознания, что они находятся в &#8220;тусовке&#8221;. Также важно и то, что подготовка может занять до полугода времени у организаторов (с учётом поиска спонсоров и известных докладчиков).
Но если [...]]]></description>
			<content:encoded><![CDATA[<p>Обычно <strong>специализированные конференции</strong> проходят не чаще, чем раз в год. Причины известны &#8211; интерес к конференции, финансы слушателей и спонсоров и <strong>новые неокрепшие умы</strong>, которые пьянеют просто от осознания, что они находятся в &#8220;тусовке&#8221;. Также важно и то, что подготовка может занять до полугода времени у организаторов (с учётом поиска спонсоров и известных докладчиков).</p>
<p>Но если взять конференцию, которая может быть не столько интересна в данный момент (поскольку недавно уже проходила), да встроить её в контекст другой известной конференции, то получится может очень даже удачно. Ведь при построении коммерции на образовании главное это не знания, а иллюзия удовлетворённости у посетителя. Я надеюсь, что в случае с <a href="http://it-conf.ru/ru/content/190.htm" target="_blank">SQA Days</a> всё-таки будет не так пессимистично, как я себе представил, потому что планирую её посетить. Но как бы там ни было, вторая конференция за этот год пройдёт в рамках <a href="http://cee-secr.org/" target="_blank">SECR 2009</a>.</p>
<p>Конкретно о самих конференциях пока ничего сказать невозможно, потому что программы конференций не готовы. Известно только, что на SECR будут выступать <a href="http://cee-secr.org/keynotes/bak/" target="_blank">Ларс Бак</a> (Google Chrome), <a href="http://cee-secr.org/keynotes/booch/" target="_blank">Гради Буч</a> (похоже, что физически на конференции его не будет) и <a href="http://cee-secr.org/keynotes/gurevich/" target="_blank">Юрий Гуревич</a> (Microsoft).</p>
<p>Интересно еще и то, что в отличии от бывших конференций <a href="http://pavel.rogozhin.ru/?p=131" target="_blank">Профиклаб</a> (не ручаюсь, что всех) выступления не будут транслироваться бесплатно через интернет, более того, даже за деньги будет доступна только основная секция конференции.</p>
<p><strong>Основные даты конференции:</strong></p>
<p><strong>30 Июня:</strong> завершение приема докладов<br />
<strong>31 Июля:</strong> завершение предварительной регистрации<br />
<strong>1 Сентября:</strong> уведомление авторов принятых докладов<br />
<strong>15 Сентября:</strong> завершение регистрации участников<br />
<strong>1 Октября:</strong> завершение приема окончательных версий докладов<br />
<strong>28-29 Октября: </strong>конференция</p>
]]></content:encoded>
			<wfw:commentRss>http://alsedi.com/blog/sqa-days-v-kontekste-secr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Business Needs</title>
		<link>http://alsedi.com/blog/business-needs/</link>
		<comments>http://alsedi.com/blog/business-needs/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 21:31:31 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[QA]]></category>
		<category><![CDATA[Разработка ПО]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[business needs]]></category>
		<category><![CDATA[процессы]]></category>

		<guid isPermaLink="false">http://alsedi.com/blog/?p=391</guid>
		<description><![CDATA[Это то, что совершенно бестактно рушит всю стройность любого Agile метода. Потому что Business Need это не придурь заказчика, а жестокая необходимость. И если не сделать так, то после уже не для кого будет делать что-либо.
Я не противнки итерационных методов, но и не считаю возможным их применение в широком спектре случаев. Впрочем я и не [...]]]></description>
			<content:encoded><![CDATA[<p>Это то, что совершенно бестактно рушит всю стройность любого Agile метода. Потому что Business Need это не придурь заказчика, а жестокая необходимость. И если не сделать так, то после уже не для кого будет делать что-либо.</p>
<p>Я не противнки итерационных методов, но и не считаю возможным их применение в широком спектре случаев. Впрочем я и не настолько хорошо знаю Agile, как Асхат Урузбаев. Зато точно знаю, что Agile будет жить в компании только в том случае, если этого хочет её хозяин. А захочет он этого только если всё будет спокойно в бизнесе и станет интересно за что наёмные рабочие получают зарпалату, либо если бизнес планируется сделать публичным (читать приятным для инвесторов и заказчиков) или продать. В других случаях итерационный процесс всегда привязан к Business Needs и заканчивается и начинается именно с них.</p>
]]></content:encoded>
			<wfw:commentRss>http://alsedi.com/blog/business-needs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Opera представила новый движок для JavaScript &#8211; Carakan</title>
		<link>http://alsedi.com/blog/opera-predstavila-novyj-dvizhok-dlya-javascript-carakan/</link>
		<comments>http://alsedi.com/blog/opera-predstavila-novyj-dvizhok-dlya-javascript-carakan/#comments</comments>
		<pubDate>Sat, 07 Feb 2009 21:26:32 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[QA]]></category>
		<category><![CDATA[Разработка ПО]]></category>
		<category><![CDATA[События]]></category>
		<category><![CDATA[bytecode]]></category>
		<category><![CDATA[carakan]]></category>
		<category><![CDATA[ECMAScript]]></category>
		<category><![CDATA[java script]]></category>
		<category><![CDATA[opera]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[Presto]]></category>
		<category><![CDATA[браузер]]></category>
		<category><![CDATA[производительность]]></category>

		<guid isPermaLink="false">http://alsedi.com/blog/?p=274</guid>
		<description><![CDATA[Эта новость начинает распространяться потихоньку,  что странно, в условиях взрывного развития веб приложений с большим количеством JavaScript. Так теперь важным критерием оценки браузера становится не только то как он соответствует стандартам W3C, работает с CSS, DOM, но и насколько быстро он работает с JavaScript. Последним в эту &#8220;войну&#8221; вступил Google с V8, ну а теперь [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Carakan" href="http://my.opera.com/core/blog/2009/02/04/carakan" target="_blank">Эта новость</a> начинает распространяться потихоньку,  что странно, в условиях взрывного развития веб приложений с большим количеством JavaScript. Так теперь важным критерием оценки браузера становится не только то как он соответствует стандартам W3C, работает с CSS, DOM, но и насколько быстро он работает с JavaScript. Последним в эту &#8220;войну&#8221; вступил Google с V8, ну а теперь Opera собирается обновить свой движок. Хотя не очень понятно, как это может помочь увеличить их долю рынка. Но тем не менее.</p>
<p>Для начала стоит посмотреть назад в недалёкое прошлое, когда Opera выпустила движок Futhark, входящий в соств <a href="http://en.wikipedia.org/wiki/Presto_(layout_engine)" target="_blank">Presto </a>(2003 год). На тот момент он был самым быстрым на рынке, хотя никто особо не придавал значения этому языку. Сравнения по производительности стоит посмотреть в статье <a href="http://ejohn.org/blog/javascript-performance-rundown/" target="_blank">JavaScript Performance Rundown</a> Джона Ресига (John Resig). Джон получил интересные результаты из которых видно, что сейчас движок браузера Opera не блещет. В отличие от него Carakan построен на других принципах и обещает быть не только быстрым, но и экономичным. Для этого уже сделано следующее:</p>
<p>1. Принцип обработка в стеке заменен на обработку в регистрах (ничего общего с регистрами процессора). Фактически, сейчас инструкции псевдокода JS забирают значения из стека и помещают их обратно после обработки, доступ идет только к верхнему элементу, что сказывается на производительности. В Carakan динамечный стек со значениями заменен на фиксированный блок значений и инструкции псевдокода могут обращаться к любой ячейке.</p>
<p>2. Генерация нативного кода. Это, как я понял, попытка решить проблемы с арифметикой за счет расширения стандартных возможностей ECMAScript. Пока еще ведуться работы для ARM, для x86 (32 и 64 бита) уже всё готово.</p>
<p>3. Автоматическая классификация объектов. Смысл в том, что на уровне движка создаётся виртуальное наследование при котором каждому базовому объекту из ECMAScript приписывается класс, описывающий его. Дальше во время жизни и модификации объектов движок классифицирует их по первичным прототипам (тем самым объектам из ECMAScript). В результате это позволяет использовать меньше памяти (как то очень уж это оптимистично) и при поиске объектов кешировать результаты. Если это будет реализовано добротно, то производительность Carakan в Cloud Apps будет действительно потрясающая.</p>
<p>Дженс Линдсром (Jens Lindström) пишет, что даже без нативной генерации кода скорость Carakan в два с половиной раза больше, чем последняя версия Presto по тесту SunSpider. А вот при включении нативной генерации скорость может быть выше в 5 или 50 раз (или 500, почему бы нет?). Но обещать что либо еще слишком рано.</p>
]]></content:encoded>
			<wfw:commentRss>http://alsedi.com/blog/opera-predstavila-novyj-dvizhok-dlya-javascript-carakan/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>25 самых опасных ошибок программирования</title>
		<link>http://alsedi.com/blog/25-samyx-opasnyx-oshibok-programmirovaniya/</link>
		<comments>http://alsedi.com/blog/25-samyx-opasnyx-oshibok-programmirovaniya/#comments</comments>
		<pubDate>Wed, 21 Jan 2009 21:24:35 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[QA]]></category>
		<category><![CDATA[Разработка ПО]]></category>
		<category><![CDATA[cwe]]></category>
		<category><![CDATA[top25]]></category>
		<category><![CDATA[ошибки]]></category>
		<category><![CDATA[тестирование]]></category>

		<guid isPermaLink="false">http://alsedi.com/blog/?p=262</guid>
		<description><![CDATA[На сайте BBC уже больше недели живёт статья со списком из двадцатипяти наиболее опасных ошибок программирования по версии института SANS. Только две из них привели к нарушениям в безопасности более 1.5 миллионов сайтов.
Сами описания ошибок можно посмотреть на сайте сообщеста Common Weakness Enumeration.
]]></description>
			<content:encoded><![CDATA[<p>На сайте <a href="http://news.bbc.co.uk" target="_blank">BBC </a>уже больше недели живёт <a href="http://news.bbc.co.uk/1/hi/technology/7824939.stm" target="_blank">статья со списком из двадцатипяти наиболее опасных ошибок программирования</a> по версии <a href="http://www.sans.edu/" target="_blank">института SANS</a>. Только две из них привели к нарушениям в безопасности более 1.5 миллионов сайтов.</p>
<p>Сами описания ошибок можно посмотреть на сайте сообщеста <a href="http://cwe.mitre.org/top25/" target="_blank">Common Weakness Enumeration</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://alsedi.com/blog/25-samyx-opasnyx-oshibok-programmirovaniya/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>The Woork Handbook</title>
		<link>http://alsedi.com/blog/the-woork-handbook/</link>
		<comments>http://alsedi.com/blog/the-woork-handbook/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 20:34:23 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Разработка ПО]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[Antonio Lupetti]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[handbook]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[web 2.0]]></category>
		<category><![CDATA[woork]]></category>
		<category><![CDATA[Антонио Люпетти]]></category>
		<category><![CDATA[руководство]]></category>

		<guid isPermaLink="false">http://alsedi.com/blog/?p=241</guid>
		<description><![CDATA[


Антонио Люпетти (Antonio Lupetti) в своём блоге опубликовал книгу &#8211; причёсанный сборник собственных записей по CSS, JS, веб разработке и приёмах для веб. Первая версия книги доступна для скачивания бесплатно.

Хорошо, друзья &#8230; Наконец то предварительная версия &#8220;Руководства Woork&#8217;a&#8221; готова. Эта книга &#8211; сборник статей, которые я записал в блог в прошлом году. За год &#8220;Woork&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://woork.blogspot.com/2009/01/woork-handbook.html" target="blank"><br />
<img src="http://www.alsedi.com/blog/wp-content/upload/twhand.png" /><br />
</a></p>
<p>Антонио Люпетти (Antonio Lupetti) в своём блоге опубликовал книгу &#8211; причёсанный сборник собственных записей по CSS, JS, веб разработке и приёмах для веб. Первая версия книги доступна для скачивания бесплатно.</p>
<blockquote><p>
Хорошо, друзья &#8230; Наконец то предварительная версия &#8220;Руководства Woork&#8217;a&#8221; готова. Эта книга &#8211; сборник статей, которые я записал в блог в прошлом году. За год &#8220;Woork&#8221; посетили более 4 миллионов зрителей, и я получил много запросов на распространение печатной версии статей из блога. В течение последних дней я работал над подготовкой первого варианта этого руководства, и вы можете взять его бесплатно.</p>
<hr />
Ok friends&#8230; finally a first preview of &#8220;The Woork Handbook&#8221; is ready to be released. This book is a miscellanea of articles I wrote on my blog in the past year. During the period form January to December 2008 “Woork” has been visited from over 4 millions visitors and I received a lot of requests to distribute a printable version of its contents. In the past days I worked hard to prepare a first version of this handbook and distribute it for free.<br />
-Antonio
</p></blockquote>
<p>Эта книга будет полезна, для освоения многих современных техник и приемов веб программирования. В пояснениях к коду в книге Антонио доступно объясняет как будет представлены разные HTML блоки и как будут меняться их свойства в зависимости от CSS. Что на мой взгляд куда правильнее, чем голая теория по HTML.</p>
<p>Скачать книгу можно тут: <a href="http://woork.blogspot.com/2009/01/woork-handbook.html" target="blank">The Woork Handbook</a></p>
]]></content:encoded>
			<wfw:commentRss>http://alsedi.com/blog/the-woork-handbook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JVM &#8220;-server&#8221; против &#8220;-client&#8221;</title>
		<link>http://alsedi.com/blog/jvm-server-protiv-client/</link>
		<comments>http://alsedi.com/blog/jvm-server-protiv-client/#comments</comments>
		<pubDate>Fri, 26 Dec 2008 11:36:29 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[QA]]></category>
		<category><![CDATA[Разработка ПО]]></category>
		<category><![CDATA[-client]]></category>
		<category><![CDATA[-server]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jit]]></category>
		<category><![CDATA[jvm]]></category>
		<category><![CDATA[tips&tricks]]></category>

		<guid isPermaLink="false">http://alsedi.com/blog/?p=215</guid>
		<description><![CDATA[Очень интересный трюк рассказал сегодня один из разработчиков. JVM можно запустить с двумя разными опциями -client и -server. При первом старте приложения (Java EE) увидели, что при использовании опции -client производительность вырастает вдвое, а использование памяти ниже. 
Начали копать глубже и оказалось, что с таким поведением сталкнулись не только мы. Причина очень проста. При запуске [...]]]></description>
			<content:encoded><![CDATA[<p>Очень интересный трюк рассказал сегодня один из разработчиков. JVM можно запустить с двумя разными опциями <strong>-client</strong> и <strong>-server</strong>. При первом старте приложения (Java EE) увидели, что при использовании опции <strong>-client</strong> производительность вырастает вдвое, а использование памяти ниже. </p>
<p>Начали копать глубже и оказалось, что с таким поведением сталкнулись не только мы. Причина очень проста. При запуске с параметром <strong>-client</strong> JVM использует JIT compiler (от Apple) и компилирует классы без оптимизации и профайлинга, а при параемтре <strong>-server</strong> сначала запускается как интерпритатор и за несколько итераций собирает неободимые профайлы для классов и только потом компилирует их. </p>
<p>Поэтому использовать опцию -server при разработке не стоит, лучше запускать с <strong>-client</strong>. Так же имеет смысле просчитать сколько времени и при какой нагрузке &#8220;прогревается&#8221; приложение и в зависимости от результатов оставить всё как есть, либо добавить в код функции, которые позволят пройти этап сбора профайлов быстрее. </p>
<p>Tip #1: JBoss насильно добавляет параметр <strong>-server</strong> в конфиг.</p>
<p><strong>UPD:</strong><br />
Поговорил еще и оказалось, что практики разработки с опцией -client, и дальнейшее использование с -server не существует (то есть то, что я предложил выше ерунда). Более того, JIT был в версии 1.3. Используется ли сейчас хотспот вместо него я не уверен, но вероятно.</p>
]]></content:encoded>
			<wfw:commentRss>http://alsedi.com/blog/jvm-server-protiv-client/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Browser Security Handbook</title>
		<link>http://alsedi.com/blog/browser-security-handbook/</link>
		<comments>http://alsedi.com/blog/browser-security-handbook/#comments</comments>
		<pubDate>Thu, 18 Dec 2008 13:40:06 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[QA]]></category>
		<category><![CDATA[Разработка ПО]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[браузер]]></category>
		<category><![CDATA[документация]]></category>
		<category><![CDATA[книга]]></category>

		<guid isPermaLink="false">http://alsedi.com/blog/?p=198</guid>
		<description><![CDATA[На Google Code обновилась книга о безопасности браузеров &#8211; Browser Security Handbook, которая весьма полезна для разработчиков, как-либо связанных с Web.
This document is meant to provide web application developers, browser engineers, and information security researchers with a one-stop reference to key security properties of contemporary web browsers. Insufficient understanding of these often poorly-documented characteristics is [...]]]></description>
			<content:encoded><![CDATA[<p>На <a href="http://code.google.com">Google Code</a> обновилась книга о безопасности браузеров &#8211; <a href="http://code.google.com/p/browsersec/wiki/Main">Browser Security Handbook</a>, которая весьма полезна для разработчиков, как-либо связанных с Web.</p>
<blockquote><p>This document is meant to provide web application developers, browser engineers, and information security researchers with a one-stop reference to key security properties of contemporary web browsers. Insufficient understanding of these often poorly-documented characteristics is a major contributing factor to the prevalence of several classes of security vulnerabilities. </p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://alsedi.com/blog/browser-security-handbook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Тезисы по конференции РИТ: Клиентские Технологии</title>
		<link>http://alsedi.com/blog/tezisy-po-konferencii-rit-klientskie-texnologii/</link>
		<comments>http://alsedi.com/blog/tezisy-po-konferencii-rit-klientskie-texnologii/#comments</comments>
		<pubDate>Thu, 30 Oct 2008 16:30:39 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[Разработка ПО]]></category>
		<category><![CDATA[События]]></category>
		<category><![CDATA[клиентские технологии]]></category>
		<category><![CDATA[конференция]]></category>
		<category><![CDATA[РИТ]]></category>
		<category><![CDATA[тезисы]]></category>

		<guid isPermaLink="false">http://alsedi.com/blog/?p=135</guid>
		<description><![CDATA[Уже появились тезисы первых докладов на конференции по клиентским технологиям. Доклады выглядят весьма интересными, да и депелоперы из PHP группы уже поинтересовались у меня есть ли возможность попасть на эту конференцию.
Список тезисов с описанием (есть и без него, но, то что они появились более чем за месяц до конференции уже прогресс):
Вёрстка не для роботов / [...]]]></description>
			<content:encoded><![CDATA[<p>Уже появились тезисы первых докладов на конференции по клиентским технологиям. Доклады выглядят весьма интересными, да и депелоперы из PHP группы уже поинтересовались у меня есть ли возможность попасть на эту конференцию.</p>
<p>Список тезисов с описанием (есть и без него, но, то что они появились более чем за месяц до конференции уже прогресс):</p>
<blockquote><p><a href="http://www.clienttech.ru/thesis/322/14302">Вёрстка не для роботов / Роман Комаров</a></p>
<p><a href="http://www.clienttech.ru/thesis/322/14300">С ножом против паровоза / Вадим Макеев</a></p>
<p><a href="http://www.clienttech.ru/thesis/322/14297">Процесс деплоймента вёрстки – просто, быстро, безопасно / Евгения Фирсова</a></p>
<p><a href="http://www.clienttech.ru/thesis/322/14284">data:URL как альтернатива CSS Sprites / Николай Мациевский</a></p>
<p><a href="http://www.clienttech.ru/thesis/322/14282">Стадии загрузки страницы и методы их оптимизации / Николай Мациевский </a></p>
<p><a href="http://www.clienttech.ru/thesis/322/14280">Механизм разработки приложений для платформ Adobe Flash 8,9 а так же платформы Adobe AIR с единым исходным кодом / Николай Артамонов</a></p>
<p><a href="http://www.clienttech.ru/thesis/322/14278">Создание казуальных компьютерных игр в вебе: Технологии Popfly Game Creator и Silverlight 2  / Евгений Марченков</a></p>
<p><a href="http://www.clienttech.ru/thesis/322/14276">Debugging верстки: переходим в операционную / Наталия	Арефьева </a></p>
<p><a href="http://www.clienttech.ru/thesis/322/14274">Комплексный обзор Microsoft Silverlight 2 &#8211; платформы для разработки интерактивных Интернет-приложений  / Михаил Черномордиков</a></p>
<p><a href="http://www.clienttech.ru/thesis/322/14272">Internet Explorer 8 изнутри – новые технологии для работы и отдыха / Михаил Черномордиков</a></p>
<p><a href="http://www.clienttech.ru/thesis/322/14270">Таблицы стилей для печати. Особенности и возможности / Михаил Баранов </a></p>
<p><a href="http://www.clienttech.ru/thesis/322/14268">Windows Presentation Foundation &#8211; архитектура, основные принципы разработки и что нужно знать, начиная свой первый проект / Роман Здебский </a></p>
<p><a href="http://www.clienttech.ru/thesis/322/14259">Спецификация будущего: инновационные возможности HTML 5 / Нарек Мкртчян</a></p></blockquote>
<p>В общем и целом, довольно интересно. Но отсутствует бизнес составляющая. Технологии сами по себе ничего не стоят, особенно в текущий период, когда компании разного профиля сыпяться одна за другой. Довольно странные доклады по Adobe Flash 8 и 9, с учетом, что уже есть версия 10 и она больше является конкурентом для Silverlight 2. По IE8 от Михаила Черномордикова, хотя он и является работником Microsoft, но Алекса Могилевского послушать было бы интереснее &#8211; как докладчик Михаил в разы хуже Алекса. А так же по основам WPF и HTML 5 &#8211; которые рассчитаны больше на новичков, которые не знают о Total Training for Microsoft WPF (наврят ли кто то может лучше рассказать о том что такое WPF и как с ним работать) и о видео на w3c по HTML5, соответственно.</p>
<p>Стоимость участия в конференции &#8220;РИТ: Клиентские технологии&#8221;:</p>
<ul>
<li>7 000 рублей до декабря месяца,</li>
<li>с 1-го декабря стоимость участия составит &#8211; 9 000 рублей.</li>
<li> Для членов клуба скидка составит 1 000 рублей</li>
</ul>
<p>для Гуру (по факту &#8211; докладчиков) скидка 50%</p>
]]></content:encoded>
			<wfw:commentRss>http://alsedi.com/blog/tezisy-po-konferencii-rit-klientskie-texnologii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
