<?xml version='1.0' encoding='utf-8' ?>
<!--  If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:media='http://search.yahoo.com/mrss/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>Записки безумного тэстера</title>
  <link>http://the-norn.livejournal.com/</link>
  <description>Записки безумного тэстера - LiveJournal.com</description>
  <lastBuildDate>Mon, 17 Nov 2008 12:03:07 GMT</lastBuildDate>
  <generator>LiveJournal / LiveJournal.com</generator>
  <lj:journal>the_norn</lj:journal>
  <lj:journalid>13658185</lj:journalid>
  <lj:journaltype>personal</lj:journaltype>
  <atom10:link rel='hub' href='http://pubsubhubbub.appspot.com/' />
  <image>
    <url>http://l-userpic.livejournal.com/71738915/13658185</url>
    <title>Записки безумного тэстера</title>
    <link>http://the-norn.livejournal.com/</link>
    <width>100</width>
    <height>79</height>
  </image>

<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/11260.html</guid>
  <pubDate>Mon, 17 Nov 2008 12:03:07 GMT</pubDate>
  <title>QAлификация :)</title>
  <link>http://the-norn.livejournal.com/11260.html</link>
  <description>&lt;p&gt;&lt;strong&gt;Собсна вот и родилось что то, будем развивать!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Адрес:&lt;/strong&gt; &lt;a href=&quot;http://qa.co.kg/&quot;&gt;qa.co.kg&lt;/a&gt;
&lt;br /&gt;
&lt;strong&gt;Авторский коллектив:&lt;/strong&gt; Роман Кононов (собсна я он и есть) и Самат Жукешов (блог &lt;a href=&quot;http://the-sapiens.livejournal.com/&quot;&gt;«QA о разном»&lt;/a&gt;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;От авторов:&lt;/strong&gt;
&lt;br /&gt;
Основная идея проекта &lt;a href=&quot;http://qa.co.kg/&quot;&gt;QAлификация&lt;/a&gt; - объединение в комьюнити, людей работающих в одном географическом регионе над улучшением качества ПО. Проект реализован в формате микроблоггинга.&lt;/p&gt;
&lt;p&gt;Для авторов, это своего рода записная книжка/блог/форум и даже своего рода мини портал, который объединяет людей близких к обеспечению качества программного обеспечения, здесь ведут обсуждения, публикуют заметки, вопросы и решения проблем связанных с общим понятием Software Quality Assurance - как тестирования программного обеспечения так и обеспечения качества процесса разработки, управления, сопровождения и деплоя. Главное - это обмен опытом.&lt;/p&gt;
&lt;p&gt;via &lt;a href=&quot;http://www.it4business.ru/blogs/1639/&quot;&gt;http://www.it4business.ru/blogs/1639/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PS Всем спасибо за участие,содействие и пеар (надеюсь и продолжите это все делать)&lt;/p&gt;
&lt;/blockquote&gt;</description>
  <comments>http://the-norn.livejournal.com/11260.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/10965.html</guid>
  <pubDate>Mon, 17 Nov 2008 11:10:50 GMT</pubDate>
  <title>Визуальный интерфейс для SVN</title>
  <link>http://the-norn.livejournal.com/10965.html</link>
  <description>&lt;p&gt;Нашел интересный проект, посвященный созданию визуального интерфейса для распространенной системы контроля версий - SVN. Сам проект называется &lt;a href=&quot;http://www.svnmonitor.com/overview.shtml&quot;&gt;SVN Monitor&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://lh4.ggpht.com/_wJ3EWSAXUm4/SSFRMqR8VmI/AAAAAAAAACQ/tMo3T3fSN-g/zrclip_003p4328f3f5.png?imgmax=800&quot; height=&quot;837&quot; width=&quot;875&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Интерфейс выглядит наподобии MSOutlook и позволяет наглядно посмотреть кто,когда и что коммитил, также есть возможность просмотреть диффы измененных файлов. Коммит и апдейт можно производить автоматически и по ручной команде, также добавлена интересная возможность мониторить определенные действия - например коммиты определенного пользователя или текст чейнджлога, при получении данного события ставиться в известность пользователь (звуковой сигнал или сообщение).&lt;/p&gt;
&lt;p&gt;В общем интерфейс получился достаточно наглядный и юзабельный :)&lt;/p&gt;</description>
  <comments>http://the-norn.livejournal.com/10965.html</comments>
  <category>soft</category>
  <category>svn</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/10587.html</guid>
  <pubDate>Mon, 03 Nov 2008 09:30:11 GMT</pubDate>
  <title>А нужно ли автоматизировать тест?</title>
  <link>http://the-norn.livejournal.com/10587.html</link>
  <description>&lt;p&gt;&lt;span&gt;Очень часто возникает вопрос - нужно ли автоматизировать этот тест, данный чеклист поможет ответить на этот вопрос. Итак если хотя бы на один вопрос вы ответили &quot;да&quot;, то стоит задуматься об автоматизации.&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span&gt;Может ли быть выделена последовательность действий, которая может быть определена как тест? - т.е данную последовательность действий необходимо повторят не один раз для проверки состояния продукта (эта последовательность может быть как тестом на производительность так и регрессионным или тестом на совместимость)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Необходимо ли воспроизводить данную последовательность действий не менее 8 раз?- данное волшебное число меняется в зависимости от проекта или методики разработки, но среднее значение примерно равно 8.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Возможно ли автоматизировать данную последовательность действий? - при ответе на данный вопрос еще стоит задуматься о том насколько дорого (по человеко-времени) выйдет написание автотестов и дальнейшая их поддержка&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Возможно ли хотя бы наполовину автоматизировать данную последовательность действий? - в принципе также стоит задуматься о ROI, как и в предидущем вопросе.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Не повлияет ли автоматизация теста на поведение программного обеспечения? - этот вопрос важен для тестов на производительность.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Необходимо ли вам проверять ваше программное обеспечение на различных платформах/операционных системах/браузерах?- Данный вопрос ориентирован на регрессионные тесты и тесты на совместимость.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <comments>http://the-norn.livejournal.com/10587.html</comments>
  <category>checklist</category>
  <category>test</category>
  <category>automation</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/10337.html</guid>
  <pubDate>Fri, 31 Oct 2008 10:44:41 GMT</pubDate>
  <title>Twist + Frankenstein или попытка впихнуть невпихуемое</title>
  <link>http://the-norn.livejournal.com/10337.html</link>
  <description>&lt;p&gt;Итак снова продукт от Thoughtworks о котором я недавно писал. Прошлый раз я описывал написание selenium (браузерных) тестов в продукте Twist, в этот раз попробуем проверить другую заявленную возможность - написание тестов на &lt;a href=&quot;http://frankenstein.openqa.org/&quot;&gt;фреймворке Frankenstein&lt;/a&gt; .&lt;/p&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;
&lt;p&gt;Фреймворк франкенштейн ориентирован на тестирование java - swing приложений, сами тестовые скрипты пишуться ручками на понятном DSL подобном языке.&lt;/p&gt;
&lt;p&gt;Для начала пробуем создать простейший тест для java-gui приложения.&lt;/p&gt;
&lt;p&gt;При создании проекта выбираем тип Frankenstein&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://lh3.ggpht.com/_wJ3EWSAXUm4/SQrhizIV39I/AAAAAAAAAB8/C4Z9iZtjUCY/zrclip_001n6aaa21df.png?imgmax=640&quot; height=&quot;400&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Указываем Main-Class (можно глянуть в манифесте) и дополнительные параметры (без параметров запустить не получилось, он отправляет приложению какую то свою кашу)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://lh5.ggpht.com/_wJ3EWSAXUm4/SQrhjfSlzcI/AAAAAAAAACA/aF8zKAenV6Q/zrclip_002p159b8df4.png?imgmax=640&quot; height=&quot;400&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Далее идем в свойства проекта и добавляем ВСЕ необходимы для запуска приложения либы (в том числе и само приложение)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://lh4.ggpht.com/_wJ3EWSAXUm4/SQrhj40GKxI/AAAAAAAAACE/gc0Sve4NgaA/zrclip_003nea9c5a9.png?imgmax=640&quot; height=&quot;400&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ну и далее собственно как и при написании теста для браузерных приложений.Единственное что отличается, что твист ждет когда вы жмакните Done, для окончания записи (в браузере он заканчивает запись при закрытии браузера)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://lh4.ggpht.com/_wJ3EWSAXUm4/SQrhkgH7gJI/AAAAAAAAACI/wZqabjMG0k0/zrclip_004p7f5b991e.png?imgmax=640&quot; height=&quot;400&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;
&lt;p&gt;В итоге получается следующий код&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://lh6.ggpht.com/_wJ3EWSAXUm4/SQrhlAdn_SI/AAAAAAAAACM/LDN-IDxikro/zrclip_005p3fc7188.png?imgmax=640&quot; height=&quot;400&quot; width=&quot;600&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Собсна процесс записи очень простой и удобный, за исключенией того, что пишет Твист с ошибками, на которые сам потом и ругается (не комплируется!) объекты франкенштейн определяет очень нестабильно, попадает по объектам нечасто (JTree так и не увидел).&lt;/p&gt;
&lt;p&gt;В общем если для браузерных тестов Твист довольно таки неплох, то для тестирования swing приложений использовать его рановато, в этом отношении даже бесплатный Marathon даст сто очков вперед.&lt;/p&gt;</description>
  <comments>http://the-norn.livejournal.com/10337.html</comments>
  <category>twist</category>
  <category>swing</category>
  <category>fuctional</category>
  <category>testing</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/10134.html</guid>
  <pubDate>Thu, 30 Oct 2008 08:12:06 GMT</pubDate>
  <title>В мемориз</title>
  <link>http://the-norn.livejournal.com/10134.html</link>
  <description>&lt;p&gt;Наткнулся на журнал посвященный тестированию - &lt;a href=&quot;http://www.testingexperience.com/&quot;&gt;Testing Experience&lt;/a&gt; , после прохождения небольшой регистрации на сайте появилась возможность скачать последние выпуски. На данный момент выпусков собственно всего 3 (первый был в мае этого года)&lt;/p&gt;
&lt;p&gt;По содержанию довольно актуальные и интересные темы в частности:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Turning Software Testing into the Backbone of your Quality Assurance System&lt;/li&gt;
&lt;li&gt;Requirements-Based Testing - Ambiguity Reviews&lt;/li&gt;
&lt;li&gt;Surveying Test Strategies:A Guide to Smart Selection and Blending&lt;/li&gt;
&lt;li&gt;Finally Usability Testing?&lt;/li&gt;
&lt;li&gt;Requirements and test management:More safety in vehicles through traceable testing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Изложено все на хорошем, понятном английском, все снабжено кучей графиков,схем кортинок. Не улыбает куча рекламы, но куда же без нее в журнале.&lt;/p&gt;
&lt;p&gt;В общем маст хев, подписался на рассылку, была бы еще возможность доставить в наши пенаты за разумные деньги.&lt;/p&gt;
Кстати может кто подскажет еще онлайн периодику по теме тестирования?</description>
  <comments>http://the-norn.livejournal.com/10134.html</comments>
  <category>testing magazine qa book read</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/9849.html</guid>
  <pubDate>Tue, 28 Oct 2008 09:53:22 GMT</pubDate>
  <title>Обновился TestabilityExplorer</title>
  <link>http://the-norn.livejournal.com/9849.html</link>
  <description>&lt;p&gt;Давно не следил за обновлениями данной тулзы, как оказалось обновился до версии 1,2,0 из изменений собсна более информативные отчеты - если раньше отображался только общее количество очков тестабельности, то сейчас можно развернуть более подробную статистику например так&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://lh6.ggpht.com/RKononov/SQbhCGNrHwI/AAAAAAAAAB0/4oAf18p5EMQ/zrclip_006pf8ac244.png?imgmax=576&quot;&gt;&lt;img src=&quot;http://lh4.ggpht.com/RKononov/SQbhDo0r_qI/AAAAAAAAAB4/X0Le6SQbYsU/zrtn_007n589dbe_tn.jpg?imgmax=576&quot; style=&quot;WIDTH: 554px; HEIGHT: 172px&quot; height=&quot;172&quot; width=&quot;554&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;также немного улучшился механизм подсчета тестируемости классов, теперь измеряется количество mutable полей класса и цикломатическая сложность. Из визуальных улучшений добавили общий индикатор качества тестируемого проекта.&lt;/p&gt;
&lt;p&gt;К интеграционке также прикручивается методом ant task-а, из анализируемых языков пока таже java, будем ждать развития.&lt;/p&gt;
&lt;p&gt;P.S&lt;/p&gt;
&lt;p&gt;На &lt;a href=&quot;http://www.testabilityexplorer.org/report&quot;&gt;официальном сайте&lt;/a&gt; можно посмотреть занимательную &lt;a href=&quot;http://www.testabilityexplorer.org/flex/TestabilityCharts.swf&quot;&gt;статистику&lt;/a&gt; отражающую результаты проверки на тестируемость различных популярных проектов (AspectJ,JRuby)&lt;/p&gt;
&lt;p&gt;</description>
  <comments>http://the-norn.livejournal.com/9849.html</comments>
  <category>testability google static</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/9589.html</guid>
  <pubDate>Thu, 16 Oct 2008 11:44:39 GMT</pubDate>
  <title>Twist или танцы вокруг DSL</title>
  <link>http://the-norn.livejournal.com/9589.html</link>
  <description>&lt;p&gt;
          &lt;span&gt;Не так давно состоялся бета релиз тул&lt;/span&gt;зы для функционального совместного тестирования - Twist. Компания,что выпустила данный продукт уже не раз отмечалась весьма интересными проектами в области тестирования и управления, взять хотя бы Mingle ишшу трекер или CruiseControl - сервер интеграции с которого все начиналось.&lt;/p&gt;
&lt;p&gt;
          &lt;img src=&quot;http://lh6.ggpht.com/RKononov/SPco_t00_nI/AAAAAAAAABI/gjYaByM_x34/zrclip_001pe9cd194.png?imgmax=512&quot; height=&quot;298&quot; width=&quot;458&quot; /&gt;
        &lt;/p&gt;
&lt;p&gt;Итак Твист (собсна название началось от девиза - пусть вся команда танцует твист) &lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;позиционируется как &lt;strong&gt;платформа&lt;/strong&gt; для совместной разработки,поддержки и запуска тестов. Слить данный продукт можно с сайта &lt;a href=&quot;http://studios.thoughtworks.com/twist/trial#download&quot;&gt;производителя&lt;/a&gt; тамже после регистрации можно получить ключик к триальной 60-ти дневке.&lt;/p&gt;
&lt;p&gt;Начнем с интерфейса, он полностью экклиспсовский, собственно это далеко не первый платный продукт основанный на этой платформе (вспомнить хотя бы Zend Studio), интерфейс до боли знакомы и поэтому простой в понимании и обращении выглядит основное окно примерно так&lt;/p&gt;
&lt;p&gt;
          &lt;img src=&quot;http://lh4.ggpht.com/RKononov/SPcpBmeCehI/AAAAAAAAABQ/SuDA0VGp3wU/zrclip_002p1fc79891.png?imgmax=800&quot; height=&quot;407&quot; width=&quot;804&quot; /&gt;
        &lt;/p&gt;
&lt;p&gt;Классическая экклипсовская навигация, редактор кода с автодополнением и подсветкой, полная поддержка java ну и прочие вкусности взрослой IDE.&lt;/p&gt;
&lt;p&gt;Попробуем написать простейший тест. Для начала создаем проект,создаем новый пустой сценарий и пытаемся что то сделать, вот тут самое интересное, пока я физически не полез в справку и усиленно ее не почитал, трудно было догадаться что нужно в определенном месте жмакать ctrl+1, выглядит процесс написания DSL примерно так&lt;/p&gt;
&lt;p&gt;
          &lt;img src=&quot;http://lh6.ggpht.com/RKononov/SPcpDJfSeWI/AAAAAAAAABU/s0ovmxwMXj4/zrclip_003pb8ed885.png?imgmax=512&quot; height=&quot;273&quot; width=&quot;474&quot; /&gt;
        &lt;/p&gt;
&lt;p&gt;Здесь показан процесс создания фикстуры (или простейшего тест плана), далее заполняем тест план конкретными действиями&lt;/p&gt;
&lt;p&gt;
          &lt;img src=&quot;http://lh3.ggpht.com/RKononov/SPcpDSPOLkI/AAAAAAAAABY/MjSBLRSSHDE/zrclip_004p9421e83.png?imgmax=576&quot; height=&quot;240&quot; width=&quot;525&quot; /&gt;
        &lt;/p&gt;
&lt;p&gt;как видно каждый шаг, описанный понятным &lt;strong&gt;русским&lt;/strong&gt; языком мы можем либо записать в рекордере, либо отредактировать ручками в виде java кода.&lt;/p&gt;
&lt;p&gt;пишем код ручками:&lt;/p&gt;
&lt;p&gt;
          &lt;img src=&quot;http://lh3.ggpht.com/RKononov/SPcpDpsZlvI/AAAAAAAAABc/lEjcGg3lcs0/zrclip_005p7624833a.png?imgmax=400&quot; height=&quot;164&quot; width=&quot;330&quot; /&gt;
        &lt;/p&gt;
&lt;p&gt;Или записываем в браузере&lt;/p&gt;
&lt;p&gt;
          &lt;img src=&quot;http://lh6.ggpht.com/RKononov/SPht3NVxPgI/AAAAAAAAABg/MFICYnX6XQU/zrclip_006p2e11293c.png?imgmax=576&quot; height=&quot;357&quot; width=&quot;575&quot; /&gt;
        &lt;/p&gt;
&lt;p&gt;В общем все очень просто и понятно.&lt;/p&gt;
&lt;p&gt;Далее каждый тест принадлежит определенному контексту&lt;/p&gt;
&lt;p&gt;
          &lt;img src=&quot;http://lh4.ggpht.com/RKononov/SPht31YowSI/AAAAAAAAABk/IAUvXfyO0Mc/zrclip_007n5d1d83b5.png?imgmax=288&quot; height=&quot;154&quot; width=&quot;287&quot; /&gt;
        &lt;/p&gt;
&lt;p&gt;Он необходим для того, чтобы задавать первоначальные условия запуска теста, например иньекция тестовых данных в базу или выставление определенных переменных или логин под определенным пользователем (аналог Before и After в JUnit)&lt;/p&gt;
&lt;p&gt;Также каждый тест можно помечать определенными тегами&lt;/p&gt;
&lt;p&gt;
          &lt;img src=&quot;http://lh5.ggpht.com/RKononov/SPht4Nckn0I/AAAAAAAAABo/diJXWeecV-s/zrclip_008p137f76eb.png?imgmax=400&quot; height=&quot;129&quot; width=&quot;358&quot; /&gt;
        &lt;/p&gt;
&lt;p&gt;По тегам в дальнейшем можно запускать наборы тестов, например все тесты в которых есть тэг поиск (поменяли алгоритм поиска и нужно проверить регрессию)&lt;/p&gt;
&lt;p&gt;Запуск тестов тоже очень удобный и производиться нажатием кнопки Execute на тесте, либо запуском всех тестов в проекте.&lt;/p&gt;
&lt;p&gt;В общем в итоге у меня получился следующий простенький тест&lt;/p&gt;
&lt;p&gt;
          &lt;img src=&quot;http://lh5.ggpht.com/RKononov/SPht47hJYtI/AAAAAAAAABs/B_Q5BQ4pe88/zrclip_009n31d7fee5.png?imgmax=640&quot; height=&quot;273&quot; width=&quot;639&quot; /&gt;
        &lt;/p&gt;
&lt;p&gt;и следующий код (код полностью автогенерированный!)&lt;/p&gt;
&lt;p&gt;
          &lt;img src=&quot;http://lh3.ggpht.com/RKononov/SPht5RQFx1I/AAAAAAAAABw/bN_WW3c8l6w/zrclip_010n4efe1645.png?imgmax=576&quot; height=&quot;378&quot; width=&quot;519&quot; /&gt;
        &lt;/p&gt;
&lt;p&gt;Как видно все очень просто и понятно (если не считать того, что нужно усиленно покурить мануал), штука я бы сказал очень удобная и вплане организации совместной работы и вплане записывания/отладки тестов (селениуму многих вещей очень не хватает) и если сравнивать с аналогами (FITnesse,AOST) серьезная и расчитанная именно на использование (хотя и платная). Из минусов (помимо сложностей с логикой) хотелось бы заметить, что не нашел как же это все прикручивается к интеграционной машине (поддержка анта в релизе заявлена) ну и скажем так отчетность не порадовала (стандартная полосочка ну сколько прошло/упало). В общем для беты вполне серьезный продукт и думаю в дальнейшем можно будет активно использовать.&lt;/p&gt;
</description>
  <comments>http://the-norn.livejournal.com/9589.html</comments>
  <category>twist</category>
  <category>selenium</category>
  <category>dsl</category>
  <category>thoghtworks</category>
  <category>тестирование</category>
  <category>qa</category>
  <lj:mood>hopeful</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/9429.html</guid>
  <pubDate>Thu, 09 Oct 2008 12:14:29 GMT</pubDate>
  <title>Оценка покрытия кода (Code Coverage)</title>
  <link>http://the-norn.livejournal.com/9429.html</link>
  <description>На днях читая блоги наткнулся на непонятное определени - оценка покрытия согласно С1, как оказалось это один из видов оценки покрытия кода, спросив у гугла наткнулся на достаточно подробное описание видов покрытия, как оказалось их гораздо больше 3, что я описывал ранее. Итак виды покрыти кода.&lt;br /&gt;1)Собсна то самое(Statement) C1 - линейное покрытие кода, считается каждый выполненный оператор (строчка кода или блок).Данный вид покрытия самый простой и не требует изменения исходного кода.&lt;br /&gt;2)Оценка покрытия кода с учетом условных операторов(Decision  - С2) - в каждом условном операторе (if,while,switch...) проверяется вызывался ли условный оператор со значением условия true и false, данный способ оценки более адекватный, но не учитывает тот случай если условие содержит несколько выражений - например if(sample||sample2), при этом вариант sample2 не проверяется/вызывается (если это функция).&lt;br /&gt;3)Оценка покрытия кода с учетом всех условий(Condition) - проверяется покрытие кода на предмет того вызывается ли условный оператор со всеми возможными значениями проверяемых переменных. Данный способ более адекватен чем предыдущий и позволяет получить объективную оценку покрытия&lt;br /&gt;4)Оценка покрытия с учетом путей выполнения(Path Coverage) - в данном случае считаются все пути, которые выполняются в процессе работы (путь - уникальная последовательность выполнения операторов, с учетом условных операторов)&lt;br /&gt;5)Оценка покрытия с учетом вызовов функций(Function Coverage) - учитываются только уникальные вызовы функций - скажем так очень не объективная оценка покрытия (также ее называют BullsEye coverage)&lt;br /&gt;6)Оценка покрытия с учетом выполнения циклов (Loop Coverage)- данная метрика оценивает выполнялись ли циклы имеющиеся в коде один или более раз или не выполнялись.&lt;br /&gt;7)Оценка покрытия с учетом одновременного выполнения (Race Coverage)- показывает выполняется ли какой либо код одновременно - помогает выявить возможные проблемы в частности Race condition&lt;br /&gt;8)Оценка покрытия с учетом операторов сравнения - выявляет встречаются ли в операторах сравнения (&amp;gt;,&amp;lt;) непредусмотренные значения (например 1&amp;gt;1).&lt;br /&gt;9)Оценка покрытия с учетом выполнения таблицы конечных автоматов - определяет выполнились ли все возможные ветки в таблицы конечного автомата...&lt;br /&gt;&lt;br /&gt;Собсна оценок покрытия кода как оказалось очень много и тут перечислены далеко не все. Программно реализована тоже малая часть из них (буквально первые 3) да и большой необходимости в этом нет, так что данный список представляет исключительно академический интерес&lt;br /&gt;PS&lt;br /&gt;Спасибо ненашему провайдеру КТ, за баненые ипки, сижу через анонимный прокси, слов нет...</description>
  <comments>http://the-norn.livejournal.com/9429.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/9134.html</guid>
  <pubDate>Mon, 06 Oct 2008 08:46:58 GMT</pubDate>
  <title>Обновление Marathon...</title>
  <link>http://the-norn.livejournal.com/9134.html</link>
  <description>В свежей версии Марафона (&lt;a href=&quot;http://www.marathontesting.com/Home.html&quot;&gt;http://www.marathontesting.com/Home.html&lt;/a&gt;) наконец пофиксали понты с кликом по меню. Проблема заключалась в том, что в жава приложении написанным при помощи Spring Rich Client на гуи морде меню появлялось не сразу а после прошествии определенного времени, а собсна марафон не мог определить момент подгрузки меню и постоянно падал с NPE при попытке клика по неподгруженному меню, решали подобное через sleep(), но периодически,даже при больших задержках падало.В релизе 1,2,1,1 данный баг уже пофиксан. Наконец можем писать нормальные,стабильные автотесты. Всем индусам авторам марафона - большой рахмет</description>
  <comments>http://the-norn.livejournal.com/9134.html</comments>
  <lj:mood>hungry</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/8791.html</guid>
  <pubDate>Fri, 03 Oct 2008 09:59:09 GMT</pubDate>
  <title>Tellurium,AOST и много других страшных DSL надстроек...</title>
  <link>http://the-norn.livejournal.com/8791.html</link>
  <description>Давно хотел написать о различных надстройках что появились для селениума. В принципе селениум и сам по себе достаточно удобен для написания автотестов для веба, но вот некоторым неймётся уменьшить уровень вхождения для написания автотестов (чем проще писать, тем больше смогут это делать). В итоге получается очень много различных &amp;quot;химер&amp;quot; на базе селениума - например Selenium+Fitnesse или фреймворк для автотестов о котором я хочу рассказать - Tellurium (раньше назывался AOST).&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;Так вот АОСТ (так и подмывает назвать его моющим средством, из небезизвестной рекламы) позвоялет писать автотесты для веба практически нормальным английским функциональным языком примерно в слудующем виде:&lt;br /&gt;&lt;pre class=&quot;prettyprint&quot;&gt;&lt;a&gt;&lt;span style=&quot;color: rgb(51, 51, 153);&quot;&gt;&lt;span class=&quot;pln&quot;&gt;openUrl &lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&amp;quot;http://code.google.com/p/aost/&amp;quot;&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;click &lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&amp;quot;menu.project_home&amp;quot;&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;waitForPageToLoad &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;30000&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;click &lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&amp;quot;menu.downloads&amp;quot;&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;waitForPageToLoad &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;30000&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;click &lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&amp;quot;menu.wiki&amp;quot;&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;waitForPageToLoad &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;30000&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;click &lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&amp;quot;menu.issues&amp;quot;&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;waitForPageToLoad &lt;/span&gt;&lt;span class=&quot;lit&quot;&gt;30000&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/pre&gt;&lt;br /&gt;одного взгляда на вышеприведенный скрипт достаточно для понимания того, что он должен делать, каждая строка представляет собой один оператор. Писать скрипт достаточно в текстовом файле соблюдая определенный формат, причем формат настолько простой, что его можно доверить заказчику (ооочень напоминает фитнессс). Структура файла следующая в начале указываются определения элементов управления в следующем виде&lt;br /&gt;&lt;pre class=&quot;prettyprint&quot;&gt;&lt;a&gt;&lt;span style=&quot;color: rgb(51, 51, 153);&quot;&gt;&lt;span class=&quot;pln&quot;&gt;ui&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Container&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;uid&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&amp;quot;google_start_page&amp;quot;&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; clocator&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;tag&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&amp;quot;td&amp;quot;&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot;&gt;group&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;){&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;InputBox&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;uid&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&amp;quot;searchbox&amp;quot;&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; clocator&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&amp;quot;Google Search&amp;quot;&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;])&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;SubmitButton&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;uid&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&amp;quot;googlesearch&amp;quot;&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; clocator&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&amp;quot;btnG&amp;quot;&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; value&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&amp;quot;Google Search&amp;quot;&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;])&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;SubmitButton&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;uid&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&amp;quot;Imfeelinglucky&amp;quot;&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; clocator&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&amp;quot;I&apos;m Feeling Lucky&amp;quot;&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;])&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/pre&gt;&lt;pre class=&quot;prettyprint&quot;&gt;&lt;a&gt;&lt;span class=&quot;pun&quot;&gt;и далее идет сам скрипт, который собсна позволяет использовать данные определения для совершения процесса тестирования.&lt;br /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/pre&gt;&lt;br /&gt;Написан Теллуриум на новомодном груви с использованием жава, в комплект уже включены библиотеки для работы с JUnit и TestNG тестами а также сам селениум сервер. Собсна писать можно точно такие же тесты в формате JUnit или TestNG а также просто оформлять тесты в виде отдельных файлов и скармливать их батнику (прежде нужно сбилдить проект) который собсна запускает селениум сервер и выполняет скармливаемый тест (очень кстати удобно и быстро). Хвала разработчикам они подумали и о способах идентификации элементов управления, вместе с теллуриумом поставляется плагин для файрфокса, который позволяет определить&amp;nbsp; идентификатор элемента сразу в формате теллуриума &lt;img alt=&quot;&quot; src=&quot;http://tellurium-users.googlegroups.com/web/trump_clocator.png?gda=5v_UwEQAAABBo5YKz4My4Er929brhwkDRyE1Dk042vfjlBe_WGvx79juREH76Q0d2LOU-UCoyHVV6u9SiETdg0Q2ffAyHU-dzc4BZkLnSFWX59nr5BxGqA&amp;amp;gsc=RUNugxYAAABZq3pCURvYM5SZypLYjyd25QzTRg0a_4LqA7LDDLzsAA&quot; style=&quot;width: 540px; height: 298px;&quot; ilo-full-src=&quot;http://tellurium-users.googlegroups.com/web/trump_clocator.png?gda=5v_UwEQAAABBo5YKz4My4Er929brhwkDRyE1Dk042vfjlBe_WGvx79juREH76Q0d2LOU-UCoyHVV6u9SiETdg0Q2ffAyHU-dzc4BZkLnSFWX59nr5BxGqA&amp;amp;gsc=RUNugxYAAABZq3pCURvYM5SZypLYjyd25QzTRg0a_4LqA7LDDLzsAA&quot; /&gt;&lt;br /&gt;ставиться правда плагин вручную и при помощи длительного изучения ридми. В общем после недолгих экспериментов получился следующий код&lt;br /&gt;&lt;a href=&quot;http://pics.livejournal.com/the_norn/pic/0001gxg7/&quot;&gt;&lt;img border=&quot;0&quot; ilo-full-src=&quot;http://pics.livejournal.com/the_norn/pic/0001gxg7/s320x240&quot; src=&quot;http://pics.livejournal.com/the_norn/pic/0001gxg7/s320x240&quot; style=&quot;width: 469px; height: 269px;&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;код в принципе очень прост,понятен и линеен, практически идеальный тест, запускается очень просто, путем вызова из командной строки бат файла &amp;quot;rundsl.bat &amp;quot;&amp;nbsp; в качестве параметра к которому отправляется имя дсл файла. Выполняется весь скрипт очень быстро (Теллуриум предусматривает ожидание прогрузки страниц, где это необходимо), единственно результаты будут доступны только в виде ReturnCode консольного приложения, но ничто не мешает запускать тесты JUnit&amp;nbsp; с прикрученным теллуриумом. Кстати при написании скрипта можно использовать все мощностя языка груви (условные операторы,циклы и т.д.).&lt;br /&gt;&lt;br /&gt;В общем штука достаточно удобная, реализована тоже неплохо, единственно пока не вижу практической необходимости внедрения данного фреймворка ибо писать и на селениуме достаточно быстро и удобно (плагин для файрфокса продолжает рулить) да и аост сыроват</description>
  <comments>http://the-norn.livejournal.com/8791.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/8532.html</guid>
  <pubDate>Fri, 26 Sep 2008 10:59:34 GMT</pubDate>
  <title>Скриншотер</title>
  <link>http://the-norn.livejournal.com/8532.html</link>
  <description>Здравствуйте, давно не писал, в основном потому что тупо нет времени, накопилась куча тем, о которых хотелось бы рассказать (клятвенно обещаю, в первую очередь себе, сконвертировать это все в электронный формат). Итак сегодня маленькая но очень удобная программуленька. Один из самых необходимых для тестера инструментов (конечно после рук) является небольшая софтинка для снятия скриншотов. &lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;До этого момента пользовался большим и неудобным снагитом девятой версии, большая многофункциональная софтина, которая просит денег и недюжинных способностей для изучения и использования всего его функционала. Недавно в обзорах бесплатного программного софта наткнулся на мелкую китайскую софтинку которая обладает сходным функционалом.&lt;br /&gt;Программка называется PicPic слить можно по адресу -&amp;nbsp; http://picpick.wiziple.net/&amp;nbsp; прелагаются 2 версии на китайском и английском, весит в районе 800 кб, что только умиляет после многомегабайтного снагита.&lt;br /&gt;По функционалу есть все необходимые функции в частности&lt;br /&gt;-Скриншот окна,экрана,региона,веб страницы&lt;br /&gt;-Возможность измерения размеров объектов линейкой,измерение углов &lt;br /&gt;-Редактирование снятых скриншотов&lt;br /&gt;-Определение цвета под курсором&lt;br /&gt;&lt;img alt=&quot;&quot; src=&quot;file:///C:/DOCUME%7E1/NORNIK%7E1.001/LOCALS%7E1/Temp/moz-screenshot.jpg&quot; /&gt;&lt;a href=&quot;http://pics.livejournal.com/the_norn/pic/0001e89y/&quot;&gt;&lt;img height=&quot;240&quot; border=&quot;0&quot; width=&quot;215&quot; ilo-full-src=&quot;http://pics.livejournal.com/the_norn/pic/0001e89y/s320x240&quot; src=&quot;http://pics.livejournal.com/the_norn/pic/0001e89y/s320x240&quot; style=&quot;&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Интегрируется и ставиться софтинка очень быстро (ставить и не нужно) в автозагрузку добавляется автоматом, все хоткеи настраиваются очень быстро и удобно&lt;br /&gt;&lt;img alt=&quot;&quot; src=&quot;file:///C:/DOCUME%7E1/NORNIK%7E1.001/LOCALS%7E1/Temp/moz-screenshot-1.jpg&quot; /&gt;&lt;a href=&quot;http://pics.livejournal.com/the_norn/pic/0001f0w6/&quot;&gt;&lt;img height=&quot;240&quot; border=&quot;0&quot; width=&quot;252&quot; ilo-full-src=&quot;http://pics.livejournal.com/the_norn/pic/0001f0w6/s320x240&quot; src=&quot;http://pics.livejournal.com/the_norn/pic/0001f0w6/s320x240&quot; style=&quot;&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;В общем от снагита отказался в пользу этой удобной,простой и легкой мелочи. Ведь вся работа облегчается такими мелочами (totalCommander,Miranda,firefox,thunderbird)</description>
  <comments>http://the-norn.livejournal.com/8532.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/8249.html</guid>
  <pubDate>Wed, 03 Sep 2008 09:31:46 GMT</pubDate>
  <title>Жизненное</title>
  <link>http://the-norn.livejournal.com/8249.html</link>
  <description>Конечно запись совсем даже и рядом не относиться к работе или направлена на решение чьей либо проблемы, но блог все таки является дневником в первую очередь. &lt;br /&gt;Итак с этого дня являюсь преподавателем кафедры ПОКС свово универа в котором собсна и пишу кандидатскую, данный шаг обусловлен совсем даже не попыткой &quot;поднять бабла&quot; или &quot;уговорили на кафедре&quot; а необходимостью отвести определенное количество часов для кандидатского минимума. Держитесь студенты...&lt;br /&gt;ЗЫ не &quot;развожусь&quot;</description>
  <comments>http://the-norn.livejournal.com/8249.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/7983.html</guid>
  <pubDate>Mon, 25 Aug 2008 06:52:37 GMT</pubDate>
  <title>Факты о багах</title>
  <link>http://the-norn.livejournal.com/7983.html</link>
  <description>&lt;ul&gt;&lt;li&gt;80% ошибок &quot;зарыты&quot; в 20% процентах кода&lt;/li&gt;&lt;li&gt;Высокая цикломатическая сложность является маркером бажных мест&lt;/li&gt;&lt;li&gt;Даже если код покрыт тестами на 100% , примерно 35% ошибок появляется из-за отсутствующей логики, &lt;/li&gt;&lt;li&gt;еще 40% ошибок возникает при уникальном сочетании входных данных&lt;/li&gt;&lt;li&gt;остальные являются рапространенными ошибками программистов&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Чем дольше баг не фикситься, тем дороже стоит его пофиксить&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;</description>
  <comments>http://the-norn.livejournal.com/7983.html</comments>
  <lj:mood>curious</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/7798.html</guid>
  <pubDate>Fri, 22 Aug 2008 06:27:58 GMT</pubDate>
  <title>Тестирование в условиях гибкой разработки.</title>
  <link>http://the-norn.livejournal.com/7798.html</link>
  <description>Здравствуйте. Уже больше года занимаюсь тестированием в условиях гибкой разработки. Поначалу сложно было привыкнуть, особенно после классического водопада, потом как-то втянулся начал читать литературу,блоги применять различные практики. Сложнее всего &lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;div class=&quot;ljcut&quot; text=&quot;Read more...&quot;&gt;было привыкнуть к итеративной разработке, отсутствию хорошо документированных и фиксированных требований и конечных сроков выпуска продукта. В принципе тестирование при гибкой разработке сильно не отличается от других методов разработки, те же подходы, те же методики, единственно приходиться подстраиваться под ритм, какие то методики не использовать в угоду другим, что то добавлять от себя и тщательно обрабатывать напильником. На основе своего небольшого опыта хотел бы поделиться (да и наверное зафиксировать для себя) решениями основных проблем и основными best practices тестирования в условиях гибкой разработки.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Тестирование основанное на оценке рисков - в принципе данный подход существует и в той же водопадной модели, но в условиях быстро меняющегося функционала данный подход особенно важен. Во первых давит ограничение времени итерации, как такового отдельного времени на тестирование практически нет и нужно успеть до конца запланированной итерации (буфер конечно закладывается, но дядька Мерфи берет свое).Также обычно меняется только строго определенный и часто физически независимый функционал, поэтому тестирование только изменений вполне обоснованно. Также узкие/важные места может определять заказчик.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Тесное взаимодействие команды тестировщиков и команды разработчиков - в принципе один из основных принципов гибких методологий это постоянная коммуникация, для тестеров это очень важно, так как часто знание функционала разделено между описанием функционала, разработчиком и заказчиком и очень важно поддерживать коммуникация со всеми.Кстати на счет оптимального соотношения часто рекомендуют минимум 1 тестировщика на 3 программистов.&lt;/li&gt;&lt;li&gt;Использование сервера интеграции - при гибкой разработке, при частых изменениях функционала, при частых коммитах очень важно чтобы тутже проводилась хотя бы базовое регрессионное тестирование,прогонялись юнит тесты, собирались наименее емкие(по времени) метрики.Причем время отклика интеграционной машины на коммит не должно превышать 10 минут (максимально время до переключения человека на другую проблему)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Наличие тестового фреймворка и набора тулзов - для гибкого тестирования очень важно проводить тестирование быстро и без лишних затрат, очень часто затраты как раз таки появляются при рутинной и повторяющейся работе - очистка базы, занесение шаблонных значений, создание нового автотеста, прикручивание автотеста к интеграционной машине - данная рутина должна быть автоматизированна по максимуму, для обеспечение быстрого определения качества новой версии разрабатываемого ПО&lt;/li&gt;&lt;li&gt;Ретроспектива - очень важно после окончания итерации оглянуться назад и определить какие процессы заняли слишком много времения, какие не принесли ожидаемых результатов и каким образом это все лучше реализовать в следующей итерации.&lt;/li&gt;&lt;li&gt;Планирование процесса исправления найденных багов - в ходе частого изменения функционала продукта очень часто отлавливаются различного рода баги, очень важно вовремя определять приоритет багов и планировать процесс их исправления, например баги с высоким приоритетом исправляются в этой итерации с отодвиганием конечных сроков, баги с более низким приоритетом исправляются в следующей итерации.&lt;/li&gt;&lt;li&gt;Общедоступность метрик проекта - метрики проекта должны размещаться в общедоступном месте (как общественный монитор, вебсервер,либо какие либо индикаторы или красные лампочки) и отображать актуальную информацию не только о метриках кода (их собирает сервер интеграции) но и всяческие диаграммы состояния проекта (burn-down,Gantt).Данная практика в первую очередь необходима всей команде, для понимания текущего состояния дел в проекте и соответствующей реакции,также метрики позволяют определять различного рода риски.&lt;/li&gt;&lt;li&gt;Парное тестирование - данная практика является экспериментальной и возможно мое понимание немного отличается.Парное тестирование - это тестирование в паре с разработчиком - при этом у тестировщика появляется знание о продукте и методах его использования,более опытным тестером - при это тестировщик получает опыт новых для него методик тестирования или инструментов или заказчиком - при этом тестировщик расширяет свое видение продукта как конечный пользователь.&lt;/li&gt;&lt;/ul&gt;В общем тестирование в условиях гибкой разработки очень интересное и главное активное занятие, постоянно кто то что то меняет, коммитит, формирует требования, и это необходимо проверять, находить проблемы, решать их постоянно общаясь со всеми участниками проекта и получать удовольствие :)&lt;/div&gt;</description>
  <comments>http://the-norn.livejournal.com/7798.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/7487.html</guid>
  <pubDate>Fri, 15 Aug 2008 06:48:22 GMT</pubDate>
  <title>Составные качества. Юзабилити</title>
  <link>http://the-norn.livejournal.com/7487.html</link>
  <description>Здравствуйте.&lt;br /&gt;Юзабилити - качественный атрибут отражающий то насколько просто\удобно\быстро&amp;nbsp; можно использовать интерфейс предоставляемый конечному усреднённому пользователю.Итак получилось довольно непонятное определение, попробуем попроще&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;div class=&quot;ljcut&quot; text=&quot;Read more...&quot;&gt;, разложим это самое &quot;просто\удобно быстро&quot; на составляющие, обозначающие что же на самом деле значит &quot;простой интерфейс&quot;. &lt;br /&gt;Наверное в первую очередь &quot;простой&quot; интерфейс - означает понятный, некий интерфейс основанный на уже виденных ранее вещах, своего рода интуитивно понятный, т.е увидев его пользователь должен с первых минут должен понять что нажимать,куда вводить и что он получит в итоге, причем не обязательно такой интерфейс должен основываться на стереотипах, достаточно чтобы он воспринимался интуитивно (что то вроде лестницы).&lt;br /&gt;Следующий момент - простой интерфейс не должен быть перегружен лишними деталями, компонентами, он должен ориентироваться на конкретную цель, причем ориентироваться с максимальной эффективностью для скорости работы пользователя, т.е если это интерфейс веб-магазина там не должно быть функций биржи или панели запуска космического корабля.Далее - простой интерфейс должен легко запоминаться, либо основываясь на стереотипах, либо быть очень простым, либо предоставлять свой специфически-удобный метод работы с ним. &lt;br /&gt;Далее интерфейс должен позволять легко и удобно откатывать/исправлять ошибки, чтобы не было мучительно больно потерять кучу текста удаленного по ошибке.&lt;br /&gt;Ну и одно из самых важных - интерфейс должен быть приятным, нравиться пользователю и приносить своего рода удовольствие от работы с ним (как в той рекламе - &quot;и в салоне так пахнет кожей, что все телки будут твои&quot;).&lt;br /&gt;Итак состаные юзабилити:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Понятность&lt;/li&gt;&lt;li&gt;Эффективность&lt;/li&gt;&lt;li&gt;Запоминаемость&lt;/li&gt;&lt;li&gt;&quot;Откатываемость&quot;&lt;/li&gt;&lt;li&gt;&quot;Красота&quot;&lt;/li&gt;&lt;/ul&gt;Причем каждый из этих составляющих является очень важным, т.е только красота (как обычно все думают которая и является юзабилити) может быть перегружена лишними компонентами или просто неудобна для использования. Или например применение большого числа сочетаний клавиш ускоряет работу и эффективность, но интерфейс становиться незапоминаемым.Или слишком простой интерфейс не приносит удовольствия пользователю и второй раз пользователь к такому убогому интерфейсу не вернется.&lt;br /&gt;Юзабилити очень важный фактор в наши дни в вебе он даже является фактором выживания и поэтому очень важно уделять ему внимание и активно использовать различные методики юзабилити тестирования еще до начала разработки.&lt;/div&gt;</description>
  <comments>http://the-norn.livejournal.com/7487.html</comments>
  <lj:mood>angry</lj:mood>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/7226.html</guid>
  <pubDate>Fri, 08 Aug 2008 11:09:56 GMT</pubDate>
  <title>Полный бизнец....</title>
  <link>http://the-norn.livejournal.com/7226.html</link>
  <description>&lt;p&gt;Все началось с жалоб заказчика на медленную работу сайта, как оказалось что  жалобы весьма даже не безосновательны, сайт не просто тормозит, он безбожно  тормозил, причем проявлялось это исключительно на винде и при просмотре через  ослика. Все бы ничего, ничего не пришлось бы переделывать, если бы подавляющее  большинство пользователей интернета не сидело на этом долбаном осле и под  виндой. Причем после проведения нагрузочного тестирования при помощи jmeter и ab  ничего собсна&lt;/p&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;div class=&quot;ljcut&quot; text=&quot;Read more...&quot;&gt;&lt;p&gt; не выявилось, время отклика в пределах нормы, тесты откатались  нормально, загрузка сервака средняя. Как оказалась проблемы были в коде, в  евоной оптимизации под конкретный браузер, собсна о проблемах говорить не мне,  решать тоже не мне, я всего лишь опишу как выявили. Погуглив на тему  тестирования производительности нашел кучу софтин и сервисов, которые собсна все  это и делают - оценивают производительность. Софтины совершенно различные  начиная с плагинов для файрфокса(firebu,YSlow) и заканчивая  вышеупомянутыми&amp;nbsp;jmeter и ab. Но у применяемых мной была одна большая проблема,  они всего лишь эмулировали поведение браузеров а не были им. Одна из этих софтин  и оказалась искомым решением - Fiddler. Данный инструмент является расширенным  прокси сервером, который берет на себя трансляцию пакетов с поддержкой  фильтрации и и отчетности буквально по каждому запросу/ответу. Итак подробней -  начать работать очень просто, буквально настраиваем в &lt;b&gt;любом  &lt;/b&gt;браузере работу через прокси (порт по умолчанию 8888) и наблюдаем в  главном окне фиддлера собсна всю обменку выглядит примерно так...&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://pics.livejournal.com/the_norn/pic/0001bfgc/&quot; atomicselection=&quot;true&quot;&gt;&lt;img height=&quot;167&quot; border=&quot;0&quot; width=&quot;320&quot; alt=&quot;&quot; style=&quot;&quot; src=&quot;http://pics.livejournal.com/the_norn/pic/0001bfgc/s320x240&quot; ilo-full-src=&quot;http://pics.livejournal.com/the_norn/pic/0001bfgc/s320x240&quot; /&gt;&lt;br /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;соответственно результат,протокол,запрос,время запроса и дополнительные не  менее важные параметры, также присутствует базовый функционал по построению  диаграм и простой визуализации, вот например так отображается соотношение  контента на тестируемом сайте&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://pics.livejournal.com/the_norn/pic/0001c377/&quot; atomicselection=&quot;true&quot;&gt;&lt;img height=&quot;240&quot; border=&quot;0&quot; width=&quot;240&quot; alt=&quot;&quot; style=&quot;&quot; src=&quot;http://pics.livejournal.com/the_norn/pic/0001c377/s320x240&quot; ilo-full-src=&quot;http://pics.livejournal.com/the_norn/pic/0001c377/s320x240&quot; /&gt;&lt;br /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;а вот собсна и неутешительная статистика&lt;/p&gt;&lt;pre class=&quot;csharpcode&quot;&gt;Request Count:     243&lt;br /&gt;Bytes Sent:     124,490&lt;br /&gt;Bytes Received: 702,387 &lt;br /&gt;&lt;br /&gt;ACTUAL PERFORMANCE&lt;br /&gt;--------------&lt;br /&gt;Requests started at:    14:24:57:5156&lt;br /&gt;Responses completed at:    16:44:40:7812&lt;br /&gt;Total Sequence time:    02:19:43.2656250&lt;br /&gt;DNS Lookup time:    45,797ms&lt;br /&gt;TCP/IP Connect time:    14,002ms &lt;br /&gt;&lt;br /&gt;RESPONSE CODES&lt;br /&gt;--------------&lt;br /&gt;HTTP/404:     1&lt;br /&gt;HTTP/304:     8&lt;br /&gt;HTTP/301:     1&lt;br /&gt;HTTP/200:     233 &lt;br /&gt;&lt;br /&gt;RESPONSE BYTES (by Content-Type)&lt;br /&gt;--------------&lt;br /&gt;        text/x-component:    350,102&lt;br /&gt;                text/css:    13,701&lt;br /&gt;               image/gif:    32,839&lt;br /&gt;                ~headers:    64,872&lt;br /&gt;              image/jpeg:    19,641&lt;br /&gt;               text/html:    109,562&lt;br /&gt;application/x-javascript:    111,670&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt; &lt;div contenteditable=&quot;true&quot; class=&quot;postBody&quot; style=&quot;border-width: 0px; margin: 4px 0px 0px; padding: 0px;&quot;&gt;  &lt;p&gt;причем статистика отличается в зависимости от браузера (это и есть большой  плюс данного средства) что собсна и должно быть.&lt;/p&gt; &lt;p&gt;Примерно так выглядит диаграмма запросов&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://pics.livejournal.com/the_norn/pic/0001dxya/&quot; atomicselection=&quot;true&quot;&gt;&lt;img height=&quot;161&quot; border=&quot;0&quot; width=&quot;320&quot; alt=&quot;&quot; style=&quot;&quot; src=&quot;http://pics.livejournal.com/the_norn/pic/0001dxya/s320x240&quot; ilo-full-src=&quot;http://pics.livejournal.com/the_norn/pic/0001dxya/s320x240&quot; /&gt;&lt;br /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Собсна софтина очень удобная и простая, конечно есть у ней и свои минусы,  прежде всего это минимализм, отсутствие например тех же расширенных отчетов и  возможности экспорта существующих отчетов, также нехватает какой то оценки и  анализа ну и соответственно рекомендаций по устранению существующих тормозов.  Улыбнуло наличие оценки &quot;а еслибы сервера стояли у нас :)&quot;. Всем удачи и  поменьше проблем с производительностью.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div contenteditable=&quot;true&quot; class=&quot;postBody&quot; style=&quot;border-width: 0px; margin: 4px 0px 0px; padding: 0px;&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;</description>
  <comments>http://the-norn.livejournal.com/7226.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/6944.html</guid>
  <pubDate>Thu, 24 Jul 2008 13:18:11 GMT</pubDate>
  <title>Testability...</title>
  <link>http://the-norn.livejournal.com/6944.html</link>
  <description>&lt;p&gt;Здравствуйте.&lt;/p&gt; &lt;p&gt;Тестопригодность,тестируемость,тестабельность(по русски правильно первое, но употребляют чаще последнее) - сложно подобрать однозначное определение этого термина, слишком он с одной стороны&amp;nbsp;размытый а с другой стороны все ясно и понятно, тестопригодность можно определить как &lt;b&gt;степень &lt;/b&gt;&lt;/p&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;div class=&quot;ljcut&quot; text=&quot;Read more...&quot;&gt;&lt;p&gt;&lt;b&gt;легкости/удобства тестирования(любого вида) кода,функционала,требования добавленного/имеющегося в приложении.&lt;/b&gt; Вроде все понятно, имеем требования,функционал, какой то код, оцениваем его на глаз - насколько просто,удобно и быстро будет писать тесты и в принципе все. Оценка на глаз в общем то неплоха, но было бы лучше выработать какие то общие требования для оценки тестопригодности. &lt;/p&gt; &lt;ul&gt; &lt;li&gt;Итак начнем с требований к продукту - требования в первую очередь должны быть последовательными, реальными, недвусмысленными, правильными, логичными, полными, понятными также требования необходимо разделять по ролям и по функционалу на независимые use case (на основе которых будут писаться test case).&lt;/li&gt; &lt;li&gt;Определение архитектуры,дизайна и выбор технологий - на этой стадии очень много подводных камней начиная с выбора технологий - технологии должны быть тестируемы средствами автоматизированного тестирования, технологии должны быть просты в установке, деплое, поддержке, удобстве использования, достаточно распространены(что в принципе гарантирует избавление от вышеперечисленных проблем). Дизайн и архитектура должны выбираться с учетом удобства/быстроты/простоты установки,настройки,работы с конечным продуктом (билдить в течении часа 6 варок в приложении с функционалом движка сайта, затем деплойить их еще минут 20, чтобы проверить 1 тикет - ну извините), в общем нужно еще и о конечных пользователях (причем еще и об админах,тестерах,деплойерах). Также все модули/приложения/части проекта должны каким либо образом покрываться тестами, т.е должна быть возможность их протестировать (использование моков,стабов,эмуляторов и т.д.)&lt;/li&gt; &lt;li&gt;Написание кода - в данном случае оценивать тестопригодность кода нужно с позиций&amp;nbsp;&quot;white box&quot;, модульного и интеграционного тестирования, т.е начиная от надлежащего оформления кода (code conventions) и заканчивая общими правилами (в том числе и паттернами) написания хорошего кода, кстати я уже писал о средствах автоматической оценки тестопригодности кода.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Вот наверное общие вопросы которые необходимы для оценки тестопригодности приложения, с первого взгляда тестопригодность не является критически важным фактором, но с течением времени, вернее с развитием проекта и переходом его в стадию тестирования, деплоя, поддержки, оказывается что очень много времени уходит из-за невозможности протестировать функционал, сложности разворачивания, сложности поддержки и внесения изменений, поэтому очень важно вовремя и адекватно оценить тестопригодность приложения, чтобы заранее принять меры.&lt;/p&gt; &lt;p&gt;Данный пост выражает мое мнение, если есть какие либо возражения, замечания, комментарии ...жду комментов&lt;/p&gt; &lt;/div&gt;</description>
  <comments>http://the-norn.livejournal.com/6944.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/6755.html</guid>
  <pubDate>Tue, 22 Jul 2008 11:59:52 GMT</pubDate>
  <title>Несерьезно об ошибках</title>
  <link>http://the-norn.livejournal.com/6755.html</link>
  <description>&lt;p&gt;Здравствуйте.&lt;/p&gt; &lt;p&gt;Наверное многие уже читали и в блогах и на википедии о различных &quot;необычных&quot; ошибках в частности о гейзенбаге,борбаге и т.д. попробую и я внести свою лепту в классификацию таких ошибок&lt;/p&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;div class=&quot;ljcut&quot; text=&quot;Read more...&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Итак начнем&amp;nbsp;с наиболее часто встречаемого Гейзенбага(heisenbug) - данный тип ошибок назван в честь принципа неопределенности Гейзенберга, который гласит, что процесс наблюдения объекта влияет на свойства объекта.В программах это чаще всего выражается в том, что в процессе отладки приложения сам дебаггер влияет на скорость и выполнение приложения, а соответственно может повлиять на проявление ошибки. Также такой тип ошибок часто проявлялся в unmanaged языках в случае неинициализации переменных(например c  ) в таком случае содержимое переменных приложения после запуска невозможно предугадать.&lt;/p&gt; &lt;p&gt;Борбаг(Bohrbug) - назван в честь физика Бора и его модели атома,данный тип бага является противоположностью гейзенбага, то есть есть четко определенная последовательность действий, которая приводит к проявлению бага, чаще всего правда данная последовательность неизвестна и напоминает танцы с бубном.&lt;/p&gt; &lt;p&gt;Мандельбаг(Mandelbugs) - данный баг назван в честь Мандельброта, ученого, отца основателя фрактальной геометрии, данный баг прежде всего отличается своей непредсказуемостью и недетерменированным поведением, от создания условий для возникновения до проявления ошибки проходит достаточное время (вчера нажал пимпочку а ночью упало) и в результате связь фактически не видна и последствия кажуться проявлением не одного а нескольких взаимосвязанных багов,частным случаем данного бага считают гейзенбаг.&lt;/p&gt; &lt;p&gt;Шрединбаг(Schroedinbugs) - данный баг назван по имени эксперимента Шредингера (кот Шредингера, что ни жив ни мертв),основные признаки в том что программа перестает работать в тот момент, когда кто то найдет баг,читая сырцы или вызовет баг в программе своими действиями. Встречается достаточно часто, например вот сейчас в файрфоксе у меня не работает даунлоад бар, после того как я в настройках профиля удалил настройку пути до закачанных файлов, теперь даунлоад бар просто не отображается а при попытке выбора другой папки падает эксепшн.&lt;/p&gt; &lt;p&gt;Стотл(Stotle) - данный тип багов назван в честь греческого философа Аристотеля, характеризуется этот баг тем, что в результате некорректного ввода данных в программу мы получаем некорректный выход, т.е приложение не проверяет входные данные на адекватность а пользователи бывают разные.&lt;/p&gt; &lt;p&gt;Ошибка Фазы луны (Phase of the moon bug)- этот баг чаще всего связан с каким либо параметром, который оказывается связан с временным явлением или завязан на какие либо другие циклически возникающие факторы. История возникновения данного бага уходит корнями в программу, которая апроксимировала фазы луны и выводила их даты в файл, причем длина строки была ограничена 80 символами и очень редко эта длина превышалась и соответственно другая программа, что считывала эти данные из файла падала, отсюда и пошло - бага Фазы луны. Кстати на этом же типе бага в далекие 80 обжегся CERN - они запускали ускоритель частиц,который долго не хотел работать нормально, оказалась причина была как раз в фазах луны, что своим притяжением изменяла геометрию 27километрового ускоряющего кольца, эта история также называется Местью Ньютона.Также сюда можно отнести проблему Y2K&lt;/p&gt; &lt;p&gt;Статистические баги(Statistical bugs) - данный тип багов проявляется если в программе используются и критически важны рандомные и псевдорандомные последовательности, такие ошибки очень сложно отловить, ибо необходимо запускать и использовать приложение достаточно долго, чтобы ошибка накопилась и проявилась.Довольно часто этот баг появляется в различных системах безопасности, где очень важен алгоритм рандомных чисел, который как иногда оказывается выдает заранее определенные последовательности.&lt;/p&gt; &lt;p&gt;Призрак в коде(Ghost in the code) - данный тип бага практически невозможно обнаружить, он живет в приложении годы после рилиза и проявляется только при определенных событиях и при определенных входных данных, поиск такого бага называется &quot;охота на призрака&quot;&lt;/p&gt; &lt;p&gt;Также с юмором названы и методы поиска таких багов - &quot;пушечная отладка&quot; (Shotgun debugging) - метод при котором в коде делаются произвольные изменения и запуск с проверкой наличия исправления бага, такой метод чаще всего используют в многопоточных приложениях, &quot;программирование по Вуду&quot; - данный метод заключается во внесении в код изменений, смысла которых не понимает сам программист, но надеется на помощь бубна и особой магии....&lt;/p&gt; &lt;p&gt;Всем удачи и поменьше вам трудных багов!&lt;/p&gt; &lt;/div&gt;</description>
  <comments>http://the-norn.livejournal.com/6755.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>8</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/6648.html</guid>
  <pubDate>Mon, 21 Jul 2008 13:02:43 GMT</pubDate>
  <title>Testability</title>
  <link>http://the-norn.livejournal.com/6648.html</link>
  <description>&lt;p&gt;Тестируемость - довольно сложное понятие, в первую очередь под тестируемостью мы понимаем насколько удобно для тестирования (любого вида тестирования) подготовлено(разработано,описано)&lt;/p&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;div class=&quot;ljcut&quot; text=&quot;Read more...&quot;&gt; приложение(требования,описания,исходный код). Оценка тестируемости любого вида достаточно сложный процесс и оценить объективно,всесторонне очень трудно. Например чтобы оценить тестируемость требования к продукту необходимо составить на основе данных требований адекватные use case, на основе которых уже реализовывать test case. На днях наткнулся на интересный инструмент, некую попытку определить тестируемость, увы не заказчика и не разработчика, а всего лишь кода и всего лишь для модульного вида тестирования. Иструмент называется &lt;a href=&quot;http://code.google.com/p/testability-explorer/&quot;&gt;testability-explorer&lt;/a&gt;, работает по принципу анализа java байт кода и определения в нем классов наиболее непригодных для написания модульных тестов. Основными критериями служат оценка цикломатической сложности каждого метода, но вычисляется она не обычным способом а к сложности метода добавляется также сложность коструктора класса (ибо нестатический метод без инстанционирования мы не вызовем) и сложность вызываемых в данном методе других методов и классов, также вычисляется количество статических ссылок на сторонние объекты (без использования инъекции зависимостей) и получается итоговое число которое определяет тестируемость класса. В принципе инструмент достаточно простой для использования, очень легко прикручивается к анту и позволяет генерировать простые и понятные графики, но для практического применения разве что пригоден начинающим разработчикам (ткнуть носом в пахнущий код) или для изучения(цикломатическая сложность,инъекция зависимостей- зачем оно все нужно и где это применять), также иногда интересно посмотреть на устаревший код(боже какой же кал мы писали...)&lt;br /&gt;Отчет выглядит примерно следующим образом( диаграмки кстати генерятся при помощи гугл апи в онлайн)&lt;br /&gt;&lt;a href=&quot;http://pics.livejournal.com/the_norn/pic/0001atzw/&quot;&gt;&lt;img width=&quot;428&quot; height=&quot;391&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;http://pics.livejournal.com/the_norn/pic/0001atzw/s320x240&quot; ilo-full-src=&quot;http://pics.livejournal.com/the_norn/pic/0001atzw/s320x240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
  <comments>http://the-norn.livejournal.com/6648.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/6301.html</guid>
  <pubDate>Wed, 09 Jul 2008 10:31:02 GMT</pubDate>
  <title>Google _ingletone Detector</title>
  <link>http://the-norn.livejournal.com/6301.html</link>
  <description>&lt;p&gt;Всем доброго времени суток. &lt;/p&gt; &lt;p&gt;Паттерн &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%9E%D0%B4%D0%B8%D0%BD%D0%BE%D1%87%D0%BA%D0%B0_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)&quot;&gt;Singleton&lt;/a&gt; или Одиночка очень часто ипользуется&lt;/p&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;div class=&quot;ljcut&quot; text=&quot;Read more...&quot;&gt;&lt;p&gt;.Введите содержимое врезки, у данного шаблона существует достаточно много плюсов например: контролирование количества экземпляров класса, уменьшение количества имен,также&amp;nbsp;его применение&amp;nbsp;позволяет контроллировать глобальные переменные. Из минусов можно упомянуть то что применение данного шаблона повышает связанность, нарушает принцип &lt;a href=&quot;http://en.wikipedia.org/wiki/Single_responsibility_principle&quot;&gt;SRP&lt;/a&gt;, увеличивает сложность тестируемости кода. Это не значит что его не следует использовать, тут главное не увлекаться. Итак третьего дня нашел интересный инструмент от гугла, который позволяет находить в коде этих самых одиночек, причем не просто Singletone но и также Fingletone-ны,Hingletone-ны,Mingletone-ны.И так в чем же разница между этими зверьми.&lt;/p&gt; &lt;p&gt;Singleton&lt;/p&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; Singleton {&lt;br /&gt;  &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; Singleton instance;&lt;br /&gt;&lt;br /&gt;  &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; Singleton getInstance() {&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (instance == &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;) {&lt;br /&gt;      instance = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Singleton();&lt;br /&gt;    }&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; instance;&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Mingleton&lt;/p&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; Mingleton {&lt;br /&gt;  &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; Foo getFoo() {&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; Foo.getDefault(); &lt;br /&gt;    &lt;span class=&quot;rem&quot;&gt;// or return new Foo();&lt;/span&gt;&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Hingleton&lt;/p&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; Hingleton {&lt;br /&gt;  &lt;span class=&quot;kwrd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; Foo instance;&lt;br /&gt;&lt;br /&gt;  &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; Foo getInstance() {&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (instance == &lt;span class=&quot;kwrd&quot;&gt;null&lt;/span&gt;) {&lt;br /&gt;      instance = &lt;span class=&quot;kwrd&quot;&gt;new&lt;/span&gt; Foo();&lt;br /&gt;    }&lt;br /&gt;    &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; instance;&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Fingleton&lt;/p&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;class&lt;/span&gt; Fingleton {&lt;br /&gt;  &lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;static&lt;/span&gt; Foo instance;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Итак как мы видим разница только в том каким образом мы получаем доступ к одиночке, либо через метод стороннего класса, либо через класс хелпер, который поднимает и следит за количеством инстанций синглтона, либо через статическое поле, содержащее&amp;nbsp;синглтон. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href=&quot;http://code.google.com/p/google-singleton-detector/&quot;&gt;Инструмент&lt;/a&gt; работает следующим образом указываем ей путь к классу или jar файлу и дополнительные параметры (если нужны), на выходе инструмент генерирует статистику по по _ingletone-нам и Graphml файл.&lt;/p&gt;&lt;pre class=&quot;csharpcode&quot;&gt;C:\&amp;gt;java -jar gsd.jar C:\src\hibernate\libs\spring.jar C:\sample.graphml -S&lt;br /&gt;&lt;br /&gt;Classes drawn: 70 of 1601&lt;br /&gt;Singletons:    0     Singleton users:    0&lt;br /&gt;Hingletons:    0     Hingleton users:    0&lt;br /&gt;Mingletons:   18     Mingleton users:   27&lt;br /&gt;Fingletons:   15     Fingleton users:   21&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Graphml файл проще сконвертировать при помощи &lt;a href=&quot;http://search.cpan.org/%7Etels/Graph-Easy/bin/graph-easy&quot;&gt;этого&lt;/a&gt;(у меня не вышло по причини отсутствия Linux) или открыть &lt;a href=&quot;http://www.yworks.com/en/products_yed_about.htm&quot;&gt;этим&lt;/a&gt;&amp;nbsp;(качать придеться минимум 12 мб и долго тыкать интерфейс, а также сложно прикрутить к интеграционке)получается примерно следующая картинка &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://pics.livejournal.com/the_norn/pic/000194y0/&quot;&gt;&lt;img width=&quot;258&quot; height=&quot;240&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;http://pics.livejournal.com/the_norn/pic/000194y0/s320x240&quot; ilo-full-src=&quot;http://pics.livejournal.com/the_norn/pic/000194y0/s320x240&quot; /&gt;&lt;/a&gt;&lt;br /&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;на которой мы собсна видим не только _ingletone (цветные прямоугольники)&amp;nbsp;, но и зависимые от них классы (овалы). Удачной всем охоты на одиночек&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
  <comments>http://the-norn.livejournal.com/6301.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/5972.html</guid>
  <pubDate>Fri, 13 Jun 2008 11:18:05 GMT</pubDate>
  <title>Отпуск...</title>
  <link>http://the-norn.livejournal.com/5972.html</link>
  <description>&lt;p&gt;Ушел в &lt;strike&gt;себя &lt;/strike&gt;отпуск, вернусь &lt;strike&gt;нескоро &lt;/strike&gt;через 2 недели, надеюсь интернета в отпуске не будет, за предстоящее безрыбье планирую прочитать туеву хучу книг,что откладывал на свободное время, а также подготовиться к предстоящему минимуму по философии. Всем удачи а также приятной, безконфликтной, безстрессовой&amp;nbsp;работы&amp;nbsp;в мое отсутствие.&lt;/p&gt;</description>
  <comments>http://the-norn.livejournal.com/5972.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/5651.html</guid>
  <pubDate>Tue, 10 Jun 2008 07:29:20 GMT</pubDate>
  <title>Мультибраузерные тесты</title>
  <link>http://the-norn.livejournal.com/5651.html</link>
  <description>&lt;p&gt;Уже не раз писал о создании тестов на селениуме, их оптимизации и различного рода хаков. После написания теста на селениуме возникает вопрос - а почему бы его не запустить на другом браузере отличном от того на котором записывал (firefox&amp;nbsp;обычно или руками), запустить, посмотреть несложно,достаточно поменять лишь строку инициализации селениума в скрипте&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;div class=&quot;wlWriterSmartContent&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline; float: none;&quot;&gt;&lt;pre name=&quot;code&quot; class=&quot;java:nocontrols&quot;&gt;selenium = new DefaultSelenium(&quot;localhost&quot;, SeleniumServer.getDefaultPort(), &quot;*chrome&quot;, url);&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;например на InternetExplorer&lt;br /&gt;&lt;div class=&quot;wlWriterSmartContent&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline; float: none;&quot;&gt;&lt;pre name=&quot;code&quot; class=&quot;java:nocontrols&quot;&gt;selenium = new DefaultSelenium(&quot;localhost&quot;, SeleniumServer.getDefaultPort(), &quot;*iexplorer&quot;, url);&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;или на оперу,сафари,&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;div class=&quot;ljcut&quot; text=&quot;Read more...&quot;&gt;&lt;p&gt;конкверор, также основанные на вышеперечисленных(например Avant или GreenBrowser) и даже нестандартные (обязательна поддержка javaScript). Например запустить тесты под Netscape можно заменив идентификатор браузера в параметрах на следующий&lt;/p&gt;&lt;pre name=&quot;code&quot; class=&quot;java:nocontrols&quot;&gt;*custom c:\Program Files\Netscape\Netscape\Netscp.exe&lt;/pre&gt;только необходимо помнить, что в используемом браузере должен быть установлен, в качестве прокси, адрес селениум сервера.&lt;br /&gt;&lt;p&gt;Это все конечно удобно и просто - поменял строку запуска и уже тесты запускаются в другом браузере, но остается еще несколько проблем&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Чтобы провести тестирование в n браузерах нужно поменять строку запуска n раз и запустить это все вручную&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Необходимо наблюдать за процессом тестирования с целью выявления проблем несовместимости теста с браузером и проблем верстки приложения или несовместимости приложения и браузера&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Проведение&amp;nbsp;мультибраузерных тестов на одной машине займет очень много времени и ресурсов.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Итак для того чтобы решить первую проблему можно использовать параметризованный запуск селениум тестов из ант скрипта, делается это следующим образом:&lt;/p&gt;&lt;br /&gt;&lt;div class=&quot;wlWriterSmartContent&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline; float: none;&quot;&gt;&lt;pre name=&quot;code&quot; class=&quot;xml:nocontrols&quot;&gt;&amp;lt;junit haltonfailure=&quot;yes&quot; haltonerror=&quot;yes&quot; printsummary=&quot;yes&quot; maxmemory=&quot;512m&quot;&amp;gt;&lt;br /&gt;	 &amp;lt;sysproperty key=&quot;SELENIUM_SERVER_HOST&quot; value=&quot;localhost&quot;/&amp;gt;&lt;br /&gt;	 &amp;lt;sysproperty key=&quot;SELENIUM_SERVER_PORT&quot; value=&quot;4444&quot;/&amp;gt;&lt;br /&gt;	 &amp;lt;sysproperty key=&quot;SELENIUM_BROWSER_STARTCOMMAND&quot; value=&quot;*chrome&quot;/&amp;gt;&lt;br /&gt;	&amp;lt;classpath refid=&quot;WebTestsclasspath&quot;/&amp;gt;&lt;br /&gt;	&amp;lt;formatter type=&quot;brief&quot; usefile=&quot;false&quot;/&amp;gt;&lt;br /&gt;	&amp;lt;formatter type=&quot;xml&quot;/&amp;gt;&lt;br /&gt;	&amp;lt;batchtest todir=&quot;output/test-result&quot;&amp;gt;&lt;br /&gt;		&amp;lt;fileset dir=&quot;output&quot; includes=&quot;**/Test.class&quot;/&amp;gt;&lt;br /&gt;	&amp;lt;/batchtest&amp;gt;&lt;br /&gt;&amp;lt;/junit&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;как видно из скрипта помимо стандартной процедуры запуска JUnit добавились команды для передачи в тестируемый скрипт параметров - sysproperty, скрипт теста изменился следующим образом&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;wlWriterSmartContent&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline; float: none;&quot;&gt;&lt;pre name=&quot;code&quot; class=&quot;c:nocontrols&quot;&gt; selenium = new DefaultSelenium(System.getProperty(SELENIUM_SERVER_HOST),&lt;br /&gt;        Integer.parseInt(System.getProperty(SELENIUM_SERVER_PORT)),&lt;br /&gt;        System.getProperty(SELENIUM_BROWSER_STARTCOMMAND),&lt;br /&gt;        url);&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;В итоге&amp;nbsp;у нас получился один параметризованный тест, который мы запускаем и передаем параметры из анта, помимо браузера мы также можем задавать папку для складывания логов (для дальнейшего разбора в каком браузере и как глючит)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Для решения второй проблемы можно использовать возможности языка Java и интеграционного сервера, итак для базовой сверки отображения верстки в браузере мы,создав класс наследник, перегрузим базовые методы селениума, такие как Click и Type и Open&lt;/p&gt;&lt;br /&gt;&lt;div class=&quot;wlWriterSmartContent&quot; contenteditable=&quot;false&quot; style=&quot;margin: 0px; padding: 0px; display: inline; float: none;&quot;&gt;&lt;pre name=&quot;code&quot; class=&quot;java:nocontrols&quot;&gt;    public void click(String locator) {&lt;br /&gt;        super.click(locator);&lt;br /&gt;        ScreenShot();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void open(String url) {&lt;br /&gt;        super.open(url);&lt;br /&gt;        ScreenShot();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void type(String locator, String value) {&lt;br /&gt;        super.type(locator, value);&lt;br /&gt;        ScreenShot();&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    private void ScreenShot()&lt;br /&gt;     {&lt;br /&gt;	java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat(&quot;yyyy-mm-dd-hh-mm&quot;);&lt;br /&gt;	java.util.Date date = new java.util.Date();&lt;br /&gt;	String dd = formatter.format(date);&lt;br /&gt; 	selenium.captureScreenshot(dd + &quot;.png&quot;);&lt;br /&gt;     }&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;В итоге после прохождения теста мы получим набор скриншотов экрана, которые можно просмотреть и оценить отображаемость верстки (кстати при запуске браузеру можно&amp;nbsp;в качестве параметров&amp;nbsp;передавать&amp;nbsp;разрешение в котором он должен открыть), далее все эти скриншоты собираются в архив из того же анта и добавляются в качестве артефактов к текущему билду.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Третью проблему мы можем разрешить при помощи одного из проектов создателей селениума - Selenium Grid, который позволяет распределенно запускать тесты на различного рода платформах и различных браузерах, при этом процедура запуска нисколько не меняется. Принцип работы с SeleniumGrid следующий - запускается хаб, рапределяющий нагрузку между распределенными серверами, затем запускаются седениум сервера с настройками браузеров, в которых может тестировать данный сервер, подключение клиента осуществляется к хабу, который уже перенаправляет на свободный/подходящий селениум сервер (причем названия браузеров мы можем менять - например FirefoxOnLinux, в скрипте инициализации селениума нужно в качестве браузера указать то же самое).Также при запуске тестов на SeleniumGrid необходимо выставлять у junit параметр forked=true а forkmode=pertest, но это только при условии не связанности тестов! В противном случае возможны race condition. Этот параметр позволяет запускать различные тесты параллельно на нескольких машинах одновременно, что позволяет разгрузить интеграционную машину и ускорить проведение тестов.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;В качестве минусов мультибраузерных тестов хочу заметить что не все тесты будут проходить на различных браузерах (например загрузка файлов) но это больше не ограничение селениума а ограничения безопасности по выполнению java script. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Удачного тестирования веб приложений!&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
  <comments>http://the-norn.livejournal.com/5651.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>12</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/5622.html</guid>
  <pubDate>Wed, 04 Jun 2008 11:24:40 GMT</pubDate>
  <title>Зрелость процесса...</title>
  <link>http://the-norn.livejournal.com/5622.html</link>
  <description>&lt;p&gt;Не так давно начал читать прагматичное тестирование, автор довольно интересно выделил фазы зрелости процесса тестирования и сознания тестера...&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Нет разницы между отлаживанием и тестированием, тестирование всего лишь помогает при дебаге, цели у тестирования нет, сопсна как методик и подхода&lt;/li&gt; &lt;li&gt;Цель тестирования показать что ПО работает (напоминает фразу хоть на соплях и с костылями&amp;nbsp;но запускается), в данном случае тестировщик это роль которую играет один из членов команды для выполнения демонстрации заказчику.&lt;/li&gt; &lt;li&gt;Цель тестирования показать что ПО не работает, отсюда уже исходит мотивация найти как можно больше ошибок, которая по большей части поддерживается руководством (премии,поощрения,план), подход в корне неверный и ведет к деградации.&lt;/li&gt; &lt;li&gt;Цель тестирования уменьшить риски возникающие при разработке ПО начиная от неработающего ПО и заканчивая проблемами при развертывании и установке (уже применяются подходы и разнообразные методики)&lt;/li&gt; &lt;li&gt;Тестирование это не просто действие а своего рода дисциплина продуктом которой является высококачественный(под качеством подразумевается удовлетворенные ожидания заказчика) продукт с&amp;nbsp;минимизированными рисками.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;в данный момент по моему видению переползаем с 3 пункта на 4, правда работы и тренингов ой как много предстоит...&lt;/p&gt;</description>
  <comments>http://the-norn.livejournal.com/5622.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>8</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/5215.html</guid>
  <pubDate>Wed, 21 May 2008 11:36:05 GMT</pubDate>
  <title>Оценка времени написания тестов</title>
  <link>http://the-norn.livejournal.com/5215.html</link>
  <description>&lt;blockquote&gt; &lt;p&gt;Очень часто при планировании разработки возникает вопрос - сколько нужно времени, чтобы протестировать тот или иной функционал, немного погуглив нашел несколько способов оценки времени тестирования&lt;/p&gt; &lt;p&gt;1 - Оценка по аналогии, если в процессе тестирования уже был опыт тестирования подобных задач, то оценить можно проведя аналогию с этими задачами, заранее оценив риски и проблемы возникшие ранее.&lt;/p&gt; &lt;p&gt;2 - Экспертная оценка - оценка производиться сторонним экспертом с учетом его опыта (сколько времени ему потребовалось на решение подобных задач) и учетом опыта и профессионализма людей которые будут проводить тестирование&lt;/p&gt; &lt;p&gt;3 - Параметрическая оценка - данный метод больше отонситься к такой метрике как Velocity из терминов XP, использование примерно такое же -&amp;nbsp; например у нас имеется определенный опыт по оценке задач, замеряя среднее значение отношения затраченного времени к запланированному, затем мы проводим планирование и умножаем на полученный параметр.&lt;/p&gt; &lt;p&gt;4 - Оценка по трем точкам&amp;nbsp;-&amp;nbsp; проводим три оценки задачи на тестирование - пессимистическую, оптимистическую и реальную, выводим среднее арифметическое и получаем планируемое время.&lt;/p&gt; &lt;p&gt;5 - Реверсивный анализ - проводим планирование задачи с учетом разнообразных рисков, например при тестировании того или иного объекта имеется риск, что объект или средство тестирования будет вести себя нестабильно, чтобы избежать таких рисков закладываем дополнительный буфер времени для закрытия таких возможных брешей (в этом отношении мне больше понравился метод критической цепи вплане буферов и оценок)&lt;/p&gt; &lt;p&gt;Обычно на практике используем смешанный метод &quot;оценки на глаз&quot; и закладывание буфера с учетом рисков...&lt;/p&gt;&lt;/blockquote&gt;</description>
  <comments>http://the-norn.livejournal.com/5215.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://the-norn.livejournal.com/5060.html</guid>
  <pubDate>Wed, 21 May 2008 10:23:06 GMT</pubDate>
  <title>Метрики.Подробности</title>
  <link>http://the-norn.livejournal.com/5060.html</link>
  <description>Не так давно я уже писал о практическом применении метрик со стороны использования программных средств для их подстчета, но вот о значении их как показателей для кода хотелось бы рассказать подробней. Итак по порядку&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt; &lt;br /&gt; 1)  CCN (Cyclomatic Complexity Number)- цикломатическая сложность кода, данная метрика показывает количество возможных условных вариантов выполнения кода или количества различных путей выполнения(прохождения) метода.Формула вычисления сложности выглядит слудующим образом &lt;br /&gt;&lt;pre&gt;&lt;code&gt;CC = E - N + P, где E- число ребер графа, N число вершин а P - число связанных компонент&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Для кода это число вычисляется так : при встрече каждого условного оператора(if,for,while,case...) прибавляется единица, также единица прибавляется для EntryPoint метода. Например сложность следующего кода равна 3&lt;br /&gt;&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; getValue(&lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; param1) {
  &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;value&lt;/span&gt; = 0;
  &lt;span class=&quot;kwrd&quot;&gt;if&lt;/span&gt; (param1 == 0)  {
    &lt;span class=&quot;kwrd&quot;&gt;value&lt;/span&gt; = 4;
  } &lt;span class=&quot;kwrd&quot;&gt;else&lt;/span&gt; {
    &lt;span class=&quot;kwrd&quot;&gt;value&lt;/span&gt; = 0;
  }
  &lt;span class=&quot;kwrd&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;value&lt;/span&gt;;      
}&lt;/pre&gt;&lt;br /&gt;цикломатическую сложность имеет смысл вычислять только для методов класса так как если например в классе более 30 методов а сложность каждого минимум равна единице, то соответственно суммарная сложность будет 30 и более, что очень много, в данном случае имеет смысл вычислять среднюю сложность класса или проекта а также сложность каждого метода в отдельности.Если говорить о значение, то желательно чтобы оно не превышало 7-10, но это все специфично для каждого проекта и очень сильно зависит от решаемой задачи.Средств для подсчета данной метрики очень много (начиная от взрослых &lt;a href=&quot;http://plugins.intellij.net/category/?category_id=15&quot;&gt;IDE&lt;/a&gt; и заканчивая разнообразными мелкими &lt;a href=&quot;http://www.geocities.com/sivaram_subr/codeanalyzer/description.htm&quot;&gt;разработками&lt;/a&gt; и даже встроенными в язык ).Основной смысл данной метрики это показать программисту ниболее сложные и труднопонимаемые методы классов, которые сложно протестировать, отследить в них ошибку и изменить.Пока писал пост нашел еще одну производную от цикломатической сложности - essential complexity, при ее подсчете используется упрощенные граф кода.&lt;br /&gt;&lt;br /&gt;2) Duplicate lines of code - или CPD(copy paste detector) - дублицируемость кода или наличие в коде повторяемых кусков. Данная метрика нужна в первую очередь для улучшения дизайна,архитектуры приложения, так как наличие копипаста очень плохая практика предполагающая большой объем конечного кода, труднопонимаемость и сложность внесения изменений (изменения приходиться вносить во все места копипаста). Данная практика обычно разрешается применением наследования и полиморфизма. Наиболее рапространенное средство измерения этой метрики это &lt;a href=&quot;http://www.redhillconsulting.com.au/products/simian/&quot;&gt;Simian&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;3)Afferent Coupling, Efferent Coupling, Instability - долго думал как перевести, наиболее близкие понятия оказались в биологии  - центростремительная и центробежная связь, и стабильность. Смысл данных метрик заключается в анализе качества дизайна - определяется количество зависящих и зависимых объектов в определенном фокусе (классы или пакеты). Нестабильность определяется по следующей формуле: Instability = Efferent Coupling / (Efferent Coupling + Afferent Coupling) (0 - очень стабильный,1 -максимально нестабильный). Измеряются данные метрики следующими инструментами: Classycle,NDepend,Jdepend.&lt;br /&gt;&lt;br /&gt;4)Code Coverage - покрытие кода разнообразными тестами, данная метрика определяет отношение между количеством вызванных тестом строк к общему количеству строк метода/класса/пакета. Также помимо просто построчного покрытия есть поблочное/веточное(branch) - которое учитывает блоки или ветки разделенными условными/циклическими операторами. Средств оценки данной метрик очень много, но все они работают примерно одинаково - сначала в исходный код (или промежуточный язык) добавляются (инструментятся,инжектяться,проксируются) специальные операторы логгирования далее прогоняются необходимые тесты и собирается статистика зафиксированная логгерами. Это один из видов метрик который меняет(в некоторых языках) исходный(промежуточный) код (ну есть еще Mutation testing :) ). Средства оценки - Cobertura,Emma,NCover,RCOV. Обычно данная метрика измеряется в процентах, максимальное значение естественно 100%, но это не означает что ошибок нет, это всего лишь значит, что весь исходный код вызывался из тестов (тесты кстати могут быть даже ручные).&lt;br /&gt;&lt;br /&gt;5) Code audit - аудит и проверка кода, данная метрика определяет соответствие написания кода каким либо стандартам и правилам, чаще всего проверяется правильность именования, различные запахи кода (большие классы,методы, дублирование), сложность понимания, возможные ошибки и плохие практики (bad practices). Средства сильно зависят от языка и обычно заточены только под него и под определенные стандарты (обычно это все можно конфигурировать) например FoxCop, FindBugs, PMD, CheckStyle, некоторые из них уже устарели (в связи с устареванием стандартов) но некоторые продолжают быть актуальными использование их очень важно.&lt;br /&gt;&lt;br /&gt;6) Statistics-Based Metrics - различные метрики основанные на текстовой статистике например - LOC(Line of Code),NOM(Number of Methods),Line per Method, Line per Class, Method per Class и многие другие ориентированные на статистику базовых кирпичиков языка. Данные метрики позволяют оценить плохие запахи кода (большой класс, большой метод), но практического применения у меня пока не получалось выделить.&lt;br /&gt;&lt;br /&gt;В завершении хотелось бы сказать что сама идея использования метрик очень интересна, так как они позволяют получить количественные показатели качества кода (&quot;все что измеряемо - управляемо&quot;) , но опять же не нужно перегибать палку, бороться за наилучшие результаты по итогам метрик, делать выводы на основе метрик в отношении людей, и главное давать менеджерам поуправлять на основе них. Метрики могут лишь указать знающему человеку на возможные проблемы в проекте.&lt;p&gt;&lt;br /&gt;</description>
  <comments>http://the-norn.livejournal.com/5060.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
</channel>
</rss>
