tag:blogger.com,1999:blog-82263008945992468812024-03-05T13:13:42.523+02:00SQAdotBYБлог команды борцов за качество программного обеспеченияКоманда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.comBlogger55125tag:blogger.com,1999:blog-8226300894599246881.post-55559245347860226062009-07-06T17:33:00.006+03:002009-07-07T10:51:33.902+03:00Quick look на системы стандартизации. Другие стандартыПредлагаю закончить с системами стандартизации :)<br />Чтобы не складывалось ощущение, что на ГОСТ-ах, ISO и CMMI системы стандартизации закончились, приведем еще несколько примеров и краткую информацию по ним.<br /><span class="fullpost"><br /><b>ASTM International</b> — международная добровольная организация, разрабатывающая и издающая стандарты для материалов, продуктов, систем и услуг.<br /><br />Основана в 1898 г. в США и первоначально занималась стандартами для железных дорог.<br /><br />Сегодня ASTM поддерживает около 12000 стандартов. Стандарты проверяются и переиздаются не реже, чем раз в пять лет.<br /><br />Следование этим стандартам добровольное. В США правительство настоятельно рекомендует использовать эти стандарты везде, где это возможно.<br /><br /><b>Международная электротехническая комиссия</b> (МЭК; англ. International Electrotechnical Commission, IEC) — международная организация по стандартизации в области электрических, электронных и смежных технологий. Некоторые из стандартов МЭК разрабатываются совместно с Международной организацией по стандартизации (ISO).<br /><br />МЭК составлена из представителей национальных служб стандартов. МЭК была основана в 1906 году и в настоящее время в её состав входят более 60 стран. Первоначально комиссия была расположена в Лондоне, с 1948 года имеет штаб в Женеве.<br /><br />МЭК способствовала развитию и распространению стандартов для единиц измерения, особенно гаусса, герца, и вебера. Также комиссия МЭК предложила систему стандартов, которая в конечном счёте стала единицами СИ. В 1938 году был издан международный словарь с целью объединить электрическую терминологию. Эти усилия продолжаются и Международный электротехнический словарь остаётся важной работой в электрических и электронных отраслях промышленности.<br /><br /><b>Институт инженеров электротехники и электроники — IEEE</b> (англ. Institute of Electrical and Electronics Engineers) — международная некоммерческая ассоциация специалистов в области техники, мировой лидер в области разработки стандартов по радиоэлектронике и электротехнике.<br /><br />IEEE издает третью часть технической литературы, касающейся применения компьютеров, управления, электроинженерии, в том числе (январь 2008) 102 реферируемых научных журнала и 36 отраслевых журналов для специалистов, проводит в год более 300 крупных конференций, принимала участие в разработке около 900 действующих стандартов.<br /><br /><b>P.S.</b> Очевидно, что приведенные примеры как-то слабо связаны со стандартами разработки ПО, за исключением IEEE.<br />Поэтому, если у кого-то есть примеры, более близкие к нашей с вами отрасли работы, буду признательна, если поделитесь.<br />Ну и наоборот, если сама что-то буду встречать, тоже обязательно напишу!<br /><br /><b style="color: rgb(255, 0, 0);">UPD:</b><br />Очень полезный комментарий от Алексея Баранцева (для тех, кто не читает комменты, и просто для наглядности):<br /><i>"За что IEEE обидели? IEEE Computer Society (<a href="www.computer.org">www.computer.org</a>) издаёт замечательные журналы. Стандарты их тоже очень даже связаны с разработкой ПО, и даже иногда с тестированием, вспоминаем IEEE 829 Standard for Software Test Documentation."</i><br />Спасибо, Алексей!<br /><br /><i>Всегда ваша,<br />Наташа Искорцева</i><br /></span>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com6tag:blogger.com,1999:blog-8226300894599246881.post-37258955211629259062009-07-02T16:29:00.006+03:002009-07-02T17:14:56.773+03:00Quick look на системы стандартизации. CMMI<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB9ZtmE2cE0Ob7HC23PZAcj_2ahRYPaOYfzfHYL8VWWwqLXlaHlRHfpsgDP91qKGoTAbUe9Fosl4nQHgmXHQe0e3e_b0w-uIgGIykH_itxNQ5d5QD1XZiS1UkMP2oQkskxqSpeG9ZoLz7H/s1600-h/CMMI-logo.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 188px; height: 153px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB9ZtmE2cE0Ob7HC23PZAcj_2ahRYPaOYfzfHYL8VWWwqLXlaHlRHfpsgDP91qKGoTAbUe9Fosl4nQHgmXHQe0e3e_b0w-uIgGIykH_itxNQ5d5QD1XZiS1UkMP2oQkskxqSpeG9ZoLz7H/s200/CMMI-logo.png" alt="" id="BLOGGER_PHOTO_ID_5353856331653564530" border="0" /></a><br />И снова здравствуйте!<br />Предлагаю продолжить обозревать системы стандартизации. И на этот раз вашему вниманию предлагается CMMI.<br /><span class="fullpost"><br /><b>Модель зрелости процесса разработки</b> (Capability Maturity Model) создана в Software Engineering Institute. <b>CMM</b> – это не технология, а средство оценки, используемое для определения зрелости технологии в организации по пятибалльной шкале.<br /><br />CMM дает очень подробный обзор всего, что могло бы (но необязательно должно; это зависит от специфики проекта и организации) быть частью процесса разработки или дополнения программы в зрелой организации. К сожалению, многие организации и CMM-оценщики интерпретируют это в том смысле, что чем больше артефактов и задач используется (приравнивание к высокой формализованности), тем лучше процесс. Однако прибавление к процессу ненужных артефактов и задач просто для того, чтобы получить более высокую оценку по шкале SEI CMM, ведет к перегрузке процесса, который становится громоздким и неэффективным. Из-за чрезмерного акцента на рецензировании, инспектированиях, традиционных задачах по оценке качества и подробном планировании CMM имеет нежелательный эффект, заключающийся в поощрении использования каскадного, а не итеративного подхода, поскольку он не заставляет определять проблемы на ранних стадиях и проводить интеграцию и тестирование непрерывно.<br /><br />Чтобы разрешить эту проблему, SEI (Software Engineering Institute) была предложена <b>SEI CMMI</b> (Capability Maturity Model Integration), которая более эффективно приспособлена к лучшему современному опыту, такому как проведение управляемой рисками разработки и итеративный подход. Вместо поощрения создания большей формализованности (как это делается в CMM), CMMI поощряет пользователей делать акцент на отдельных областях для улучшений, которые лучше всего отвечают деловым целям организации и минимизируют присущие организации области риска.<br /><br /><span style="font-size:130%;"><b>Уровни зрелости</b></span><br /><br /><b style="color: rgb(255, 0, 0);">Уровень 1</b>: <b>Начальный, нулевой уровень.</b> Работники действуют исхода из своих личных представлений о целях работы. Отсутствуют внутренние регулирующие документы. Действия не документируются, бизнес-знания не отделены от работников (знания пропадают при увольнении работников). Бизнес-процессы в организации не описаны и, соответственно, не классифицированы. Деятельность компании непрозрачна даже для основного персонала.<br /><br /><b style="color: rgb(255, 0, 0);">Уровень 2</b>: <b>Уровень осознания.</b> Руководство компании решило превзойти начальный уровень. Появляются внутренние стандарты, описывающие основные бизнес-процессы компании. Возникает повторяемость: выполнение новых проектов основывается на опыте выполнения предыдущих проектов.<br /><br /><b style="color: rgb(255, 0, 0);">Уровень 3</b>: <b>Уровень управляемости.</b> В организации задокументированы и стандартизированы все бизнес-процессы. Система управления оказывается отделенной от всего персонала организации, т.е. появляется внутренний «свод законов». Этим законам следует весь персонал организации, включая топ-менеджмент.<br /><br /><b style="color: rgb(255, 0, 0);">Уровень 4</b>: <b>Уровень измеряемости.</b> В компании вводится количественная система оценки эффективности бизнес-процессов (используются как финансовые, так и натуральные показатели). Одновременно используется та или иная система оценки работы персонала, например, система ключевых показателей. Обе системы, описание бизнес-процессов и оценки персонала синхронизированы между собой - эффективная деятельность компании приводит к стимулированию персонала.<br /><br /><b style="color: rgb(255, 0, 0);">Уровень 5</b>: <b>Уровень совершенствования.</b> На основе анализа количественных показателей в компании проводится корректировка (реинжиниринг) бизнес-процессов. Коррекции отражаются во внутренних документах. Важно то, что процесс коррекции носит постоянный, системный характер.<br /><br /><span style="font-size:130%;"><b>Разница ISO и CMM</b></span><br /><br /><b>ISO</b> - это стандарт качества любых процессов, будь то выпуск мороженного или разработка программного обеспечения, а <b>CMM</b> - модель качества, специально соотнесенная с процессом разработки ПО. <b>CMM</b> - большой многоступенчатый стандарт качества, охватывающий весь цикл разработки программного обеспечения: от проектирования и до внедрения. Он годится и для оптимизации и для улучшения качества выпускаемого ПО.<br /><br />CMMI Online Browser: <a href="http://www.blogger.com/www.cmmi.de">www.cmmi.de</a><br />Еще о CMMI можно читать <a href="http://www.sei.cmu.edu/cmmi/">на сайте самого SEI</a><br /><br /><span style="font-style:italic;">Всегда ваша,<br />Наташа Искорцева</span><br /><br /></span>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com2tag:blogger.com,1999:blog-8226300894599246881.post-46941599800013045872009-06-29T09:24:00.011+03:002009-06-29T10:05:53.047+03:00QTP: DP в 60-ти простых слайдах<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_F_79DqY1b3n2CQKtjOjkIstm-m8tjY8eBTEtoH4hUISxDCzuqdR0zotp70jC4jyX8eLobkBg6hOYVH8FDc1Qlm5lAQAzdHgryCzqWgoZnChqxPqwSXK_ClYSVFRRU4cr32Jk5uF0Xgj2/s1600-h/DP+in+60+slides.JPG"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 150px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_F_79DqY1b3n2CQKtjOjkIstm-m8tjY8eBTEtoH4hUISxDCzuqdR0zotp70jC4jyX8eLobkBg6hOYVH8FDc1Qlm5lAQAzdHgryCzqWgoZnChqxPqwSXK_ClYSVFRRU4cr32Jk5uF0Xgj2/s200/DP+in+60+slides.JPG" alt="" id="BLOGGER_PHOTO_ID_5352635576317817810" border="0" /></a><br /><br /><span style="font-style: italic;"><br />Автор: Yaron Assa<br />Перевод: Сергей Талалаев (<a href="http://sqadotby.blogspot.com/2009/06/dp-60.html">SQAdotBY</a>)<br />Оригинальная публикация: <a href="http://www.advancedqtp.com/knowledge-base/articles/qtp-tricks4/descriptive-programming/dp-101-slides/">DP in 60 slides</a><br /></span><br /><br /><br /><br />Расширяя и углубляя сотрудничество с ресурсом <a href="http://advancedqtp.com/">AdvancedQTP.com</a> и с разрешения автора, хотел бы представить вниманию коллег <a href="http://www.slideshare.net/yassa/qtp-descriptive-programming-russian?type=powerpoint">перевод</a> очень полезной презентации с данного сайта.<br /><br />В рамках данной небольшой презентации автор умудрился разложить по полочкам ключевые моменты Дескрипторного Программирования (DP) применяемого в QTP. Причем сделал это с драйвом и без лишней воды.<br /><span class="fullpost"><br />Сейчас для меня эти принципы кажутся настолько же очевидными и понятными насколько они были туманны и запутанны в момент начала изучения QTP :) Именно для того, чтобы сократить путь от тумана к полной ясности я перевел эту презентацию и уверен, что она вас не разочарует.<br /></span>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com0tag:blogger.com,1999:blog-8226300894599246881.post-88859173408721193272009-06-19T17:10:00.004+03:002009-06-19T17:55:40.938+03:00BYSTQB быть!!!<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs7YvASu97lPwakGTfWUZCKgrGwwo-ATBzRGfczeIHn6qs6amunwbJxoAL2fUu_StDAt63okjG0dTdznxk5OqaJea6N6Ecjm7a__FH2VyW2V069dTQm8MSnBmFjebeOhJyH4SI-H1_Hlzj/s1600-h/Viena_1.JPG"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs7YvASu97lPwakGTfWUZCKgrGwwo-ATBzRGfczeIHn6qs6amunwbJxoAL2fUu_StDAt63okjG0dTdznxk5OqaJea6N6Ecjm7a__FH2VyW2V069dTQm8MSnBmFjebeOhJyH4SI-H1_Hlzj/s200/Viena_1.JPG" style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 132px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs7YvASu97lPwakGTfWUZCKgrGwwo-ATBzRGfczeIHn6qs6amunwbJxoAL2fUu_StDAt63okjG0dTdznxk5OqaJea6N6Ecjm7a__FH2VyW2V069dTQm8MSnBmFjebeOhJyH4SI-H1_Hlzj/s200/Viena_1.JPG" alt="" id="BLOGGER_PHOTO_ID_5349041048544800738" border="0" /></a><br /><br />Уважаемые коллеги, наконец свершилось событие, к которому мы так упорно стремились.<br />Cегодня в Вене была официально утверждена белорусская коллегия тестировщиков - <b>BySQTB</b>.<br /><br /><span class="fullpost"><br />Спасибо всем, кто вместе с нами работал над осуществлением этого проекта. Надеемся, что наше успешное сотрудничество продолжится и в дальнейшем.<br /><br />Утверджение нашей коллегии дает нам шанс не только получить доступ к сертификационным, тренинговым, информационным и другим ресурсам в рамках ISTQB, но также (что гораздо важнее) выступает катализатором формирования профессионального сообщества тестировщиков в нашей стране.<br /><br />Мы уверены, что вместе нам по силам многие амбициозные проекты :)<br /><br /><i>С уважением,<br />команда SQAdotBY</i><br /></span>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com3tag:blogger.com,1999:blog-8226300894599246881.post-11199773829550250992009-06-12T14:17:00.003+03:002009-06-12T14:25:34.871+03:00На шаг ближе к основанию BySTQB9-го июня 2009 года в 18:00, в конференц-зале, любезно предоставленном компанией Exigen Services, состоялось очередное собрание инициативной группы по созданию национального представительства ISTQB в Беларуси.<br /><span class="fullpost"><br />Инициативная группа присутствовала на встрече в практически полном составе: Наталья Искорцева, Сергей Талалаев, Алексей Мартынюк, Ирина Тетерук, Алексей Лемешев, Александр Воронович, Сергей Ревко, Сергей Полаженко.<br /><br />Основной целью собрания стало обсуждение текущих вопросов, связанных с регистрацией BySTQB, и подготовка к встрече с представителями заинтересованных компаний.<br />Во время собрания был повторно вынесен на обсуждение текст Конституции создаваемой национальной коллегии ISTQB, предварительно оговорена процедура принятия новых членов группы, описанная в 3-м подразделе Конституции. Инициативная группа рассмотрела варианты взаимодействия с ПВТ, в рамках их предложения о сотрудничестве, а также регламент встречи с представителями заинтересованных компаний. На повестке дня была озвучена ближайшая задача группы после создания национальной коллегии BySTQB по переводу на русский язык Syllabus-a – программы сертификации базовго уровня тестировщиков ПО.<br /><br />В результате встречи было решено окончательно согласовать текст Конституции национальной коллегии ISTQB, а также провести встречу с заинтересованными представителями компаний.<br /><br /></span><div style="text-align: right;"><span class="fullpost"><span style="font-style: italic;">По материалам новости от<br />Ирины Тетерук и Сергея Полаженко,<br />опубликованной на ресурсе <a href="http://www.sqa.by/index.php?option=com_content&view=article&id=17:2009-05-29-12-23-09">www.sqa.by</a></span></span><br /></div>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com3tag:blogger.com,1999:blog-8226300894599246881.post-15147042029337924522009-06-11T14:27:00.003+03:002009-06-11T14:57:39.872+03:00Quick look на системы стандартизации. ISO<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgm5StDNjNSnWLaVgjEAOSONDipWGlpsxD55Nkrgi2zLXX9RN-oWcx9pyCJ6nHX-TNyqiH2vGZeVtpRnVzc3x-q7X80P_CbGuIXQb4ZHUxrMhc03-xse7grTTs-HHGTc-MnHS4FvzPHuvan/s1600-h/ISO.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 54px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgm5StDNjNSnWLaVgjEAOSONDipWGlpsxD55Nkrgi2zLXX9RN-oWcx9pyCJ6nHX-TNyqiH2vGZeVtpRnVzc3x-q7X80P_CbGuIXQb4ZHUxrMhc03-xse7grTTs-HHGTc-MnHS4FvzPHuvan/s200/ISO.jpg" alt="" id="BLOGGER_PHOTO_ID_5346037580915879682" border="0" /></a><br />Доброго времени суток, коллеги.<br />Снова вернемся к стандартам - на этот раз пройдемся по ISO и сделаем небольшой обзор.<br /><br /><span class="fullpost"><br /><b>Международная организация по стандартизации</b> (International Organization for Standardization, ISO) — международная организация, занимающаяся выпуском стандартов.<br /><br />Международная организация по стандартизации создана в 1946 двадцатью пятью национальными организациями по стандартизации. Фактически её работа началась с 1947. СССР был одним из основателей организации, постоянным членом руководящих органов, дважды представитель Госстандарта избирался председателем организации.<br /><br />При создании организации и выборе её названия учитывалась необходимость того, чтобы аббревиатура наименования звучала одинаково на всех языках. Для этого было решено использовать греческое слово isos — равный, вот почему на всех языках мира Международная организация по стандартизации имеет краткое название ISO (ИСО).<br /><br />Сфера деятельности ИСО касается стандартизации во всех областях, кроме электротехники и электроники, относящихся к компетенции Международной электротехнической комиссии (МЭК, IEC). Некоторые виды работ выполняются совместными усилиями этих организаций. Кроме стандартизации ИСО занимается проблемами сертификации.<br /><br /><b>ИСО определяет свои задачи следующим образом</b>: содействие развитию стандартизации и смежных видов деятельности в мире с целью обеспечения международного обмена товарами и услугами, а также развития сотрудничества в интеллектуальной, научно-технической и экономической областях.<br /><br />По ISO, <b>качество</b> - это полнота свойств и характеристик продукта, процесса или услуги, которые обеспечивают способность удовлетворять заявленным или подразумеваемым потребностям.<br /><br /><span style="font-size:130%;"><b>ISO 9000</b></span><br /><br /><b>ISO 9000</b> — серия международных стандартов ISO, регламентирующих управление качеством на предприятиях.<br /><br />Система стандартов разработана Международной Организацией по Стандартизации (ISO, International Organization for Standardization), которая основывалась на разработках Британского института стандартов BS 5750.<br /><br />Стандарты ISO 9000, принятые более чем 90 странами мира, применимы к любым предприятиям, независимо от их размера и сферы деятельности. Сама ISO не производит сертификацию по ISO 9000, этим занимаются специально сформированные аудиторские организации в отдельных странах. Фактически сертификация производится не по ISO 9000, а по спецификации <b>ISO 9001:2000</b>.<br /><br /><b>Сертификат ISO 9000 необходим предприятиям</b>:<br /> * работающим на международных рынках или с международными поставщиками, которые требуют наличия такого сертификата;<br /> * работающим в секторах экономики, регулируемых правительством, или с правительственными организациями стран, в которых наличие сертификата ISO 9000 является обязательным.<br /><br />В некоторых странах предприятия должны иметь сертификат ISO 9000 для того, чтобы предлагать свою продукцию не только правительственным организациям, но и потребителям определённых сегментов.<br /><br />Стандарт <b>не гарантирует качество</b> продукции.<br /><b>Цель ISO 9000</b> — внести согласованность и объективность в действия системы контроля качества поставщика. Предполагается, что ISO 9000 будет использоваться в отношениях между компаниями, обычно в форме потребитель/поставщик. Стандарт помогает компаниям формализовать их систему управления процессом проверки качества и соответствия продукции.<br /><br /><span style="font-size:130%;"><b>Версии ISO 9000</b></span><br /><br />В действительности ISO 9000 объединяет три стандарта:<br /> * ISO 9000:2005 — Системы менеджмента качества. Основные положения и словарь<br /> * ISO 9001:2000 — Системы менеджмента качества. Требования<br /> * ISO 9004:2000 — Системы менеджмента качества. Рекомендации по улучшению деятельности<br /><br />К стандартам этой серии также можно отнести ISO 19011:2003 — Рекомендации по аудиту систем менеджмента качества и/или охраны окружающей среды.<br /><br />Конечные цифры в обозначении версии стандарта соответствуют году принятия, например:<br /> * ISO 9000:1987 — совпадал с BS 5750, определял три модели управления качеством.<br /> * ISO 9000:1994<br /> * ISO 9000:2000<br /><br />В основу построения организационной системы по ISO 9000-2000 закладываются следующие принципы:<br /> * Концентрация на потребностях заказчика.<br /> * Активная лидирующая роль руководства.<br /> * Вовлечение исполнителей в процессы совершенствования.<br /> * Реализация процессного подхода.<br /> * Системный подход к управлению.<br /> * Обеспечение непрерывных улучшений.<br /> * Принятие решений на основе фактов.<br /> * Взаимовыгодные отношения с поставщиками.<br /><br /><span style="font-size:130%;"><b>Защита от дурака</b></span><br /><br />В европейском бизнес-сообществе считается, что наличие сертификации ISO подтверждает безупречную организацию бизнес-процесса в фирме на всех его стадиях - от проектирования деятельности до послепродажного обслуживания и информационного обеспечения.<br /><br />Так называемая философия управления качеством ISO требует, чтобы были устранены причины, которые привели к изготовлению некачественной продукции. Ведь невозможно гарантировать высокое качество продукции, если после обнаружения недостатков не выявлена и полностью не устранена причина их возникновения.<br /><br />А главной причиной брака в работе обычно являются чьи-то неправильные действия. Чтобы их не допустить или по крайне мере свести к минимуму, согласно философии ISO нужно формализовать все процессы. То есть <i>описать в специальных документах их алгоритм</i>. Ведь управлять и вмешиваться в технологию можно только в том случае, когда процессы формализованы и документированы.<br /><br />Если вы руководитель и при этом уверены, что все ваши подчиненные без всякой сертификации понимают, что, когда и в каком порядке нужно делать, - вы наверняка ошибаетесь. Всем людям хотя бы время от времени нужны инструкции для достижения однозначного понимания выполняемых функций, сокращения эмоциональных и энергетических затрат на «обдумывание» элементарных действий. Можно выразиться и по-другому. Сертификация - это защита от «дурака», который обязательно что-нибудь перепутает.<br /><br />Официальный сайт ISO: <a href="http://www.iso.org/iso/home.htm">http://www.iso.org/iso/home.htm</a><br /><br /><i>Всегда ваша,<br />Наташа Искорцева</i><br /></span>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com2tag:blogger.com,1999:blog-8226300894599246881.post-42273348945855288192009-06-11T00:01:00.002+03:002009-06-11T09:37:21.664+03:0010 Причин провала автоматизации<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkSKCZxQvBZ3C87bzT0ZHCPRIFC58EBBwSb5gzmHfUJ0RrQ8xRHzQcKU1QzCQNEahIHo8W-rQoUBX5QR71za9uK_bIBKz9bgs1tbWDttjDvGpgFrU4VPRPhVpY43cNnzWgV7j5gPxc8Hcr/s1600-h/TeamWork.jpg"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 124px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkSKCZxQvBZ3C87bzT0ZHCPRIFC58EBBwSb5gzmHfUJ0RrQ8xRHzQcKU1QzCQNEahIHo8W-rQoUBX5QR71za9uK_bIBKz9bgs1tbWDttjDvGpgFrU4VPRPhVpY43cNnzWgV7j5gPxc8Hcr/s200/TeamWork.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5345953352077057682" /></a><br /><br /><span style="font-style: italic;"><br />Автор: Shrini Kulkarni<br />Перевод: Сергей Талалаев (<a href="http://sqadotby.blogspot.com/2009/05/qtp-gui.html">SQAdotBY</a>)<br />Оригинальная статья: <a href="http://shrinik.blogspot.com/2009/05/10-ways-to-make-automation-difficult-or.html">10 ways to make automation difficult or ineffective</a><br /></span><br /><br />Нашему коллеге, сформулировавашему эту десятку причин можно ставить памятник при жизни (согласен со всем на 100%). А глядя в его мудрые грустные глаза понимаешь, что расхлебывал все это он сам лично "Вот этими вот руками..." :)<br /><br />Однозначно можно распечатывать и вешать на стенку.<br /><br /><span class="fullpost"><br />10. Безумное желание о 100% автоматизации<br /><br />9. Попытка автоматизировать существующие тест кейсы без тщательного анализа на предмет их пригодности к автоматизации<br /><br />8. Линейное сопоставление тест кейсов и скриптов 1:1 – становясь жертвой обманчивого удобства в контроле над изменениями и отчетности.<br /><br />7. Создания проекта автоматизации игнорируя модель “снизу-вверх”, нечеткое разбиение проекта на функциональные части.<br /><br />6. Использование только одного типа автоматизации или фокусировка только на одном слое приложения – чем больше вы отдаляетесь от кода, тем хуже он становится<br /><br />5. Фокусировка только на задачах, связанных с выполнением тестов<br /><br />4. Использование автоматизации как скриптования – игнорируя общепринятые практики разработки ПО.<br /><br />3. Отказ от привлечения разработчиков на начальной стадии – не стремясь к улучшению тестируемости или автоматизируемости приложения<br /><br />2. Погружение в атоматизацию ради ускорения тестирования или сокращения издержек до решения существующих проблем – неоднозначности, неэффективности и отсутствия целостности.<br /><br />1. Отказ от поиска правильной пропорции между ручным и автоматизированным тестированием.<br /><br />0. Использование автоматизации в качестве средства выявления ошибок<br /><br /></span>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com5tag:blogger.com,1999:blog-8226300894599246881.post-35833072868254763222009-06-10T17:57:00.004+03:002009-06-10T18:15:09.648+03:00Quick look на системы стандартизации. ГОСТВернемся к системам стандартизации. Начнем с ГОСТ-ов.<br />Представляю вашему вниманию информацию, собранную из разных источников, сгруппированную и слегка обработанную.<br /><br />Возможно, для кого-то она будет полезной...<br /><br /><span class="fullpost"><br /><b>ГОСТ</b> (Государственный стандарт) — одна из основных категорий стандартов в СССР, сегодня межгосударственный стандарт в СНГ. Принимается Межгосударственным советом по стандартизации, метрологии и сертификации (МГС).<br /><br />В советские времена все ГОСТ являлись обязательными для применения в тех областях, которые определялись преамбулой самого стандарта.<br /><br />Стандарт имеет силу (если не заменён национальным стандартом) в следующих странах:<br /><br /> * Азербайджанская Республика<br /> * Республика Армения<br /> * Республика Беларусь<br /> * Республика Грузия<br /> * Республика Казахстан<br /> * Киргизская Республика<br /> * Республика Молдова<br /> * Российская Федерация<br /> * Республика Таджикистан<br /> * Туркменистан<br /> * Республика Узбекистан<br /> * Украина<br /><br />Национальный стандарт РБ - <b>СТБ</b>.<br /><br />Национальный орган по стандартизации - Комитет по стандартизации, метрологии и сертификации при Совете Министров Республики Беларусь.<br /><br />А вот и полезные ссылки, касающиеся ГОСТ-ов по разработке ИС, АС, ПС: <br /><a href="http://www.admhmao.ru/inform/law/zakon_gost.htm">http://www.admhmao.ru/inform/law/zakon_gost.htm</a><br /><a href="http://www.e-school.ru/index.php?a=project&sub=8">http://www.e-school.ru/index.php?a=project&sub=8</a><br /><a href="http://www.internet-law.ru/law/gosts/">http://www.internet-law.ru/law/gosts/</a><br /><br /><i>Всегда ваша,<br />Наташа Искорцева</i><br /><br /></span>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com0tag:blogger.com,1999:blog-8226300894599246881.post-3189220520521477322009-06-08T21:56:00.006+03:002009-06-10T12:22:04.728+03:00ISTQB: цели, миссия, задачи<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOAbbPxNOlFk6OxWPSd-pEcKsCAkaeyzHXEpmOlXEg-N8X3QWEjxOF0hkkA0oImghlynnx7Ycf90ImBiKIFA4o6-hhqAEauTIpDI5Q9mMu3-1sI3CDgCNIz_9MOQrfPdYx6OeU18c31pIh/s1600-h/ISTQB.png"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 149px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOAbbPxNOlFk6OxWPSd-pEcKsCAkaeyzHXEpmOlXEg-N8X3QWEjxOF0hkkA0oImghlynnx7Ycf90ImBiKIFA4o6-hhqAEauTIpDI5Q9mMu3-1sI3CDgCNIz_9MOQrfPdYx6OeU18c31pIh/s200/ISTQB.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5345039763492301426" /></a><br /><br />Уважаемые коллеги, последовательно продвигаясь к светлой цели (перенос мировой столицы тестирования в Минск, если кто забыл) предлагаем вашему вниманию очередную порцию информации о такой известной организаци как Международная коллегия тестировщиков (ISTQB).<br /><br /><span class="fullpost"><br />ISTQB (International Software Testing Qualifications Board ) – это Международная Коллегия по Квалификации Тестировщиков Программного Обеспечения (далее ISTQB), которая была официально основана в Эдинбурге в 2002 году. На данный момент ISTQB входят 42 национальные коллегии с различных уголков света. ISTQB и все национальные коллегии являются независимыми и некоммерческими организациями.<br /><br />Организация ISTQB ялвляется создателем и несет ответственность за международную программу квалификации, называемую "ISTQB Certified Tester". В рамках программы разработана иерархия квалификаций, соответствующие программы обучения, а также правила для аккредитации, проведения тренингов и экзаменов. Процесс аккредитации и сертификации регулируется официально утвержденными правилами национальных коллегий.<br /><br />Задачей ISTQB и всех национальных коллегий является поддержка единой общепринятой международной программы квалификации, разработанной ISTQB для профессионалов в сфере тестирования ПО. На основе программы составляются курсы, которые проводят инструкторы, аккредитованные национальными коллегиями. Каждый курс завершается экзаменом, который охватывает содержание всей программы, с выдачей сертификата "ISTQB Certified Tester" в случае успешного результата (может выдаваться местный вариант сертификата с логотипом соответствия нормам ISTQB). <br /><br />Задачи ISTQB и каждой национальной коллегии: <br />1. Гарантирование качества и актуальности программы учебных курсов<br />2. Разработка и определение основной международной программы курсов для каждой квалификации<br />3. Определение и поддержка структуры экзаменов и свода правил<br />4. Определение и поддержка правил и положений аккредитации (для организаций, предоставляющих инструкторов/преподавателей)<br />5. Определение и поддержка правил и положений сертификации<br />6. Определение и поддержка правил и положений проходного балла для успешной сдачи экзамена<br />7. Мониторинг соблюдения национальными коллегиями правил и положений ISTQB <br />8. Прием и исключение национальных коллегий в/из ISTQB <br /><br />Цели международной программы по квалификации тестировщиков ПО и международной коллегий по тестированию ПО:<br />1. Унифицировать умения и навыки специалистов по тестированию в разных странах<br />2. Создать общее понимание предмета тестирования в европейских/ мультинациональных проектах<br />3. Увеличить количество сертифицированных специалистов по всему миру<br />4. Развивать и продвигать общее пониманиепроцесса тестирования и знания по этому процессу через программу курсов и единого словаря терминов<br />5. Продвигать тестирование ПО как отдельную профессию<br />6. Увеличить эффективность в плане затрат (программу курсов и экзаменационные вопросы можно использовать, просто переведя на нужный язык; не нужно изобретать колесо)<br />7. Больше людей/мыслей/идей для создания общих материалов (экзаменационные вопросы, программа)<br />8. Специалистам тестирования ПО не обязательно знать английский язык, чтобы получить необходимую квалификацию<br />9. Международное признание специалистов тестирования ПО и их квалификаций, благодаря участию людей из разных стран<br />10. Экономическая выгода для организаций, предоставляющих инструкторов, преподавателей и консультантов<br /><br /><b>ISTQB Certified Tester</b> – это первая и единственная международная программа, которая позволяет получить дальнейшее образование в сфере тестирования ПО. Она обладает следующими преимуществами:<br />1. Стандартизировать развития карьеры в сфере тестирования ПО<br />2. Добиться признания процесса тестирования ПО, как важнейшей специализации в сфере разработки ПО<br />3. Дать возможность профессиональным специалистам в сфере тестирования ПО быть признанными работодателями, клиентами и пользователями<br />4. Постоянно продвигать лучшие практики в тестировании ПО среди всех ИТ дисциплин<br />5. Определять наиболее важные и «горячие» темы в сфере тестирования ПО<br />6. Давать право производителям ПО нанимать сертифицированных специалистов, тем самым получая коммерческое преимущество на конкурентами и рекламируя свою политику найми специалистов тестирования<br />7. Обеспечить возможность специалистам тестирования ПО или тем, кто интересуется данным направлением, получать квалифицированные знания по данному предмету<br /><br />Основной уровень программы предназначен для всех, кто вовлечен в тестирование ПО: тестировщиков, аналитиков по тестированию, консультантов по тестированию, менеджеров по тестированию, программистов, а также ориентирован на получение базовых знаний в области тестировании ПО для проектных менеджеров, IT менеджеров, бизнес аналитиков и др.<br /><br />Статья написана по материалам источников:<br /><a href="http://www.istqb.org/index.htm">http://www.istqb.org/index.htm</a><br /><a href="http://www.astqb.org/">http://www.astqb.org/</a><br /><br /></span>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com12tag:blogger.com,1999:blog-8226300894599246881.post-85058418958867995652009-06-01T10:01:00.000+03:002009-06-01T10:01:38.209+03:00Разоблачение Excel: Работа со справочниками<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqIYxAtJuVTh0mIrRs4LkGgYow-RUQj9wfkk8u_SsBATWsNjtxso8YR4Eaw02LRUCEMTuM2JISXDT3TZq5WcgAcX3rPiVjjLRkSAfa8YWWxRzUUMo1fJMrcKgNt9yQO-KCO7dQHqT3-6js/s1600-h/Lookups1.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 152px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqIYxAtJuVTh0mIrRs4LkGgYow-RUQj9wfkk8u_SsBATWsNjtxso8YR4Eaw02LRUCEMTuM2JISXDT3TZq5WcgAcX3rPiVjjLRkSAfa8YWWxRzUUMo1fJMrcKgNt9yQO-KCO7dQHqT3-6js/s320/Lookups1.jpg" alt="" id="BLOGGER_PHOTO_ID_5340012994593577298" border="0" /></a><br />Для меня слово справочник прочно асcоциировано со школьными таблицами Брадиса (кто-нибудь еще помнит такие или я последний из могикан?) и это воспоминание непременно вызывает улыбку и светлые чувства.<br />Но могу предположить, в том числе и из собственного опыта, что тестирование задач завязанное на справочную информацию (особенно большого объема) вызывает прямо противоположные чувства. Поэтому, если данная статья поможет высушить хотя бы одну слезинку тестировщика - я буду считать, что цель достигнута :)<br /><br /><span class="fullpost"><br /><strong>1. Введение</strong><br /><br />Приступая к написанию очередной статьи, хотелось бы выразить свое восхищение моим коллегам, работающим в области тестирования систем принятия решений, страхования, налогообложения и т.д. и т.п.<br />Всем тем, кому приходится кропотливо перебирать информацию из <b>справочников</b>, скрупулезно высчитывать бесконечные формулы и пытаться сопоставить магию требований с не менее искусной магией реализованного функционала.<br /><br /><strong>2. Справочники и с чем их едят</strong><br /><br />Каждый, даже людям далеким от IT сферы приходится ежедневно сталкиваться с данной функциональностью ежедневно. Не верите - тогда небольшой тест. Есть ли у вас затруднения с пониманием следующих фраз?<br />- Основная валюта USA – это USD<br />- КГБ и ДМБ хоть и звучат похоже, но страшно далеки друг от друга<br />- DE, FR, IT, AU – кто-то здесь не из EU<br /><br />Уверен, что проблем с прочтением и пониманием ни у кого не возникло. Что собственно и говорит о том, что справочники прочно вошли в нашу повседневную жизнь, выйдя за рамки узкоспециализированной области. Если же все-таки трудности возникли, то они легко разрешимы с помощью следующей таблицы:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgof1rVL6UBj1q5m895oB-PISSzibQxSuEkHllSYURZHrw_YEtNTjYjcpW3LYZHQKIwyEfEULNUwKIWe5AaNIdxMUu2EGhC1twr_dmQ9fYgr1VG9i-58OUk1OFMeO_oBoAVkkzSm7wRZvEG/s1600-h/Lookups2.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 358px; height: 201px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgof1rVL6UBj1q5m895oB-PISSzibQxSuEkHllSYURZHrw_YEtNTjYjcpW3LYZHQKIwyEfEULNUwKIWe5AaNIdxMUu2EGhC1twr_dmQ9fYgr1VG9i-58OUk1OFMeO_oBoAVkkzSm7wRZvEG/s400/Lookups2.jpg" alt="" id="BLOGGER_PHOTO_ID_5340113953231780338" border="0" /></a><br /><br />которая собственно и является типичным представителем семейства ”справочниковых”.<br />То есть в общем случае справочник – это таблица, из которой по значению выделенного столбца (код) можно однозначно извлечь соотвествующие ему данные.<br /><br />Если начать копать глубже в сторону БД, что мы увидим, что там без справочников просто нельзя и шагу ступить. Но тема нашей статьи не теория реляционных БД, а практика работы с Eхcel, поэтому предлагаю в очередной раз посмотреть, что же мы можем сделать, имея в руках только <span style="text-decoration: line-through;">молоток и гвозди</span> Microsoft Office и светлую голову.<br /><br /><strong>3. Чем может порадовать Excel?</strong><br /><br />Как я говорил в своей <a href="http://sqadotby.blogspot.com/2009/04/excel.html">предыдущей</a> статье Excel – это конечно не полноценная БД, но все-таки некоторые “базовские” функции присутствуют. Для работы со справочниками есть целый набор функций, доступный для выбранной категории “Lookup & Reference”<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZkTf7Ziys1mwqgXzixiZWFTV62J6iyhWvV3RVgiyM3AxFp6LqpY7pFD-cd1U5Cc1Ya8iWLggbo6Dvjij4LQ2kF6Q1lBaHZLQKPQ5YlVLRKxBXh1s1hUQSwk3uYQte_qadmItfW3KTZi5c/s1600-h/Lookups3.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 342px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZkTf7Ziys1mwqgXzixiZWFTV62J6iyhWvV3RVgiyM3AxFp6LqpY7pFD-cd1U5Cc1Ya8iWLggbo6Dvjij4LQ2kF6Q1lBaHZLQKPQ5YlVLRKxBXh1s1hUQSwk3uYQte_qadmItfW3KTZi5c/s400/Lookups3.jpg" alt="" id="BLOGGER_PHOTO_ID_5340132361696556898" border="0" /></a><br /><br />Нас с вами будут интересовать 2-е из них – VLOOKUP и HLOOKUP. Эти функции в целом схожи и различаются лишь направлением поиска (вертикальным и горизонтальным соответственно). Для большинства из нас более естественным является горизонтальное расположение строк и вертикальное – столбцов, поэтому все примеры будут основаны на использовании функции VLOOKUP, реализующей работу именно с таким вариантом.<br /><br /><strong>4. Варианты реализации</strong><br /><br />Для начала обрисуем себе цель нашей авантюры, то есть что же мы хотим получить в обмен на наши мучения.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG7M2qMUrjCGGV5OhJiojw18LIeefbTgEBLKa7K-x0sx4T8QbiI-K-qZyxOJisIVUUEDbKtjCb21SsccpQEdVMwT67j0MIAd-vAayLA90gr56YRNQuZ7vJkenJyaaYophpxP3jz6Frxi0G/s1600-h/Lookups4.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 149px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG7M2qMUrjCGGV5OhJiojw18LIeefbTgEBLKa7K-x0sx4T8QbiI-K-qZyxOJisIVUUEDbKtjCb21SsccpQEdVMwT67j0MIAd-vAayLA90gr56YRNQuZ7vJkenJyaaYophpxP3jz6Frxi0G/s400/Lookups4.JPG" alt="" id="BLOGGER_PHOTO_ID_5340132454761345394" border="0" /></a><br /><br />В качестве примера я выбрал реализацию обработки кода штата в адресе компании с показом полного названия в соседней ячейке. В данном случае я использовал валидацию вводимых кодов, о реализации которой вы можете прочитать в <a href="http://sqadotby.blogspot.com/2009/04/excel.html">предыдущей статье</a> (не смог удержаться).<br /><br />Пример на чей-то взгляд может показаться надуманным, но тем не менее он достаточно презентабельный, чтобы служить учебным пособием.<br /><br /><strong>4.1. Попроще</strong><br /><br />Итак, более простой вариант использования предполагает, что каждому коду соответствует одна уникальная запись в таблице. Я, как вы уже поняли, для пособия взял список Американских штатов (прикольные у них названия и в интернете полно информации в табличном виде):<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi42fPBV6MiQ-qHI1fNaKGVBDDGHttapeazWGInIGJyPRcS1gwpQrhlkbecqDykGFbuJGbCIGbiqP-wGD-FM04caJEMZjyCF0pN6kzVp20Y7MUsYUU08zX1KIjvkDAo2A4GSk4vuEjiTdLf/s1600-h/Lookups5.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 81px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi42fPBV6MiQ-qHI1fNaKGVBDDGHttapeazWGInIGJyPRcS1gwpQrhlkbecqDykGFbuJGbCIGbiqP-wGD-FM04caJEMZjyCF0pN6kzVp20Y7MUsYUU08zX1KIjvkDAo2A4GSk4vuEjiTdLf/s400/Lookups5.JPG" alt="" id="BLOGGER_PHOTO_ID_5340132533663686642" border="0" /></a><br /><br />Для удобства работы со списком выносим его на отдельную страницу и помечаем как именованный диапазон<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidyHI3rxqfQa4EkK7B_dqgPAHeGrH_Gw6c0nfjipvRy-RCeaxbSdT51C09-EUo1EL22vFnb2MSCUL2VhLxfJG9eTq18iPvfIWfkGGJd91bKRpHlXFkHRGkPxFHVkEkx8PJCY_4Z5PidaQF/s1600-h/Lookups6.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 386px; height: 146px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidyHI3rxqfQa4EkK7B_dqgPAHeGrH_Gw6c0nfjipvRy-RCeaxbSdT51C09-EUo1EL22vFnb2MSCUL2VhLxfJG9eTq18iPvfIWfkGGJd91bKRpHlXFkHRGkPxFHVkEkx8PJCY_4Z5PidaQF/s400/Lookups6.JPG" alt="" id="BLOGGER_PHOTO_ID_5340132619718154050" border="0" /></a><br /><br />После этого единственное, что нам остается сделать – это определить откуда мы берем код для поиска и что мы хотим видеть взамен этого кода. В итоге получим следующее выражение:<br /><br /><div style="text-align: center;">=VLOOKUP(B2 ; Список_Штатов ; 2 ; FALSE)</div><br /><br /><b>B2</b> – это ячейка с кодом<br /><b>Список_Штатов</b> – это наш справочник, в котором нам интересна 2-ая колонка с полным названием штата<br /><br />Будьте внимательны с последним параметром!!!<br />Последний параметр (<b>FALSЕ</b>) определяет правило поиска кода:<br />- Если он равен TRUE или пропущен – ищется ближайший вариант<br />- Если он равен FALSE – поиск ведется на полное соответствие<br /><br />Попробуйте поиграть с этим параметром, чтобы, так сказать, почувствовать разницу.<br /><br />Кстати, никто не обратил внимание, чего еще не хватает во входных параметрах функции VLOOKUP для полноты картины? А откуда она узнает в каком столбце нашего справочника содержится имено код?<br />А вот это уже ваша прямая обязаннность – обеспечить чтобы столбец с кодами был <b>первым</b> столбцом нашего справочника<br /><br /><strong>4.2. Посложнее</strong><br /><br />В усложненном варианте вместо кода уже появляется такое понятие как диапазон значений и уже каждому диапазону соответсвует какая-либо запись.<br />Типичным примером может служить таблица значений повышающего коеффициента для расчета страховых взносов в зависимости от возраста автомобиля.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3ujUMbRLOYnZB7tw0JKHKQdfSVz3eNbwuwhYfsSpgvjQRG6DjAltXHEcxKyxsSdC86q01vcZHvipPB1qUBEUPcmt1vRB7otW8YtIsQHHFZMZMMsGEt3dbQ2vCNlIhO0qm5xMioVuiwhEe/s1600-h/Lookups7.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 304px; height: 102px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3ujUMbRLOYnZB7tw0JKHKQdfSVz3eNbwuwhYfsSpgvjQRG6DjAltXHEcxKyxsSdC86q01vcZHvipPB1qUBEUPcmt1vRB7otW8YtIsQHHFZMZMMsGEt3dbQ2vCNlIhO0qm5xMioVuiwhEe/s400/Lookups7.JPG" alt="" id="BLOGGER_PHOTO_ID_5340132727340932882" border="0" /></a><br /><br />Для расчета вручную информации достаточно, и затруднений сам расчет не вызывает. Но для использования в качестве входа для автоматического расчета нам потребуется немного преобразовать данную таблицу.<br /><br />Правило преобразования несложное и основывается на том, что при поиске подходящего значения (в данном случае уже имеется ввиду поиск приближенного значения) ищется ближайшее меньшее или равное искомому коду. А если по-русски и без заумных фраз, то<br />• для каждой пары вида ”A – B” должно остатья первое значение – ”A”<br />• выражения вида >A следут заменить на величину A+1<br />• выражения вида <A следут заменить на Min(A), то есть минимально допустимое значение<br /><br />В итоге получаем следующую таблицу:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAQ7EznTnv95lHl_ahCqGS_HBpeYQ6_Dvt5gSvyOz4ElsUJxuOkXgK4XALYr8XsCu_upj1DLgNrCEmD5D-pmY5dgOC9DPl6HeWspwOnFxVvsKFAlQ-09oVzlCN8IzeephQK9GvM2PBqml3/s1600-h/Lookups8.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 304px; height: 101px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAQ7EznTnv95lHl_ahCqGS_HBpeYQ6_Dvt5gSvyOz4ElsUJxuOkXgK4XALYr8XsCu_upj1DLgNrCEmD5D-pmY5dgOC9DPl6HeWspwOnFxVvsKFAlQ-09oVzlCN8IzeephQK9GvM2PBqml3/s400/Lookups8.JPG" alt="" id="BLOGGER_PHOTO_ID_5340132792309030370" border="0" /></a><br /><br />И формула для расчета ”возрастной добавки” будет выглядеть следующим образом<br /><br /><div style="text-align: center;">=VLOOKUP(D10 ; Возраст_автомобиля; 2 ; TRUE)</div><br /><br /><b>D10</b> – это ячейка с кодом<br /><b>Возраст_автомбиля</b> – наш доведенный до ума справочник<br /><br />И обратите внимание на последний параметр – он теперь имеет значение TRUE, что указывает на правило поиска приближенного, а не точного значения.<br /><br /><strong>4.3. Высший пилотаж</strong><br /><br />Изложение материала в предыдущих параграфах начиналось словами ”каждому коду … или каждому диапазону …”. То есть основное предположение состоит в том, что у нас есть уникальное значение с одной стороны и набор дополнительной информации для него с другой.<br /><br />Рассмотрим теперь ситуацию, когда мы не сможем опираться на такой удобный посыл. Предположим, что выбор искомой информации зависит от набора ключевых значений, например сильно упрощенная схема расчета страховой премии на страхование автомобиля в США зависит от следующих параметров:<br />- возраст автомобиля: 1-3, 4-7, 8-10, >10<br />- пол водителя (плевать они хотели на гендерное равенство): М, Ж<br />- стаж водителя: <2, 2-5, >5<br /><br /><br />Полный набор всех вариантов даже в таком ужатом варианте содержит 24 записи, для каждого из которых есть соотвествующий коэфициент для расчет страховой премии. Как же в этом случае поможет известная нам функция VLOOKUP, которая не работает с набором ключей, а принимает на вход лишь одиночный код.<br /><br />Ответ – никак … без предварительной подгонки. Чем мы с вами и займемся чуть дальше.<br /><br />Подгонка будет заключаться в создании дополнительного поля с кодом, уникально определяющего каждый набор, например<br />1-3, M, <2 преобразуется в 1M0<br />4-7, М, 2-5 преобразуется в 11Ж2<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUaA0NuER7d0VzZ8OIV3P3VGBnCHXW388IVMast1yIzaMAUYI17B4RBj3wD6iSYFdnvq74nsGw6ol-_qerXL4cSxWoJdljCsPoyB7DCfuS64p2QeUfkjFeNbxt__FcNuKt1zpYbavtYFk0/s1600-h/Lookups9.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 87px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUaA0NuER7d0VzZ8OIV3P3VGBnCHXW388IVMast1yIzaMAUYI17B4RBj3wD6iSYFdnvq74nsGw6ol-_qerXL4cSxWoJdljCsPoyB7DCfuS64p2QeUfkjFeNbxt__FcNuKt1zpYbavtYFk0/s400/Lookups9.JPG" alt="" id="BLOGGER_PHOTO_ID_5340132867147954498" border="0" /></a><br /><br /><strong>5. Хитрости и трюки</strong><br /><br />В принцпипе, информации полученной из предыдущих примеров достаточно, чтобы покрыть большинство случаев использования справочников. Но в качестве дополнительного бонуса (на сладкое так сказать) хотел бы предложить найденные в ходе работы интересности, связанные с изложенным материалом.<br /><br /><strong>5.1. Использование столбца кода для валидации</strong><br /><br />В нашем первом примере со штатами мы в ответ на введенный код штата хотим получить его полное название. Естесвенным желанием было бы обезопасить себя от неправильно введеного кода, тем более что все коды у нас присутствуют в нашем справочнике и у нас есть необходимые знания (вспоминаем <a href="http://sqadotby.blogspot.com/2009/04/excel.html">здесь</a>), чтобы организовать выпадающий список для кодов.<br /><br />Если бы не одно но – при организации списка валидации нам необходимо указать источник для наполнения выпадающего списка и этот источник не может быть 2-х мерной таблицей коим является наш справочник Список_Штатов. О чем вам незамедлительно сообщит Excel<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_HyQOWfJcfmENi4SC36ltK1gz1Nn9_NjMng7r0S07egpohXwO1q6TFnWr5UeqrY5H2K-_IVlneZQ_hUChWJ2QRLDeLiVIpAG69wTC1OmfzoyP1Uwbws6qd2F3k8VngQY8ukfHX_WbhiLZ/s1600-h/Lookups10.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 102px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_HyQOWfJcfmENi4SC36ltK1gz1Nn9_NjMng7r0S07egpohXwO1q6TFnWr5UeqrY5H2K-_IVlneZQ_hUChWJ2QRLDeLiVIpAG69wTC1OmfzoyP1Uwbws6qd2F3k8VngQY8ukfHX_WbhiLZ/s400/Lookups10.JPG" alt="" id="BLOGGER_PHOTO_ID_5340132946807777586" border="0" /></a><br /><br />Казалось бы единственным правильным вариантом будет дополнительно определить именованный диапазон только для столбца кодов, но с точки зрения правильного лентяя хотелось бы найти более элегантный вариант. И он есть :)<br />В поле источника данных следует указать такое выражение:<br /><br /><div style="text-align: center;">=INDEX(Список_Штатов,0,1)</div><br /><br />И “золотой ключик у вас в кармане”.<br /><br /><strong>5.2. Связанные справочники</strong><br /><br />Прием больше подходящий к разделу трюков, чем хитростей, но тем не менее иногда полезный (знаю лично один такой случай).<br /><br />В нашем сакраментальном примере с адресом помимо штата присутсвует также поле Город. И было бы достаточно интересно реализовать выпадающий список городов в зависимости от выбранного штата. Задача не совсем для Excel, но тем не менее поддается решению без привлечения тяжелой артилериии в лице VBA.<br /><br />Все, что нам надо сделать – это подготовить именованные списки городов включающие в себя код штата, например<br />Города_FL для Флориды,<br />Города_TX для Техаса<br />И познакомится с еще одной замечательной фукцией <b>INDIRECT</b>, позволяющей формировать стандартную Excel-ссылку из строкового значения.<br /><br />В итоге выражение для валидации будет выглядеть следующим образом:<br /><br /><div style="text-align: center;">=INDEX(INDIRECT("Города_"&B2);0;2)</div><br /><br /><b>B2</b> – адрес ячейки с выбранным кодом штата<br />И в реальной жизни выглядеть это будет вот так:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxhry5ZKAh9z41Lp6ZnIyxF0MVXnY94wGirH343VY2AVljxIddkj2ZZI-OXOa96Enx2NSUpv30eulh7JNYkv18PKH2uR7bYHbJh3OnU62wuslBpG1VAukG5kyQO_IchO4X5lARIT8HWuWE/s1600-h/Lookups11.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 166px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxhry5ZKAh9z41Lp6ZnIyxF0MVXnY94wGirH343VY2AVljxIddkj2ZZI-OXOa96Enx2NSUpv30eulh7JNYkv18PKH2uR7bYHbJh3OnU62wuslBpG1VAukG5kyQO_IchO4X5lARIT8HWuWE/s400/Lookups11.JPG" alt="" id="BLOGGER_PHOTO_ID_5340133020113643378" border="0" /></a><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga4HU8yLB-6mhYIm7zmoP2On3lb44Zip0HIwYFKTRBqFUBojyzgVbo67i4HEbomSbIl7TAyfMskx5CFQbYIL4vphyCGSH18BCPcvHqqPNgrrSL39uI9F80fp5hmzofgIuQ4aWlC0IbQMW9/s1600-h/Lookups12.JPG"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 165px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga4HU8yLB-6mhYIm7zmoP2On3lb44Zip0HIwYFKTRBqFUBojyzgVbo67i4HEbomSbIl7TAyfMskx5CFQbYIL4vphyCGSH18BCPcvHqqPNgrrSL39uI9F80fp5hmzofgIuQ4aWlC0IbQMW9/s400/Lookups12.JPG" alt="" id="BLOGGER_PHOTO_ID_5340133108038641330" border="0" /></a><br /><br /><strong>6. Выводы</strong><br /><br />Коллеги, я постарался изложить в статье все наработки, связанные с тестированием алгоритмов, основанных на справочных таблицах. Нам данная техника очень помогла при тестировании весьма непростых систем расчета страховых взносов. Очень надеюсь, что и вам эта информация в чем-то окажется полезной.<br /><br />Понимая, что теория без практики плохо осаждается даже в светлых головах, вместе с данным материалом вы найдете <a href="http://www.2shared.com/file/5962660/2941a757/Demistifying_Excel_-_Lookups.html">Excel-файл</a> со всеми реализованными в статье примерами.<br /><br /></span>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com1tag:blogger.com,1999:blog-8226300894599246881.post-38100752137747140172009-05-29T14:07:00.009+03:002009-06-11T17:35:46.313+03:00Материалы по подготовке к экзамену на сертификат ISTQBНет времени идти на курсы по сертификации?<br />Курсы дороги?<br />Не доверяете преподавателям?<br />Надеетесь на свои силы и хотите подготовиться к сертификации самостоятельно?<br /><br />Можно!<br /><span class="fullpost"><br /><br />Материалы, собранные по крупицам на просторах интернета (спасибо моей коллеге Катерине еще раз):<br /><br /><a href="http://www.2shared.com/file/5998865/be580967/ISTQB_Materials_1.html">Порция 1</a><br /><a href="http://www.2shared.com/file/5999175/102e64cc/ISTQB_Materials_2.htm">Порция 2</a><br /><a href="http://www.2shared.com/file/5999219/4d843138/ISTQB_Materials_3.html">Порция 3</a><br /><br /><br />И официальный список литературы, который, поверьте, будет полезен не только как учебное пособие к сертификации:<br /><br />Если вы планируете сдавать только на 1-ый уровень, то список очень короткий:<br /><a href="http://www.amazon.com/Software-Testing-Foundations-Certified-Tester/dp/1933952083/ref=sr_1_3?ie=UTF8&s=books&qid=1243325288&sr=8-3">Software Testing Foundations</a> – first level (basic)<br /><br />Если будут планы продолжить углублять знания, то:<br /><a href="http://www.amazon.com/Advanced-Software-Testing-Certification-Rockynook/dp/1933952199/ref=pd_sim_b_5">Advanced Software Testing</a> - <a href="http://www.amazon.com/Advanced-Software-Testing-Certification-Rockynook/dp/1933952199/ref=pd_sim_b_5">Vol. 1</a> and <a href="http://www.amazon.com/Advanced-Software-Testing-Certification-Manager/dp/1933952369/ref=pd_sim_b_6">Vol. 2</a> – second level (advanced)<br /><a href="http://www.amazon.com/Software-Testing-Practice-Management-Certified/dp/193395213X/ref=pd_bxgy_b_img_c">Software Testing Process: Test Management</a> – management branch<br /><a href="http://www.amazon.com/Software-Test-Engineers-Handbook-Certificates/dp/1933952245/ref=pd_bxgy_b_img_b">The Software Test Engineer's Handbook</a> – technical testing branch<br /><br />Официально сам ISTQB предлагает для подготовки к экзаменам использовать <a href="http://www.istqb.org/downloads/syllabi/SyllabusFoundation.pdf">Syllabus</a>, но он всего лишь даст вам представление, о чем будет идти беседа, но не глубокие знания предмета.<br />В принципе, в 80% случаев имеющегося опыта и знаний оказывается достаточно для сдачи на первый уровень.<br /><br />Дерзайте!<br /><br />P.S. Большое спаисбо также нашим Российским колегам за бережно собранную <a href="http://www.rstqb.org/index.php?id=25,0&sitelang=ru">информацию</a>.<br /><br />С уважением,<br />Сергей Талалаев<br /><br /></span>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com4tag:blogger.com,1999:blog-8226300894599246881.post-26586734248924678872009-05-26T18:28:00.007+03:002009-06-10T12:22:26.837+03:00Экзамен на сертификат ISTQB всего за 100 евро! Еще можно успеть!<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVFIZmRQQVT_fzQBb6dVqpe2Tn_ksPvYnOw0Zj0Z1pL6fORWsCGczNIfv9_jlHpKwVF5BDMYBCkcIiKF_s3NKIuAKZeFSJKYxiUDZdHN5RxF-01OCsumWdTE3Zke26f8U8PMqmSurIEibh/s1600-h/CT_01.png"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 149px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVFIZmRQQVT_fzQBb6dVqpe2Tn_ksPvYnOw0Zj0Z1pL6fORWsCGczNIfv9_jlHpKwVF5BDMYBCkcIiKF_s3NKIuAKZeFSJKYxiUDZdHN5RxF-01OCsumWdTE3Zke26f8U8PMqmSurIEibh/s200/CT_01.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5340159113091622994" /></a><br />Друзья, мы сами поздно узнали, поэтому поздно делимся информацией с вами.<br />Однако, еще есть шанс успеть сдать экзамен на <span style="font-weight: bold;">сертификат ISTQB</span> всего за полцены - <span style="font-weight: bold;">100 евро</span>, и в родном городе <span style="font-weight: bold;">Минске</span>!<br /><br />Вот подробная информация!<br /><br /><span style="font-weight: bold;">4 June 2009: Public ISTQB examination<br /></span>The International Software Quality Institute holds a public ISTQB Foundation Level examination on <span style="font-weight: bold;">4 June 2009</span> <span style="font-weight: bold;">from 5pm to 6pm in Minsk</span>. The exam will be in English language.<br />For this exam in Belarus iSQI offers a special price, so the exam fee per person is 100 Euro.<br />The exam is a multiple choice test and lasts 60 minutes. In order to pass the exam, the examinee must get at least 65% of the total credits.<br />The basis of the exam is the ISTQB <a href="http://www.istqb.org/downloads/syllabi/SyllabusFoundation.pdf">syllabus</a>.<br /><span style="font-weight: bold;"></span><br />To take the exam a formal <span style="font-weight: bold;">registration until 1 June 2009 is necessary</span>. Please fill in the registration <a href="http://www.isqi.org/en/certification/certified-tester/foundationlevel/%20registration/">form </a> and send it to iSQI. This is possible either by fax to 0049 331 23181010 or as scanned copy to <a href="mailto:certification@isqi.org">certification@isqi.org</a>. For further questions please contact Ms. Silvia Huhse (<a href="mailto:silvia.huhse@isqi.org">silvia.huhse@isqi.org</a>).<br /><br />Это уже второй экзамен, который проводится по сертификации в Минске.<br />Первый экзамен был проведен 27 января компанией <a href="http://www.gasq.org/">GASQ</a>.<br /><br />Спешите!Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com5tag:blogger.com,1999:blog-8226300894599246881.post-73564473238743990742009-05-15T17:49:00.013+03:002009-05-15T18:22:41.042+03:00Стандарты, модели, методологии - краткий обзор<div style="text-align: right;"><span style="font-style: italic;">Выражаю огромную благодарность всем интернет-источникам, специалистам, ведущим блоги и участвующих в обсуждениях на форумах, всей перечитанной литературе, и особенно Алексею Баранцеву за научный подход к тестированию и вообще, и Сергею Орлику за его перевод SWEBOK-а.</span><br /></div><br />- Мы разрабатываем софт по ISO...<br />- А мы по RUP-у...<br />- А у нас всех на Agile переводят...<br />- Ой, а мы только спиральную модель используем...<br /><br />Эти и другие высказывания можно услышать, если завести разговор о разработке ПО в контексте стандартов, моделей и методологий.<br />При этом как сами разработчики/тестировщики не всегда могут понять и уж тем более объяснить разницу между этими понятиями, так и в литературе и интернет источниках все крайне запутано... Методологии разработки смешиваются с моделями жизненного цикла ПО, модели - с системами стандартизации, стандарты - с методологиями и так без конца.<br /><br />Я мучаюсь этим вопросом уже некоторое время как. Но, кажется, наконец, истина где-то рядом...<br /><span class="fullpost"><br /><br /><span style="font-weight: bold;font-size:130%;" >Стандарты</span><br /><br /><span style="font-weight: bold;">Стандарт </span>(от англ. standard — норма, образец) в широком смысле слова — образец, эталон, модель, принимаемые за исходные для сопоставления с ними других подобных объектов.<br /><br />* Стандарт как нормативно-технический документ устанавливает комплекс норм, правил, требований к объекту стандартизации, в котором в целях добровольного или обязательного многократного использования устанавливаются характеристики продукции, правила осуществления и характеристики процессов производства, эксплуатации, хранения, перевозки, реализации и утилизации, выполнения работ или оказания услуг.<br />Стандарт может быть разработан как на материальные предметы (продукцию, эталоны, образцы веществ), так и на нормы, правила, требования в различных областях.<br /></span><span class="fullpost">* </span><span class="fullpost">В переносном смысле — шаблон, трафарет, не содержащий ничего оригинального.<br /><br /><span style="font-weight: bold;">Виды стандартов</span>:<br />* Международный стандарт<br />* Отраслевой стандарт<br />* Стандарт фирмы, стандарт производителя<br />* Стандарт качества<br />* Социальный стандарт<br /><br /><span style="font-weight: bold;">Системы стандартизации</span>:<br />* ГОСТ<br />* ISO<br />* CMMI<br /><br /><br /><span style="font-weight: bold;"><span style="font-size:130%;">Модели жизненного цикла</span><br /><br /></span>Что такое жизненный цикл, на пальцах объясняет Алексей Баранцев в своей статье <a href="http://itblogs.ru/blogs/barancev/archive/tags/_4004300437044004300431043E0442043A043004_+_1F041E04_/default.aspx">"Жизненный цикл разработки программного обеспечения -- что бы это значило?"</a><br />А более сухое определение звучит примерно так:<br /><blockquote style="font-style: italic;"><span style="font-weight: bold;">Жизненный цикл информационной системы</span> — период времени, который начинается с момента принятия решения о необходимости создания информационной системы и заканчивается в момент ее полного изъятия из эксплуатации.</blockquote><blockquote style="font-style: italic;"><span style="font-weight: bold;">Модель жизненного цикла</span> — структура, определяющая последовательность выполнения и взаимосвязи процессов, действий и задач на протяжении жизненного цикла. Модель жизненного цикла зависит от специфики, масштаба и сложности проекта и специфики условий, в которых система создается и функционирует.</blockquote><span style="font-weight: bold;">Модели жизненного цикла ПО</span>:<br />* Водопадная<br />* Каскадная<br />* Спиральная<br /><br />Чтобы предупредить нападки по поводу отсутствия инкрементальной или итеративной модели разработки, сразу приведу в пример цитату из SWEBOK.<br /><blockquote style="font-style: italic;">Мартин Фаулер [Фаулер, 2004, с.47] пишет:<br />"Итеративную разработку называют по-разному: инкрементальной, спиральной, эволюционной и постепенной. Разные люди вкладывают в эти термины разный смысл, но эти различия не имеют широкого признания и не так важны, как противостояние итеративного метода и метода водопада."</blockquote>А почему я разделила водопад и каскад - будет чуть позже в посте, посвященном специально моделям ЖЦПО.<br /><br /><span style="font-weight: bold;font-size:130%;" >Взаимосвязь стандартов и моделей</span><br /><br />Стандарт регламентирует состав процессов жизненного цикла ИС. Он определяет структуру жизненного цикла, содержащую процессы, действия и задачи, которые должны быть выполнены во время создания ИС.<br /><br />Каждый процесс разделен на набор действий, каждое действие — на набор задач. Каждый процесс, действие или задача инициируется и выполняется другим процессом по мере необходимости, причем не существует заранее определенных последовательностей выполнения. Связи по входным данным при этом сохраняются.<br /><br />На каждой стадии могут выполняться несколько процессов, определенных в стандарте, и наоборот, один и тот же процесс может выполняться на различных стадиях. Соотношение между процессами и стадиями также определяется используемой моделью жизненного цикла ИС.<br /><br /><span style="font-weight: bold;font-size:130%;" >Взаимосвязь моделей и методологий</span><br /><br />Опять же - словами из SWEBOK:<br /><blockquote><span style="font-style: italic;">Организация ролей (ответственности членов проектной команды), детализация этапов жизненного цикла и процессов, определение активов (артефактов), значимых на разных этапах проекта, практики анализа и предупреждения рисков – все это вопросы уже конкретного процессного фреймворка или, как принято говорить, методологии разработки.</span><br /><br /></blockquote><span style="font-weight: bold;"><span style="font-size:130%;">Методологии разработки ПО</span><br /><br /></span>И так плавно мы перешли к методологиям разработки ПО. Сейчас просто перечислю, что к ним можно отнести:<br /><br />* RUP (Rational Unified Process)<br />* EUP (Enterprise Unified Process)<br />* MSF (Microsoft Solutions Framework)<br />* XP (eXtream Programming)<br />* RAD (Rapid Application Development)<br />* SCRUM<br />* FDD (Feature Driven Development)<br />* DSDM (Dynamic Systems Development Method)<br />* и др...<br /><br />Выше я всего лишь попыталась разделить понятия стандартов, моделей и методологий, показать их взаимосвязь, а также привести некоторые примеры. В следующих постах я пройдусь подробнее по каждой из этих областей.<br /><br /><span style="font-style: italic;">Всегда ваша,</span><br /><span style="font-style: italic;">Наташа Искорева (Густыр) </span><br /></span>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com0tag:blogger.com,1999:blog-8226300894599246881.post-65263276193581233002009-05-14T14:53:00.004+03:002009-05-14T15:10:01.035+03:00Первый курс в БГУИР пройден успешно!<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRHO3JOfggN-i5DuQBagNYU3WMoh5PkEZNCBPjGJp6QAHDdkuWMofq4YkV6mhWK1bWwKn3azWf375k4N_up-kKKHRkC2wO_zrYhQfgTsq3h7lNww4-jkY06h3uoTlbJ4qF917sK5gTQ_v8/s1600-h/Sertificat.jpg"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 143px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRHO3JOfggN-i5DuQBagNYU3WMoh5PkEZNCBPjGJp6QAHDdkuWMofq4YkV6mhWK1bWwKn3azWf375k4N_up-kKKHRkC2wO_zrYhQfgTsq3h7lNww4-jkY06h3uoTlbJ4qF917sK5gTQ_v8/s200/Sertificat.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5335647087375486066" /></a><br />Так и хочется сказать, мол, выходим снова на взлетную :)<br />Но нет - конец семестра, и студентов сейчас будет уже не собрать. <br />Так что, уважаемые, - до осеннего призыва! :)<br /><br />И все-таки несколько слов о пройденном этапе...<br /><span class="fullpost"><br />Группа 14 человек. До финиша дошли все :)<br />Курс проходил в виде факультатива, поэтому из кабинетов на меня смотрели только заинтересованные пары глаз...<br />Встречались на протяжении 3-х месяцев 2 раза в неделю по часу. В следующий раз попробуем новый формат - попытаемся отчитать курс по интенсивному графику за неделю. Мне почему-то кажется, что так будет эффективнее.<br />Было достаточно практики: научились составлять всевозможную документацию по тестированию (документы по работе с требованиями, планы, сценарии, листы проверки, отчеты о дефектах, другие отчеты). Научились проводить статическое тестирование требований, и делать это в команде, прошли полный цикл тесирования - от работы требованиями до финальных отчетов по проекту. Учились тестировать рационально и находить "хорошие" ошибки. Сделали много вспомогательных заданий, с помощью которых стали ясны сложные вещи типа классов эквивалентности. Как говорится, учились на кошках :)<br />И многое-многое другое!<br /><br />Студенческие шутки, уловки на проверочных работах, душевная атмосфера - все это также помогло нам финишировать успешно и без потерь!<br /><br />Сегодня в торжественной обстановке все студенты получили свои законные сертификаты. Кажется, тоже остались довольны :)<br /><br />Будем продолжать в том же духе!<br /><br />Всегда ваша,<br />Наташа Искорцева (Густыр)<br /></span>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com7tag:blogger.com,1999:blog-8226300894599246881.post-30386708071466680092009-05-12T09:14:00.030+03:002009-05-12T14:59:02.520+03:00QTP: Реализация GUI слоя при помощи классов<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIIAVmR48zlrTZA05qZRLCpCNgUS3kV8-Jnbqm8Dyxb1hg80vuk8TRbrmXzgmEAKas54EkHjazWdxvBrFXKeMeOEgRxSpG4R218aLUXVNFCOsKL_DI7LTLtWQpG4Zj0YE8eqIgh9l6Tj29/s1600-h/AdvancedQTP.bmp"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 280px; height: 88px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIIAVmR48zlrTZA05qZRLCpCNgUS3kV8-Jnbqm8Dyxb1hg80vuk8TRbrmXzgmEAKas54EkHjazWdxvBrFXKeMeOEgRxSpG4R218aLUXVNFCOsKL_DI7LTLtWQpG4Zj0YE8eqIgh9l6Tj29/s320/AdvancedQTP.bmp" alt="" id="BLOGGER_PHOTO_ID_5324051211269422242" border="0" /></a><br /><span style="font-style: italic;"><br />Автор: Meir Bar-Tal<br />Перевод: Сергей Талалаев (<a href="http://sqadotby.blogspot.com/2009/05/qtp-gui.html">SQAdotBY</a>)<br />Оригинальная статья: <a href="http://www.advancedqtp.com/knowledge-base/articles/qtp-tricks4/descriptive-programming/implementing-a-gui-layer-with-classes/">Implementing a GUI Layer with Classes</a><br /></span><br /><br />В продолжении темы сотрудничества с уважаемым ресурсом <a href="http://advancedqtp.com/">AdvancedQTP.com</a> и с любезного разрешения автора, хотел бы представить перевод очень интересной статьи с данного сайта.<br /><br />Описанный подход заслуживает права на детальное изучение и применим не только в рамках QTP, но и в любом другом средстве автоматического тестирования.<br />Автором проведена серьезная работа с целью поиска оптимального варианта реализации тестового фреймворка с точки зрения минимизации издержек на его поддержку.<br /><br /><span class="fullpost"><br /><span style="font-weight: bold;font-size:130%;" >Аннотация</span><br /><br />Эта статья описывает действенную технику, которая используя ООП шаблоны проектирования, дескрипторное программирование (DP) и объект Dictionary позволяет объединить GUI объекты вместе с их бизнес функциями. Статья также включает ценное дополнение: эффективный прием, позволяющий избежать зависания QTP при попытке обращения к несуществующим GUI объектам во время выполнения.<br /><br /><br /><span style="font-weight: bold;font-size:130%;" >Введение</span><br /><br />Основная проблема в автоматизированном тестировании – это как уменьшить издержки по поддержке скриптов. Вопросы вида: “Должны ли мы использовать объектный репозиторий (Object Repository OR) или дескрипторное программирование (Descriptive Programming DP)? Если выбран OR, то должны ли мы использовать общий OR или локальный для каждого Action? Если выбран DP, тогда какой оптимальный вариант его реализации?” достаточно повсеместны и ответы на них могут зависеть как от конкретных особенностей проекта так, во многих случаях, и от людей, вовлеченных в процесс.<br /><br />В этой статье я проанализирую концепцию Тестовых Объектов (Test Objects) в рамках принципов OO (Object Oriented). Я попытаюсь показать, что реализация объектного репозитория в QTP не соответствует этим принципам, и каково влияние этого факта на разработку автоматизированных тестов с точки зрения эффективности затрат и трудоемкости поддержки. Затем я опишу расширение OR-концепции, которое соответствует принципам OO – GUI слой (GUI Layer). Эта концепция была адаптирована экспертами компании SOLMAR, основываясь на том факте, что возможно максимизировать повторное использование кода (и таким образом улучшить поддерживаемость кода) используя OO подход, согласно которому автоматизируемый проект разбивается на несколько уровней абстракции.<br /><br /><br /><span style="font-weight: bold;">Тестовые Объекты и Run-Time Объекты</span><br /><br />Тестовый объект содержит в себе ссылку на run-time объект – объект реального мира, который инициирован в тестовом приложении. Тестовый объект содержит <span style="font-style: italic;">описание</span> объекта, на который он ссылается, в виде набора атрибутов и значений служащих критерием для поиска нужного объекта в ходе тестового прогона. Это описание больше всего похоже на то, что вы себе представляете, идя на встречу с незнакомкой (“Я брюнетка, стройная и высокая, и буду одета в красное платье и туфли”)<br /><br />Аналогично QTP использует описание для запроса к OS, загружен ли в настоящий момент объект в оперативную память. Если ответ положительный, то OS вернет адрес объекта (ссылку или указатель) и, следовательно, QTP получит доступ к <span style="font-style: italic;">публичным</span> методам и свойствам объекта, в то время как <span style="font-style: italic;">частные</span> методы и свойства остаются скрытыми от просмотра по определению (таким образом QTP никогда не вмешивается в частную область, чего вы бы хотели в отношении брюнетки, если повезет!)<br /><br />Хотя это описание может быть слишком упрощено, но по существу это такой процесс, который позволяет нам взаимодействовать с GUI (и другими) объектами используя QTP или другое средство автоматизации (Test Partner, Test Complete, Rational Robot, AutoIt и т.д.) Более детальное объяснение различия между Тестовыми Объектами и Run-Time Объектами доступно в статье Yaron Assa "<a href="http://www.advancedqtp.com/knowledge-base/articles/qtp-tricks4/differences-and-connections-between-runtime-objects-and-test-objects/">Differences and Connections between Runtime Objects and Test Objects</a>" (2009).<br /><br /><br /><span style="font-weight: bold;">Тестовые Объекты и Объектный Репозиторий</span><br /><br />Рассказанное выше естественно заставляет нас думать о тестовых объектах как о данных. Что я имею в виду? Основываясь на описании, построенном из свойств и значений, QTP имеет возможность распознать GUI объект среди всех объектов, загруженных в данный момент в машинную память. Этот процесс подобен тому, как мы получаем необходимую запись из БД согласно условию WHERE в SQL запросе. Разница лишь в том, что в данном случае OS (Windows), а не БД возвращает запись. Кроме того, запись содержит только одно поле – ссылку на реальный run-time объект. Следуя данной мысли, это кажется вполне естественным хранить эти записи - тестовые объекты (Test Objects) – в базе данных, которой собственно Объектный Pепозиторий (Object Repository) и является (если вы обратили внимание на файлы с расширением <span style="font-weight: bold;">bdb</span> в QTP тестах, то знайте, что bdb в действительности означает Berkeley Data Base – продукт компании Oracle).<br /><br />В чем же собственно проблема с подходом, использующим OR? Тестовые объекты в действительности являются данными, но мы до текущего момента вынуждены выполнять действия с Run-time объектами, что, учитывая вышесказанное, предоставляет нам искаженную картину. Ниже я объясню почему.<br /><br />Это действительно, правда, что OR, при правильном использовании, предоставляет наилучшую технику, в соответствии с которой нам необходимо сохранить описание каждого GUI объекта всего лишь раз для уменьшения стоимости изменений. Тем не менее, чтобы достичь этого должны быть потрачены большие усилия на правильное управление тестовым проектом, потому что непродуманные запросы и недостаток ресурсов могут привести нарушению целостности этого ценного ресурса (OR). Например, предположим, что два инженера автоматизации работают одновременно с общим репозиторием, но один из них модифицирует скрипт для прошлой версии приложения, а другой – для новой. При условии, что GUI изменения выполняются регулярно от одной версии приложения к другой, не придется долго ждать, пока репозиторий окажется заполненным новыми лишними объектами необходимыми для работы с новой версией приложения. И это еще относительно неплохой результат. Гораздо более худший результат вы получите в случае, если каждый инженер изменяет набор свойств существующих объектов для отражения своих требований, безвозвратно разрушая ROI (возврат инвестиций) проекта автоматизации в целом. Конечно имеются решения и для таких ситуаций, такие как хранение отдельных версий репозитория для соответствующей версии приложения и использование специального ПО по управлению конфигурациями в рамках проекта автоматизации. Но, как говорилось ранее, это требует хорошего управления проектом, что не всегда доступно.<br /><br />Кроме того поддержка версионности объектного репозитория оставляет открытой одну проблему. По причине того, что автоматические тесты являются регрессионными по своей сути, их модификация затрагивает не только OR, но также и код, который реализует непосредственные манипуляции с GUI объектами и проверки, также как и работу с входными данными и ожидаемым результатом. В общем случае, когда при переходе от одной версии приложения к другой меняются только описания объектов, использование объектного репозитория действительно будет оправданным. Тем не менее, чаще ситуация обратная, изменения в GUI отражают изменения в функциональности приложения, которые в свою очередь гораздо чаще сопровождаются более глубокими изменениями – на уровне БД, например. Таким образом, изменения в GUI требуют изменений как на уровне объектного репозитория, так и на уровне скрипта, который ссылается на тестовые объекты и плюс к этому на уровне входных данных для самого скрипта. Учитывая то факт, что скрипты чаще всего подвергаются модификации, а не разработке, вышеупомянутый анализ приводит меня к мысли, что нечто в концепции OR неправильно по отношении к управлению крупномасштабными проектами автоматизации.<br /><br /><br /><span style="font-weight: bold;">Объектно-ориентированный взгляд</span><br /><br />Концепция ООП базируется на трех основных принципах – <span style="font-style: italic;">инкапсуляции</span>, <span style="font-style: italic;">наследовании </span>и <span style="font-style: italic;">полиморфизме</span>. Инкапсуляция означает упаковку вместе функциональности и данных, которые сосуществуют вместе и данная упаковка, через которую осуществляются обращения, называется <span style="font-style: italic;">классом</span>. Фактически классы – это представление данных (например, Customer, Product и т.д.) Различие между полнофункциональным классом и обычной структурой данных в том, что класс содержит в себе функции по работе со своими данными - <span style="font-style: italic;">полями</span>. Эти функции обычно называются <span style="font-style: italic;">методами</span> класса. Например, типичный класс для Customer-а включал бы себя следующие поля, которые однозначно определяют покупателя (customerId, firstName, lastName, phoneNo и т.д.) вместе с методами <span style="font-weight: bold;">setCustomerId</span>, <span style="font-weight: bold;">getCustomerId</span>, которые присваивают и возвращают значения соответствующим полям, также как и <span style="font-weight: bold;">getCustomerAge </span>and <span style="font-weight: bold;">getCustomerBalance</span> выполняющими расчеты на основе текущих значений полей и возвращающие результат.<br /><br />Наследование тесно связано с одной из важнейших целей ОО подхода – повторного использование кода. В объектно-ориентированных языках, таких как C++ и Java, повторное использование кода вступает в игру посредством возможности создавать новый класс, который “наследует” поля и методы уже созданного класса (называемого <span style="font-style: italic;">базовым классом</span>) и расширяет их согласно специфическим требованиям, поставленным для нового класса.<br /><br />Полиморфизм – это еще один мощный принцип, который делает возможным определять несколько версий одной функции (с одним именем, но с различным набором аргументов) для того чтобы прозрачно реагировать на различные ситуации в рамках контекста приложения. Например, у нас есть необходимость производить одну и ту же операцию с различным набором аргументов (float, int) и тогда вместо того, чтобы в одной функции реализовывать набор условных операторов для проверки типов переданных параметров, мы определим несколько функций с <span style="font-style: italic;">одинаковым именем</span>, но с разной<span style="font-style: italic;"> сигнатурой</span> (различным набором аргументов). Следовательно, в нашем коде, использующем эти функции, нам не придется использовать приведение типов; мы будем использовать одинаковый интерфейс в обоих случаях, полагаясь на то, что корректный вызов будет осуществлен самой средой выполнения. Тем не менее, в QTP две последние концепции (наследование и полиморфизм) не могут быть реализованы в рамках VB скрипта, который обеспечивает только ограниченную поддержку работы с классами. Тем не менее, позже мы увидим, что это не причина отказываться от использования классов в автоматизации тестирования.<br /><br /><span style="font-style: italic;">Публичная </span>и <span style="font-style: italic;">частная </span>нотации, упомянутые выше, имеют большое значение в контексте инкапсуляции и наследования. Они позволяют разработчику определять, какие поля (называемые также свойствами или атрибутами класса) и методы будут доступны извне класса (публичные) и какие останутся для внутреннего (частные) использования внутри класса. ОО методология не нова и широко представлена в практике дизайна и разработки ПО. Она общепризнанна как подход, позволяющий сделать код более реиспользуемым, читаемым, поддерживаемым, масштабируемым, расширяемым и конечно более тестируемым (так как большие куски функциональности разбиты на маленькие, самодостаточные пакеты). Конечно, грамотное использование методологии подразумевает глубокие аналитические навыки, позволяющие дизайнеру делать корректные выводы, на основании требований к ПО, о том, какие объекты вовлекаются и как они взаимодействуют между собой.<br /><br />Как это относится к подходу, который мы выбрали или собираемся выбрать для решения задач автоматизации? Давайте разберемся в этом дальше.<br /><br /><br /><span style="font-weight: bold;">Автоматизация Тестирования и Разработка ПО</span><br /><br />Я был свидетелем одной вещи на протяжении всей моей карьеры – это то, что QA профессионалы всех уровней рассматривают автоматизацию тестирования лишь как особый вид тестовой деятельности. Не удивительно, что не так уж редко можно встретить профессионалов в автоматизации, думающих также о роли автоматизации. Иногда это даже отражается в названии должностей для персонала автоматизации: “авто-тестер” - это одно из абсурдных названий из тех, что я встретил несколько лет назад. Все это отражает непонимание роли Инженера Автоматизации и, как я объясню в дальнейшем, данное мнение действительно не соответствует сущности автоматизации тестирования.<br /><br />Задача автоматизации тестирования не должна рассматриваться иначе, чем любая другая контекстно-зависимая задача автоматизации. Вообще говоря, компьютерная программа, которая выполняет набор операций вместо человека – реализует автоматизацию. Таким образом, любой блок кода по сути можно рассматривать как автоматическое устройство или робота. Скрипты, которые производят операции над GUI объектами (как тесты в QTP) не отличаются от других частей ПО. Говоря другими словами, проект тестовой автоматизации, несомненно, является специфичным видом проекта по разработке ПО. И как любой программный продукт проект автоматизации также имеет свой собственный документ с функциональными требованиями (Software Requirements Specifications) и дизайн (Software Test Design) документ (либо тест дизайн в одном из промышленных фреймворков, например HP’s Quality Center или Orcanos’ QPack), которыми должен руководствоваться инженер автоматизации при реализации требуемого кода.<br /><br />Если это так, то проект автоматизации фактически должен разрабатываться и управляться как любой другой проект разработки, даже более того. А все потому, что инженер автоматизации сталкивается с задачами, которые обычно не касаются разработчиков. Некоторые основные задачи таковы:<br /><br /><ol><li>Во-первых, инженер автоматизации должен иметь общее понимание системы, так как автоматически скрипт может покрывать широкий спектр функциональности приложения. Члены команды разработки напротив не нуждаются в этом в силу разделения труда среди разных команд обычно координируемых тим-лидерами и менеджером проекта. Таким образом разработчик может сфокусироваться только на часть функционала,за которую он отвечает даже не имеяглубокого понимания системы целиком.</li><br /><li>Во-вторых, автоматический скрипт должен быть привязан к тест-дизайну, так как обязан эмулировать действия тестировщика-человека. Но довольно часто инженеры автоматизации обнаруживают, что в тест-дизайне присутсвует множество проблем требующих предварительно выяснения, так как автоматичесикй скрипт не настолько гибок и изобретателен как тестировщик при прогоне тестов.</li><br /><li>В-третьих, GUI-элементы используемые командой разаработки и само поведение приложения могут поставить действительно сложные технологические проблемы касающиеся идентификации объектов на уровне QTP (или другого фреймворка). В большинстве случаев ребуются решения, расширяющие базовые возможности фреймворка особенно в случае использования сторонних и собственных комопонентов.</li></ol><br /><br />Следуя описанному выше, я думаю, мы можем заключить, что проект автоматизации определенно должен управляться также как проект разработки. Если это так, почему кто-то должен снова и снова становиться жертвой заблуждения о проекте автоматизации как о тривиальной задаче (методика ”записи-воспроизведения” ничего не напоминает?) в то время как верно обратное? Почему бы тогда не использовать широко применяемый при разработке подход – Объектно Ориентированное Программирование – чтобы достичь наилучших результатов? Далее я опишу методику реализации автоматизированных скриптов, основанную на расширении концепции OR ( GUI слой ) и базирующую на твердых принципах ООП.<br /><br /><br /><span style="font-weight: bold;">Концепция слоев</span><br /><br />Я надеюсь, что объяснил достаточно подробно, почему подход с использованием Объектного Репозитория (OR), повсеместно используемый в скриптах, далек от оптимального. Теперь, продолжая начатое обсуждение, позвольте взглянуть на концепцию разработки кода, разделенного на слои или собственно концепцию <span style="font-style: italic;">GUI слоя</span>. Вообще, слои весьма полезны для максимизации повторного использования кода (возвращаясь к предыдущему обсуждению принципов ООП). Я бы определил GUI слой как множество классов, которые объединяют (инкапсулируют) вместе необходимые интерфейсы для манипуляции GUI объектами тестового приложения для выделенной функционально части. Другими словами – это множество классов, обеспечивающих связь между GUI тестового приложения (то есть определенных тестовых объектов) и Бизнес или Прикладным Слоем, о котором мы поговорим позднее. Может быть, было бы более подходящим назвать его Слой GUI-Бизнес Адаптера, но среди экспертов уже устоялся термин GUI Слой, для краткости. Я проиллюстрирую ниже, как такой слой может быть создан и, какие преимущества достигаются при применении данного подхода в рамках тестовой автоматизации.<br /><br /><span style="font-weight: bold;font-size:130%;" >Реализация GUI Слоя</span><br /><br /><span style="font-weight: bold;">Инкапсуляция Тестовых Объектов в Классы</span><br /><br />Давайте возьмем проект тестовой автоматизации для типичного приложения и посмотрим, каким образом должен быть построен фреймворк для достижения описанных выше целей. Первым шагом будет создание списка всего GUI контекста в приложении – окон (страниц в Web приложениях), диалогов и всплывающих окон. Для каждого элемента этого списка, который в свою очередь выступает контейнером для других GUI объектов, мы определяем класс, например:<br /><br /><b style="color: rgb(31, 73, 125);">Class</b> Login<br /><br /><b style="color: rgb(31, 73, 125);">End Class</b><br /><br /><b style="color: rgb(31, 73, 125);">Class</b> MainWindow<br /><br /><b style="color: rgb(31, 73, 125);">End Class</b><br /><br /><b style="color: rgb(31, 73, 125);">Class</b> CreateCustomer<br /><br /><b style="color: rgb(31, 73, 125);">End Class</b><br /><br />и так далее для каждого контекста приложения. По причине того, что QTP не позволяет прямое создание класса определенного во внешней библиотеке с помощью оператора <span style="font-weight: bold;">New</span>, нам также необходимо определить следующую функцию (разновидность конструктора), которая вернет нам экземпляр GUI-слоя:<br /><span style="white-space:pre"><br /><span style="color:#00B050">'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">Public Function</b> CreateLogin()<br /><span style="color:#00B050">'——————————————————————————-<br />'Function: CreateLogin<br />'Creates an instance of the Login class<br />'<br />'Remarks:<br />'<br />'Arguments:<br />' N/A<br />'<br />'Returns:<br />' Object - As Login<br />'<br />'Owner:<br />' John Doe<br />'<br />'Date:<br />' dd-MMM-yyyy<br />'<br />'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);"> Dim</b> objLogin<br /><br /><b style="color: rgb(31, 73, 125);"> Set</b> objLogin = <b style="color: rgb(31, 73, 125);">New</b> Login<br /><br /><b style="color: rgb(31, 73, 125);"> Set</b> CreateLogin = objLogin<br /><span style="color:#00B050">'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">End Function</b><br /><span style="color:#00B050">'——————————————————————————-</span><br /></span><br />Второй шаг, очевидно, определить список элементов внутри каждого класса. Теперь, так как каждый класс, согласно вышеизложенному – это контейнер других GUI объектов, мы будем использовать Scripting.Dictionary для хранения ссылок на тест-объекты находящиеся на окне, диалоге или странице. (объект Dictionary широко обсуждался в статьях опубликованных в <a href="http://www.advancedqtp.com/">AdvancedQTP</a>’s <a href="http://www.advancedqtp.com/knowledge-base">базе знаний</a>). Таким образом, первый элемент который я представлю здесь, будет общим для всех GUI Layer классов, и я определю его как m_htChildObjects:<br /><span style="white-space:pre"><br /><b style="color: rgb(31, 73, 125);">Class</b> Login<br /><b style="color: rgb(31, 73, 125);"> Private</b> m_htChildObjects 'As Scripting.Dictionary<br /><br /><b style="color: rgb(31, 73, 125);">End Class</b><br /><br /><b style="color: rgb(31, 73, 125);">Class</b> MainWindow<br /><b style="color: rgb(31, 73, 125);"> Private</b> m_htChildObjects 'As Scripting.Dictionary<br /><br /><b style="color: rgb(31, 73, 125);">End Class</b><br /></span><br />и так далее для каждого контекста приложения (ht – префикс для HashTable, чем объект Dictionary на самом деле и является). Частный элемент <span style="font-weight: bold;">m_htChildObjects</span> будет доступен через свойство класса <span style="font-weight: bold;">ChildObjects</span>. Это свойство определено как:<br /><span style="white-space:pre"><br /><span style="color:#00B050">'——————————————————————————-<br />'Property: ChildObjects<br />'Get and Set the m_htChildObjects member field<br />'<br />'Remarks:<br />' R/W<br />'<br />'Arguments:<br />' dic<br />'<br />'Returns:<br />' m_htChildObjects As HashTable<br />'<br />'Owner:<br />' John Doe<br />'<br />'Date:<br />' dd-MMM-yyyy<br />'<br />'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">Public Property Get</b> ChildObjects()<br /><span style="color:#00B050">'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);"> Set</b> ChildObjects = m_htChildObjects<br /><span style="color:#00B050">'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">End Property</b><br /><span style="color:#00B050">'——————————————————————————-</span><br /><br /><span style="color:#00B050">'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">Public Property Let</b> ChildObjects(<b style="color: rgb(31, 73, 125);">ByRef</b> dic)<br /><span style="color:#00B050">'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);"> Set</b> m_htChildObjects = dic<br /><span style="color:#00B050">'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">End Property</b><br /><span style="color:#00B050">'——————————————————————————-</span><br /></span><br />Третий шаг – определение всех объектов внутри каждого контекста. Для этой цели я определю публичный метод <span style="font-weight: bold;">Init</span>:<br /><span style="white-space:pre"><br /><span style="color:#00B050">'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">Public Function</b> Init()<br /><span style="color:#00B050">'——————————————————————————-<br />'Function: Init<br />'Initializes the context and child objects<br />'<br />'Dependencies:<br />' IsContextLoaded(htContext)<br />'<br />'Remarks:<br />' N/A<br />'<br />'Arguments:<br />' N/A<br />'<br />'Returns:<br />' True/False<br />'<br />'Owner:<br />' John Doe<br />'<br />'Date:<br />' dd-MMM-yyyy<br />'<br />'——————————————————————————-</span><br />ChildObjects = CreateObject("Scripting.Dictionary")<br /><br /><b style="color: rgb(31, 73, 125);">With</b> ChildObjects<br /> .Add "Browser", Browser("name:=My App")<br /> .Add "Page", ChildObjects("Browser").Page("title:=My App \- Login")<br /> .Add "Username", ChildObjects("Page").WebEdit("html id:=Username")<br /> .Add "Password", ChildObjects("Page").WebEdit("html id:=Password")<br /> .Add "Submit", ChildObjects("Page").WebButton("outertext:=Submit")<br /><b style="color: rgb(31, 73, 125);">End With</b><br /><br /><span style="color:#00B050">'IsContextLoaded is a function that iterates through the Dictionary and checks if the GUI objects "exist"</span><br />Init = IsContextLoaded(ChildObjects)<br /><span style="color:#00B050">'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">End Function</b><br /><span style="color:#00B050">'——————————————————————————-</span><br /></span><br />Часть кода, показанного выше, описывает типичный метод <span style="font-weight: bold;">Init </span>для GUI Layer класса страницы логина в Web приложении. Тестовые объекты добавляются, как элементы словаря <span style="font-weight: bold;">ChildObjects </span>и их свойства определены посредством Дескрипторного программирования (DP). Читатель может легко провести аналогию с Объектным репозиторием (OR). Благодаря этому встроенному методу мы можем быть уверены, что GUI-объекты всегда определяются в одном месте. В конце кода метода вы можете отметить, что он возвращает результат вызова функции <span style="font-weight: bold;">IsContextLoaded </span>которая принимает в качестве аргумента словарь, содержащий ChildObjects.<br /><span style="font-weight: bold;">IsContextLoaded </span>определятся в отдельной общей библиотеке, следующим образом:<br /><span style="white-space:pre"><br /><span style="color:#00B050">'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">Public Function</b> IsContextLoaded(ByRef htContext)<br /><span style="color:#00B050">'——————————————————————————-<br />'Function: IsContextLoaded<br />'Checks that the current GUI context is loaded<br />'<br />'Iterates through the htContext (HashTable) items and executes the Exist method with 0 (zero) as parameter.<br />'<br />'Remarks:<br />' N/A<br />'<br />'Arguments:<br />' ByRef htContext - As HashTable<br />'<br />'Returns:<br />' True/False<br />'<br />'Owner:<br />' Meir Bar-Tal, SOLMAR Knowledge Networks Ltd.<br />'<br />'Date:<br />' 11-Nov-2008<br />'<br />'See Also:<br />'<br />'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">Dim</b> ix, items, keys, strDetails, strAdditionalRemarks<br /><br /><span style="color:#00B050">'—————————————————————————</span><br />items = htContext.Items<br />keys = htContext.Keys<br /><br /><b style="color: rgb(31, 73, 125);">For</b> ix = 0 <b style="color: rgb(31, 73, 125);">To</b> htContext.Count-1<br /> IsContextLoaded = IsContextLoaded <b style="color: rgb(31, 73, 125);">And</b> items(ix).Exist(0)<br /> strDetails = strDetails & vbNewLine & "Object #" & ix+1 & ": '" & keys(ix) & "' was"<br /><b style="color: rgb(31, 73, 125);"> If</b> IsContextLoaded <b style="color: rgb(31, 73, 125);">Then</b><br /> intStatus = micPass<br /> strDetails = strDetails & ""<br /> strAdditionalRemarks = ""<br /><b style="color: rgb(31, 73, 125);"> Else</b><br /> intStatus = micWarning<br /> strDetails = strDetails & " not"<br /> strAdditionalRemarks = " Please check the object properties."<br /><b style="color: rgb(31, 73, 125);"> End If</b><br /> strDetails = strDetails & " found." & strAdditionalRemarks<br /><b style="color: rgb(31, 73, 125);">Next</b><br /><span style="color:#00B050">'—————————————————————————</span><br /><br />Reporter.ReportEvent intStatus, "IsContextLoaded", strDetails<br /><span style="color:#00B050">'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">End Function</b><br /><span style="color:#00B050">'——————————————————————————-</span><br /></span><br />И она возвращает Истину если все объекты, определенные в словаре идентифицированы или Ложь если хотя бы один из объектов не найден. Эта функция универсальная и используется для всех проектов, которые я веду для того чтобы быть уверенным, что QTP не зависнет при попытке выполнения операций с несуществующим GUI-объектом. Еще одно преимущество этого метода в том, что он указывает точно на тот объект, который вы хотите проверить и изменить, делая поддержку значительно более легкой.<br /><br /><br /><span style="font-weight: bold;">Инкапсуляция бизнес методов в классы</span><br /><br />Следующий шаг, после определения дочерних объектов для тестируемого контента – это определение операций, необходимых для выполнения бизнес-сценариев в рамках данного контента. Это легко реализуется через методы класса. Например, класс <span style="font-weight: bold;">Login</span>, описанный выше нуждается в следующих методах для начала работы с ним: <span style="font-weight: bold;">SetUsername</span>, <span style="font-weight: bold;">SetPassword </span>и <span style="font-weight: bold;">Submit</span>. Они показаны ниже:<br /><span style="white-space:pre"><br /><span style="color:#00B050">'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">Public Function</b> SetUsername()<br /><span style="color:#00B050">'——————————————————————————-<br />'Function: SetUsername<br />'Set the Username field<br />'<br />'Dependencies:<br />' N/A<br />'<br />'Remarks:<br />' N/A<br />'<br />'Arguments:<br />' N/A<br />'<br />'Returns:<br />' N/A<br />'<br />'Owner:<br />' John Doe<br />'<br />'Date:<br />' dd-MMM-yyyy<br />'<br />'——————————————————————————-</span><br />ChildObjects("Username").<b style="color: rgb(31, 73, 125);">Set</b> GlobalDictionary("Username")<br /><span style="color:#00B050">'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">End Function</b><br /><span style="color:#00B050">'——————————————————————————-</span><br /><br /><span style="color:#00B050">'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">Public Function</b> SetPassword()<br /><span style="color:#00B050">'——————————————————————————-<br />'Function: SetPassword<br />'Set the Password field<br />'<br />'Dependencies:<br />' N/A<br />'<br />'Remarks:<br />' N/A<br />'<br />'Arguments:<br />' N/A<br />'<br />'Returns:<br />' N/A<br />'<br />'Owner:<br />' John Doe<br />'<br />'Date:<br />' dd-MMM-yyyy<br />'<br />'——————————————————————————-</span><br />ChildObjects("Password").<b style="color: rgb(31, 73, 125);">Set</b> GlobalDictionary("Password")<br /><span style="color:#00B050">'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">End Function</b><br /><span style="color:#00B050">'——————————————————————————-</span><br /><br /><span style="color:#00B050">'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">Public Function</b> Submit()<br /><span style="color:#00B050">'——————————————————————————-<br />'Function: Submit<br />'Presses the Submit button<br />'<br />'Dependencies:<br />' N/A<br />'<br />'Remarks:<br />' N/A<br />'<br />'Arguments:<br />' N/A<br />'<br />'Returns:<br />' N/A<br />'<br />'Owner:<br />' John Doe<br />'<br />'Date:<br />' dd-MMM-yyyy<br />'<br />'——————————————————————————-</span><br />ChildObjects("Submit").Click<br /><br /><span style="color:#00B050">'TODO: Verify data submission performed successfully<br />'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">End Function</b><br /><span style="color:#00B050">'——————————————————————————-</span><br /></span><br />Отметим использование GlobalDictionary для получения требуемых значений для функций (username, password) и использование свойства ChildObjects для получения через тестовый объект ссылки на выполняемый объект.<br /><br />Следующим шагом будет перемещение на Бизнес Слой (Business Layer), который реализует бизнес сценарий, построенный на базе GUI Слоя (GUI Layer). Например, для того чтобы выполнить логин в систему на основе вышеописанного примера мы реализуем следующую функцию:<br /><span style="white-space:pre"><br /><span style="color:#00B050">'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">Public Function</b> do_login()<br /><span style="color:#00B050">'——————————————————————————-<br />'Function: do_login<br />'Implements the business logic of the do_login Action.<br />'<br />'Remarks:<br />'<br />'Arguments:<br />' None<br />'<br />'Returns:<br />' Status<br />'<br />'Owner:<br />' John Doe<br />'<br />'Date:<br />' dd-MMM-yyyy<br />'<br />'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">Dim</b> intStatus, objLogin<br /><br /><b style="color: rgb(31, 73, 125);">Set</b> objLogin = CreateLogin()<br /><b style="color: rgb(31, 73, 125);">If</b> objLogin.Init() <b style="color: rgb(31, 73, 125);">Then</b><br /> objLogin.SetUsername()<br /> objLogin.SetPassword()<br /> objLogin.Submit()<br /><br /><span style="color:#00B050"> 'If login succeeds</span><br /> intStatus = micPass<br /><b style="color: rgb(31, 73, 125);">Else</b><br /> intStatus = micFail<br /><b style="color: rgb(31, 73, 125);">End If</b><br /><br />do_login = intStatus<br /><span style="color:#00B050">'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">End Function</b><br /><span style="color:#00B050">'——————————————————————————-</span><br /></span><br />Отметим использование класса Login описанного выше и его функции <span style="font-weight: bold;">Init </span>как меру предосторожности для уверенности, что необходимый контент загружен и не завис, как обсуждалось ранее. Как вы можете видеть, код вышеописанной функции достаточно просто для понимания, и не перегружен ссылками на OR объекты, источники данных как при обычной реализации. Если изменения на GUI затронут объекты в данном контенте – все изменения будут сконцентрированы только в данном <span style="font-weight: bold;">пакете</span>, как те что касаются собственно свойств объектов так и механизмов работы с дочерними объектами. Еще одно преимущество данной методики – это <span style="font-style: italic;">стандартизация</span>. Разрабатывая код по данной схеме, мы достигаем высокой степени унификации кода написанного разными разработчиками и таким образом улучшаем управляемость тестового проекта.<br /><br />Более продвинутая альтернатива последнему примеру – это упаковка таких бизнес-функций, используя Command Wrapper шаблон проектирования, как это описано в моей статье <a href="http://www.advancedqtp.com/knowledge-base/articles/code-techniques-id15/code-design-id16/design-patterns-id30/function-pointers-in-vb-script-revised/">Function Pointers in VB Script (revised)</a>. Например:<br /><span style="white-space:pre"><br /><span style="color:#00B050">'VB Script Document</span><br /><b style="color: rgb(31, 73, 125);">Option</b> Explicit<br /><br /><span style="color:#00B050">'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">Class</b> do_login<br /><span style="color:#00B050">'——————————————————————————-<br />'Class: do_login<br />'Encapsulates the do_login Action.<br />'<br />'Remarks:<br />'<br />'Owner:<br />' John Doe<br />'<br />'Date:<br />' dd-MMM-yyyy<br />'<br />'——————————————————————————-<br />'——————————————————————————-<br />'Methods<br />'——————————————————————————-<br />'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">Public Default Function</b> Run()<br /><span style="color:#00B050">'——————————————————————————-<br />'Function: Run<br />'Implements the business logic of the do_login Action.<br />'<br />'Remarks:<br />'<br />'Arguments:<br />' None<br />'<br />'Returns:<br />' Status<br />'<br />'Owner:<br />' John Doe<br />'<br />'Date:<br />' dd-MMM-yyyy<br />'<br />'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">Dim</b> intStatus<br /><br /><b style="color: rgb(31, 73, 125);">Set</b> objLogin = CreateLogin()<br /><b style="color: rgb(31, 73, 125);">If</b> objLogin.Init() <b style="color: rgb(31, 73, 125);">Then</b><br /> objLogin.SetUsername()<br /> objLogin.SetPassword()<br /> objLogin.Submit()<br /><br /><span style="color:#00B050"> 'If login succeeds</span><br /> intStatus = micPass<br /><b style="color: rgb(31, 73, 125);">Else</b><br /> intStatus = micFail<br /><b style="color: rgb(31, 73, 125);">End If</b><br /><br />Run = intStatus<br /><span style="color:#00B050">'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">End Function</b><br /><span style="color:#00B050">'——————————————————————————-<br />'——————————————————————————-</span><br /><b style="color: rgb(31, 73, 125);">End Class</b><br /><span style="color:#00B050">'——————————————————————————-</span><br /></span><br />Адаптация данной методики делает возможным реализацию продвинутых универсальных контроллеров (<span style="font-weight: bold;">generic controller</span>), которые загружают свои сценарии из внешних источников данных, таких как XML файл. Такие управляющие структуры были разработаны мной и моими партнерами в SOLMAR Knowledge Networks как часть нашего универсального фреймворка - Object Oriented comprehensive automation framework - <span style="font-weight: bold;">My System</span>.<br /><br /><span style="font-weight: bold;font-size:130%;" ><br />Выводы</span><br /><br />В данной статье рассматривался альтернативный подход реализации тестов при автоматизации, основанный на объектно-ориентированной методологии. Я показал, что автоматизацию не следует рассматривать иначе, чем разработку программ. Более того, я постарался отразить, что логически следуя данной мысли, мы приходим к заключению, что проект автоматизации должен рассматриваться как программный проект в идеале, и предложил расширение концепции Объектного Репозитория (OR) (которая показала несоответствие OR методологии ООП) для инкапсуляции интерфейсов GUI объектов: GUI Слой.<br />В статье также приводился практический пример реализации такого слоя и его вызов, используя Бизнес-Слой, и разъяснены в деталях преимущества такого подхода для достижения максимального эффекта от вложенных инвестиций (ROI) в проекте автоматизации относительно поддерживаемости, читаемости, масштабируемости, расширяемости и тестируемости. Следующие статьи расширят данную тему и покажут читателям, как получить выигрыш от реализации в фреймворке других шаблонов проектирования, помимо изложенных в рамках этой статьи.<br /><br /></span>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com2tag:blogger.com,1999:blog-8226300894599246881.post-74731307562497389992009-05-08T16:52:00.003+03:002009-05-08T16:55:21.496+03:00Читайте нас в Quality Matters, Issue 2<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWAG4VirN-3NkM7ONoodmcn3Td4QKqAX56uZ8dNZ47mbBqOJZdnyySEUOgADjDQwIBXOjvl18kT8ikhyphenhyphenmBqb2CWNqajC6iG5Vm64fqpmP0I9UU1387TBJHu4hkOXat8vZ9QajC_dU4sTCU/s1600-h/1.jpg"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 142px; height: 200px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWAG4VirN-3NkM7ONoodmcn3Td4QKqAX56uZ8dNZ47mbBqOJZdnyySEUOgADjDQwIBXOjvl18kT8ikhyphenhyphenmBqb2CWNqajC6iG5Vm64fqpmP0I9UU1387TBJHu4hkOXat8vZ9QajC_dU4sTCU/s200/1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5333451316641398354" /></a><br />Немного с опозданием, но хочу поделиться с вами очередной приятной новостью!<br />Во 2-м выпуске журнала Quality Matters напечатали мою статью по развитию и обучению тестировщиков.<br />Второй выпуск журнала можно скачать <a href="http://quality-matters.org/">здесь</a>.<br /><br />Постараемся не останавливаться на достигнутом! ;)<br />Присоединяйтесь!<br /><br />Всегда ваша, <br />Наташа Искорцева (Густыр)Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com3tag:blogger.com,1999:blog-8226300894599246881.post-31051665433566260392009-04-16T09:45:00.021+03:002009-04-16T13:43:02.855+03:00Разоблачение Excel: Проверка вводимых данных - выпадающие списки<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIBOcqJTeWFG3Nxb2f9puvV3NiJ42_9sT4IYmQUogBFUKHWdcmaazVfZAD7pkg7JWzQ22xehp2uvbxOR2e6jSY73d2kwmEq3YzVfVnqq5B7I8hS3XO3CU_JGO9EWSMAxrXqz9Tw47KiLO3/s1600-h/Demistifying+Excel.JPG"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 159px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIBOcqJTeWFG3Nxb2f9puvV3NiJ42_9sT4IYmQUogBFUKHWdcmaazVfZAD7pkg7JWzQ22xehp2uvbxOR2e6jSY73d2kwmEq3YzVfVnqq5B7I8hS3XO3CU_JGO9EWSMAxrXqz9Tw47KiLO3/s200/Demistifying+Excel.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5325180491932721602" /></a><br /><br />Часто ли у вас возникало желание, после получения отчета в Excel (абсолютно на любую тематику), убить его автора? Если возникало и не раз – скорее всего вы наш пациент :)<br /><br /><br /><br /><br /><br /><span class="fullpost"><br /><strong>1. Отчёт, отчёт и еще раз …?</strong><br /><br />Казалось бы <b>чем</b> можно убить любую здравую идею, подразумевающую некоторую информационную составляющую: ”Давайте соберем статистику использования различных операционок на проектах”, “Надо бы собрать сведения об используемом ПО для оптимизации расходов компании” и т.д.? <br /><br />Правильно – <b>бездарно собранной информацией</b>!!! <br /><br />Итак, смотрим, что мы получили в ответ на наш запрос:<br /><br />Раз<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi69p0YqxFY5YwRmjRtOPztjyjKFdybotK8wpDjdA33eImgx-Xji7y1rMDLShauhcQVki1YK2MC8ydMnd9D0ys0k40Jly-EhXk0YmmE657V2aywokmbBvJ83Ej-g3-RzaXHPQsO_cD1uZx4/s1600-h/Demistifying+Excel_1.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi69p0YqxFY5YwRmjRtOPztjyjKFdybotK8wpDjdA33eImgx-Xji7y1rMDLShauhcQVki1YK2MC8ydMnd9D0ys0k40Jly-EhXk0YmmE657V2aywokmbBvJ83Ej-g3-RzaXHPQsO_cD1uZx4/s400/Demistifying+Excel_1.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5325191698249723026" /></a><br /><br />И два<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQ3J8RjPDOtIegWkifqjpqt2hHSviiKyTBmsHXQtbv3OxuV8bfbngd5NEXHdEBO0FLtMc-x9_Oaaj7X1IcwJJOuxaLbkWjG9_Tw9TA05F4QYs30-5q080cxIRl1_mw4p-FrSzNz5Wyqe7T/s1600-h/Demistifying+Excel_2.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 223px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQ3J8RjPDOtIegWkifqjpqt2hHSviiKyTBmsHXQtbv3OxuV8bfbngd5NEXHdEBO0FLtMc-x9_Oaaj7X1IcwJJOuxaLbkWjG9_Tw9TA05F4QYs30-5q080cxIRl1_mw4p-FrSzNz5Wyqe7T/s400/Demistifying+Excel_2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5325191937958845282" /></a><br /><br />С одной стороны вроде и информация собрана, а с другой…<br /><br />Бухгал<b>трр</b>ия Плюс – это почти Бухгалтерия Плюс, но не совсем.<br />Анти<b>вр</b>ус (ПО) – это почти Антивирус (ПО), но не совсем.<br />Отдел сопро<b>вж</b>дения ПО – это почти Отдел сопровождения ПО, но не совсем.<br /><br />И уж совсем ни одно и тоже Windows XP, Win XP, XP, WinXP.<br />Как впрочем и 1C Бухгалтерия, 1C, 1C Бухгалтерия 7.0.<br /><br />Поэтому, засучив рукава, идем за большим напильником и начинаем … :)<br /><br />Стоп, а если отложить напильник в сторону (на время) и попытаться проанализировать, что же сделано не так и как избежать повторения этой ситуации. <br /><br /><br /><strong>2. Очень гибко хорошо, очень гибко плохо?</strong><br /><br />На вопрос, что же использовать в качестве хранилища нашей кропотливо, но в тоже время очень срочно, собираемой информации ответ настолько очевиден, что иногда вызывает недоумение: ”Вам может еще и базу данных слепить по-быстрому? Возьмите вот Excel и завтра чтобы отчет был у меня на столе.”<br /><br />И действиетльно, что может быть лучше, чем использовать всем знакомый, доступный, простой в использовании Excel. Тем более, что это почти база данных – сортировка, фильтрация, автосуммирование и другие ”взрослые” функции присутствуют. Лишних заумных вещей таких как внешние ключи, индексы, контроль уникальности, строгая типизация, словари и т.д. – нет.<br /><br />Все казалось бы верно, но возвращаясь к собранным отчетам, возникает чувство некоторой неполноценности: ”А можно, чтобы все также просто как в Excel, но еще и чтобы контроль данных был?” (перед глазами заботливо всплыл образ Никулина и его ”перламутровые пуговицы”). <br />И чтобы тоска от сознания необходимости ковырятся в VB for application, макросах, формулах не потушила робкую надежду, как минимум, дочитать эту статью до конца, а как максимум, реализовать то, что в ней написано, сразу ответим – можно и это не так уж сложно, как может показаться на первый взгляд.<br /> <br />Итак, устраиваемся поудобнее и готовимся увидеть необычное и удивительное в привычных и обыденных вещах.<br /><br /><br /><strong>3. Готовим прокрустово ложе.</strong><br /><br />Для начала нам нужно подготовить корректные значения для заполнения наших выпадающих списков правильными величинами. Это можно сделать на отдельной странице нашего Excel файла, назовем её просто и незатейливо – ”Списки (первый вариант)” и скопируем в нее наш список проектов.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhev_TVWdqwCtftROdWgQ5FezVUynyE7MlF6JfxShpzfQHhblz40LbpmMHGkWyrr6Tww08TiY4I91r7UEnWCuf2yZwkEMk5kxFq-q-UxcTvcGXB98KjZBXruckidreDQydM2y3AcWhL5QAZ/s1600-h/Demistifying+Excel_3.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 270px; height: 192px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhev_TVWdqwCtftROdWgQ5FezVUynyE7MlF6JfxShpzfQHhblz40LbpmMHGkWyrr6Tww08TiY4I91r7UEnWCuf2yZwkEMk5kxFq-q-UxcTvcGXB98KjZBXruckidreDQydM2y3AcWhL5QAZ/s400/Demistifying+Excel_3.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5325192344415424210" /></a> <br /><br />Обозначим на этой же странице область для проведения натурных испытаний, например вот таким образом:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiR2ZYdbklcgrA2Snj6s-qfcS7DyQgiHWu6tQ5v3ScPhf-yVLNePr9fDTngn3SOM6fEG15h1JlxQK8LnbaQVURhUtGKNEEAZ1qCZZUxlye0w38liN4QDj9o2arUCVIdw8u6_USCL0nM2bmJ/s1600-h/Demistifying+Excel_4.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 293px; height: 72px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiR2ZYdbklcgrA2Snj6s-qfcS7DyQgiHWu6tQ5v3ScPhf-yVLNePr9fDTngn3SOM6fEG15h1JlxQK8LnbaQVURhUtGKNEEAZ1qCZZUxlye0w38liN4QDj9o2arUCVIdw8u6_USCL0nM2bmJ/s400/Demistifying+Excel_4.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5325192433060044066" /></a> <br /><br />И активируем диалог валидации данных ( Main menu>Data>Data Validation ) для выбранной ячейки<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBssU9hLxRHcmtpkFARJINEetatysJY4ad3fUIAjGdHDeuXQGy6E7apRTy5AW_2EpdhXykYy5h-dJVU1yEa2RSwmsmpxn-qxAMO3YUU7oe7MBMZkv2ext9HsuJ7Za0ytQ6n816TG9IbVYc/s1600-h/Demistifying+Excel_5.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 66px; height: 66px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBssU9hLxRHcmtpkFARJINEetatysJY4ad3fUIAjGdHDeuXQGy6E7apRTy5AW_2EpdhXykYy5h-dJVU1yEa2RSwmsmpxn-qxAMO3YUU7oe7MBMZkv2ext9HsuJ7Za0ytQ6n816TG9IbVYc/s400/Demistifying+Excel_5.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5325192507631318706" /></a><br /><br />Итак давайте внимательно разберемся, что нам предоставляет Excel в качестве инструментов тонкой огранки информации и что будет действительно удобно и полезно нам для реализации задуманного.<br /><br />Первая страница диалога – <b>Settings</b> (в большинстве случаев её оказывается достаточно) позволяет вам ограничить входные данные согласно заданным правилам. Для настройки необходимого нам типа валидации следует выбрать значение выполнить установки согласно картинке ниже, то есть <b>Allow = List</b>. <br /><br />Обратите внимание,что на странице появились дополнительные элементы управления: <br /><b>In-cell dropdown</b> – говорит, что значения предлагаются в виде выпадающего списка;<br /><b>Source</b> – указывает где брать допустимые значения.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg74U2r3VuGP2Z5UPDnGJa20lm5-jMKUg_nmLXlR8T3kH7Zj9xop1KAuCbTQ40r_dn4GlGYk8pmxPN2RncKSf82CO1v_-UoTHSMvCf6R20Ab6t8LpC0nmupNuUKXYZNQmJV9t5ec-ZrLBO4/s1600-h/Demistifying+Excel_6.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 317px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg74U2r3VuGP2Z5UPDnGJa20lm5-jMKUg_nmLXlR8T3kH7Zj9xop1KAuCbTQ40r_dn4GlGYk8pmxPN2RncKSf82CO1v_-UoTHSMvCf6R20Ab6t8LpC0nmupNuUKXYZNQmJV9t5ec-ZrLBO4/s400/Demistifying+Excel_6.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5325192582143344338" /></a> <br /><br />Вторая страница – <b>Input Message</b> пытается ”отпугнуть” неправильные значения еще на ближних подступах, а точнее при активации ячейки. После перехода в ячейку с активированным данным типом валидации появляется всплывающая подсказка с вашим текстом. Но я бы советовал пользоваться данным типом предупреждений очень осторожно потому, что при активной работе такие подсказки больше раздразжают, чем помогают.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH5PgnIPuW_BFnqOAoiAov8shMZ7EMytN5SF2FBQJqg_MvbmsOOG7YGDGqL6NN9FQOGSLPlc95OSxZnyo-jnLHQTExbFXEdMKoAfW2cSfAV1frq23-F9JY9o-Qq0JiNGDqPnv5uDebplv_/s1600-h/Demistifying+Excel_7.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 317px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH5PgnIPuW_BFnqOAoiAov8shMZ7EMytN5SF2FBQJqg_MvbmsOOG7YGDGqL6NN9FQOGSLPlc95OSxZnyo-jnLHQTExbFXEdMKoAfW2cSfAV1frq23-F9JY9o-Qq0JiNGDqPnv5uDebplv_/s400/Demistifying+Excel_7.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5325192649940097634" /></a> <br /><br />Более удобный вариант подсказки предполагает использование вкладки <b>Error Alert</b>. При использовании этого варианта сообщения появляются при попытке выхода из поля при условии неправильного введенного значения.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi60Gmcyk8iyn4Fr0Zw7N4tXdkhPyW1J90RhTysPt1pkjWSbFgN7zJTFXvCmWbU98_LV17M5t6c8BL_10r0sjz5N2V-bUz1GkKX8nT8W7rvyXNGlVbgrcfFm9z45R3GK2Tn4d80H6KPoU_z/s1600-h/Demistifying+Excel_8.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 317px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi60Gmcyk8iyn4Fr0Zw7N4tXdkhPyW1J90RhTysPt1pkjWSbFgN7zJTFXvCmWbU98_LV17M5t6c8BL_10r0sjz5N2V-bUz1GkKX8nT8W7rvyXNGlVbgrcfFm9z45R3GK2Tn4d80H6KPoU_z/s400/Demistifying+Excel_8.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5325192728978441362" /></a> <br /><br />Посмотрим на результат применения всех трех заполненных вкладок:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheycrccx9NwgC9IfW7faac5VUU97nRgu4FbLnnitWl06v1S2qoUVF0iHI5Y8lUotbqUxV93LfhvwXlGYe9PFTHcxqJ2eZWlGtIqkN678TrRXtIV95hg6v3IVAtufD2PXMHnQhiUnS3nlnl/s1600-h/Demistifying+Excel_9.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 357px; height: 285px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheycrccx9NwgC9IfW7faac5VUU97nRgu4FbLnnitWl06v1S2qoUVF0iHI5Y8lUotbqUxV93LfhvwXlGYe9PFTHcxqJ2eZWlGtIqkN678TrRXtIV95hg6v3IVAtufD2PXMHnQhiUnS3nlnl/s400/Demistifying+Excel_9.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5325192804058879538" /></a><br /><br />Получилась каша, неправда ли? <br />Поэтому предлагаю остановится на следующем варианте, как наименее тревожащем психоэмоциональный фон: списковая валидация для поля + сообщение на выходе в случае неправильного значения.<br /><br />Если же вас вполне устраивает стандартное сообщение об ошибке, то можно ограничиться активацией только первой закладки. <br /><br /><br /><strong>3.1. Огласите весь список, пожалуйста.</strong><br /><br />Оказывается “огласить” список допустимых значений тоже можно не одним способом, а как минимум тремя.<br /><br /><b>Перечисление списка допустимых значений.</b><br />Первый и самый простой (именно этот способ и запечатлен на рисунке выше) – это перечисление списка значений через разделитель ; напрямую в поле Source первой вкладки:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-f5rJNDXOK8SYRA_VJnPT-P1Zui7DFWuztGgaLEo_koJTSRJRP37foHK-04W7Ee_5KV0-GOotsLJWPdWhkOlc2KZDZYQGUNG3omOF3SkYXopxidyB9WqOS6xoxv4Hm1KWykyJ9G8xUBmT/s1600-h/Demistifying+Excel_10.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 265px; height: 43px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-f5rJNDXOK8SYRA_VJnPT-P1Zui7DFWuztGgaLEo_koJTSRJRP37foHK-04W7Ee_5KV0-GOotsLJWPdWhkOlc2KZDZYQGUNG3omOF3SkYXopxidyB9WqOS6xoxv4Hm1KWykyJ9G8xUBmT/s400/Demistifying+Excel_10.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5325194040046419218" /></a> <br /><br />Быстро, понятно, удобно и … <br />не стоит так делать (точнее делать можно, но предварительно хорошо подумав)<br /><br />Представим ситуацию, когда таким образом провалидированные поля разбросаны щедрой рукой по всему Excel файлу и вдруг оказывается, что нужно добавить в список допустимых значений еще одну строчку! <br />Поэтому, хорошенько подумав такой стиль оформления применяйте только для абсолютно фиксированных небольших списков, например: {Да;Нет}, {M;Ж}, {Pass;Fail}<br /><br /><b>Фиксированный диапазон.</b><br />Для больших или, потенциально, подверженных изменениям списков, лучше применять следующую тактику:<br />- сначала на отдельной странице создаем список допустимых значений<br />- затем в поле валидации делаем ссылку на этот список<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGm2R4bVJJBx0vZeXayMru5_zXR9HJs5n-Tl6V7YtU5inygEaCsfRd06l_0tGeP7CSakVb5YlauaKL2h474_ydx1U3NU4-E7_gniQR-kvbJ_yIcKtW_n1LDGlvqPdotzg95WG5EKCYiCtB/s1600-h/Demistifying+Excel_11.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 199px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGm2R4bVJJBx0vZeXayMru5_zXR9HJs5n-Tl6V7YtU5inygEaCsfRd06l_0tGeP7CSakVb5YlauaKL2h474_ydx1U3NU4-E7_gniQR-kvbJ_yIcKtW_n1LDGlvqPdotzg95WG5EKCYiCtB/s400/Demistifying+Excel_11.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5325194123656879410" /></a><br /><br />Очевидно, что этот способ лишен недостаков первого и достаточно гибок по отношению к изменениям, но по-настоящему элегантным является следующий способ. <br /><br /><b>Именованный диапазон.</b><br />Оформив наш список значений в виде именованного диапазона с логичным и понятым для вас именем (в данном случае ”Проекты”). Мы можем вместо буквенно-числовой шифрограммы $A$2:$A$8 использовать осмысленное имя – Проекты. <br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxswumA66YpgqByanVxFZKFAGS-a22pGE-y6hc-jmxxVwVyRt58FjcYmvHZAAvWudbR4UQ8IbXxz6Il_UPgZX8lAvu_p7Vh2NqsyhEtjXCd95j9RGZZGuZTeRYkrlR8997xSbbMymxbUs3/s1600-h/Demistifying+Excel_12.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 272px; height: 46px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxswumA66YpgqByanVxFZKFAGS-a22pGE-y6hc-jmxxVwVyRt58FjcYmvHZAAvWudbR4UQ8IbXxz6Il_UPgZX8lAvu_p7Vh2NqsyhEtjXCd95j9RGZZGuZTeRYkrlR8997xSbbMymxbUs3/s400/Demistifying+Excel_12.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5325194200048416738" /></a><br /> <br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPBDi_zh1oaHIUwE4ei8i-oifq7cQG1pUvElYW6JrAHhyphenhyphenwvBhkLH4hX0HTWSUiHcX9UQesOZm8Fj68_VQyMfeLtmafq-2a12xmBxZfgi2MVFX1i1-2LMC-F6F1bWaWivfQAoGCQRsPf9RH/s1600-h/Demistifying+Excel_13.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 307px; height: 340px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPBDi_zh1oaHIUwE4ei8i-oifq7cQG1pUvElYW6JrAHhyphenhyphenwvBhkLH4hX0HTWSUiHcX9UQesOZm8Fj68_VQyMfeLtmafq-2a12xmBxZfgi2MVFX1i1-2LMC-F6F1bWaWivfQAoGCQRsPf9RH/s400/Demistifying+Excel_13.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5325194282867941890" /></a><br /><br />Кроме того если для второго варианта еще оставалось неудобство с переносом самого списка значений, то последний вариант лишен этого недостатка.<br /><br /><br /><strong>4. Выводы</strong><br /><br />Возвращаясь к началу статьи, я очень надеюсь, что в следующий раз такой инструмент точной подгонки данных как мифический напильник вам не понадобится, и вы сэкономите свои нервы и время своих коллег.<br /><br /><br />P.S. Для лентяев (к которым я причисляю и себя) в комментариях можно найти ссылу на Excel-файл, являющийся материализацией вышеизложенного материала.<br /><br /><em>С уважением,<br />Сергей Талалаев</em> <br /></span>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com6tag:blogger.com,1999:blog-8226300894599246881.post-43103167053743410532009-04-13T08:52:00.011+03:002009-04-13T16:12:24.581+03:00Нас публикуют за рубежом!<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIIAVmR48zlrTZA05qZRLCpCNgUS3kV8-Jnbqm8Dyxb1hg80vuk8TRbrmXzgmEAKas54EkHjazWdxvBrFXKeMeOEgRxSpG4R218aLUXVNFCOsKL_DI7LTLtWQpG4Zj0YE8eqIgh9l6Tj29/s1600-h/AdvancedQTP.bmp"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 280px; height: 88px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIIAVmR48zlrTZA05qZRLCpCNgUS3kV8-Jnbqm8Dyxb1hg80vuk8TRbrmXzgmEAKas54EkHjazWdxvBrFXKeMeOEgRxSpG4R218aLUXVNFCOsKL_DI7LTLtWQpG4Zj0YE8eqIgh9l6Tj29/s320/AdvancedQTP.bmp" alt="" id="BLOGGER_PHOTO_ID_5324051211269422242" border="0" /></a><br /><br />В рамках реализации проекта по перемещению мировой столицы тестирования в Минск (О.Бендер и Нью-Васюки нервно курят) состоялась публикация нашей статьи на специализированном сайте по автотестированию <a href="http://advancedqtp.com/">AdvancedQTP.com</a><br /><br />А если серьезно, то ...<br /><span class="fullpost"><br /><br />Я очень благодарен этому профессиональному сайту. Начиная с первой страницы (один слоган чего стоит: 'coz we're programmers - not users) становится понятно, что аудитория здесь собралась крайне серьезная. Мне очень повезло, что начиная свой путь с QTP я столкнулся именно с этим ресурсом. Многие сложные оказались предельно простыми после ознакомления с материалами, размещенными на сайте.<br />Кроме того, в силу ограничений коммерческого характера (и мне это абсолютно понятно), некоторые статьи не раскрывают все технические тонкости реализации какой-либо интересной функциональности, но дают представление об идее, которую приходится доводить до ума самостоятельно (что потрясающе интересно).<br /><br />Думаю, что заслуженных диферамбов получилось достаточно :)<br /><br />В силу всего вышесказанного, моей естественной реакцией было поблагодарить наших коллег и по возможности внести лепту в продвижение ресурса (не говоря уже про собственное тщеславие :). Тем более, что были самоcтоятельные мысли и наработки, которыми давно хотелось поделиться.<br /><br />Честно говоря, были некоторые сомнения насколько окажется интересным материал, попадает ли он в тематику сайта, уровень владения языком опять-же. Но, спасибо активисту и основному редактору ресурса - Yaron Assa за его позитивный настрой и активность, статья была принята с хорошей оценкой с его стороны.<br /><br />Поэтому, приглашаю вас во-первых, посетить этот действительно профессиональный ресурс, а во-вторых, порадоваться вместе с нами: <a href="http://www.advancedqtp.com/knowledge-base/articles/ms-office4/universal-class-for-data-manipulations/">AdvancedQTP-Universal class for data manipulations</a><br /><br /><em>С уважением,<br />Сергей Талалаев</em><br /><span style="color:white;">С большой признательностью к моей коллеге Анне Валерьевне.</span><br /></span>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com9tag:blogger.com,1999:blog-8226300894599246881.post-4532252697828471022009-04-06T13:59:00.004+03:002009-04-06T14:19:45.108+03:00Учим тестированию студентов!В одном из своих <a href="http://sqadotby.blogspot.com/2008/11/blog-post.html">постов</a> я уже говорила о том, что среди прочих грандиозных планов - преподавание курса по тестированию ПО студентам БГУИР.<br /><br />Свершилось!<br /><span class="fullpost"><br />И вот уже с 11-го марта дважды в неделю я наслаждаюсь общением со студентами на тему тестирования!<br />Признаться, до начала курса настороженно относилась к тому, как пойдет общение. Но, как ни странно, студенты ведут себя очень заинтересованно и активно. И что особенно приятно - они задают вопросы! А это значит, что:<br />- Они не боятся<br />- Они слушают<br />- Они пытаются разобраться<br />- Им небезразлично<br />- И, надеюсь, они, в итоге, усваивают<br />По поводу последнего утверждения могу сказать следующее: кое-что усваивают точно, потому что часто слышу: "а вот Вы говорили так-то", "а это называется так-то", "а такие-то тесты писать будем?" и т.д. и т.п.<br />Ну, а все остальное мы проверим на итоговой работе...<br /><br />Кстати сказать, курс пришлось немного адаптировать под студентов. Во-первых, формат занятий другой - это не 3 дня подряд, а всего-то по 2 пары в неделю. Во-вторых, студентам приходится объяснять все с нуля, даже понятия, поэтому приходится обращать внимание и на ооочень базовые вещи.<br /><br />Ну и что еще приятно, так это то, что группа у нас пока "экспериментальная", пришли только заинтересованные студенты (и даже среди таких, как они, был конкурс!), поэтому аудитория сродни той, которая осознанно приходит на курс по тестированию, например, в том же Интерфейсе. <br /><br />Пока, как говорится, "Учиться! Учиться! и еще раз - Учиться!"<br />Ждем результатов :)<br /><br /><span style="font-style:italic;">Всегда ваша,<br />Наташа Густыр</span><br /></span>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com14tag:blogger.com,1999:blog-8226300894599246881.post-82538588162062951952009-04-02T10:42:00.037+03:002009-05-14T16:24:55.042+03:00QTP: Сравнивая с … Универсальный класс для работы с данными<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg27Y12ZkC5b7sZdMmt2vq0USvYQ7o0TJNrk7O6pg8feJyRfkIxczSdtYvGLR9ujIbplXDxGARNPC9SGehtp3i0Q-ViXUEdncY2ZBwRZ74ct9Ar4LWaeALjv5LW47BmJleZhTOa6JLjyp4d/s1600-h/hp.jpg"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 133px; height: 109px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg27Y12ZkC5b7sZdMmt2vq0USvYQ7o0TJNrk7O6pg8feJyRfkIxczSdtYvGLR9ujIbplXDxGARNPC9SGehtp3i0Q-ViXUEdncY2ZBwRZ74ct9Ar4LWaeALjv5LW47BmJleZhTOa6JLjyp4d/s320/hp.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5335669982478388306" /></a><br />Влияние мирового кризиса к сожалению сказалось и на моей персоне и мне потребовалось срочно и по возможности глубоко изучить новый для себя фреймворк - Quick Test Professional. И душа рвется поведать о результатах, которые надеюсь буду полезны не только мне одному.<br /><br />Двойное название статьи как-бы говорит о том, что материала накопилось достаточно для небольшой серии статей и если силы и желание не иссякнут еще на первой статье, то есть шанс увидеть продолжение ... <br /> <br /><span class="fullpost"><br /><strong>1. Введение</strong><br /><br />У меня уже был опыт работы с продуктами HP Mercury, но он относился к предыдущей линейке, я имею в виду WinRunner. Естественно я ожидал некоторого сходства в процессах скриптостроения и организации самого фреймворка. Поэтому по свежим следам постараюсь изложить замеченные мною интересные моменты и привести свои примеры реализации некоторых функций.<br /><br /><br /><strong>2. Работа с Excel-данными</strong><br /><br />Еще работая с WinRunner, я убедился, что встроенная реализация Excel хранилища не настолько гибка, как мне бы хотелось. Поэтому, как всегда, я приготовился к миграции своих процедур для работы с Excel. И был немного удивлен отсутствию встроенных средств работы с БД. Но эта задача вполне по силам, когда за плечами вся мощь VB :)<br /><br /><br /><strong>2.1. Основные задачи</strong><br /><br />Итак, для начала определимся, зачем нам это нужно. <br />Я всегда выступал за то, чтобы подготовка тестовых данные для автоматических тестов была максимально упрощена с одной стороны, и, по возможности, исключала возможность ошибок при вводе с другой. <br /><br />Эти трудносовместимые вещи отлично реализуются посредством встроенной в Excel валидации входных данных и также прекрасно уничтожаются попыткой редактирования Excel таблицы напрямую из QTP.<br />Более того уничтожается также любое кастомное форматирование, без которого нормально читаемая таблица превращается в клетчатый текст.<br /><br />Было до вмешательства из QTP:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQwSZ7wpnRGVGM6wH1OV3MehIP08_8xIMRuuForoxbBsnc4-VyiaWWqfEF8RBzNTY0_sG_aUlek4g-vAoeEmqO6DxFIpJovxF0x_No2FERm4zt_ZKGUEgjlB1nwsmAzenqEEg9EvGyw92l/s1600-h/Universal+class_1.bmp"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 113px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQwSZ7wpnRGVGM6wH1OV3MehIP08_8xIMRuuForoxbBsnc4-VyiaWWqfEF8RBzNTY0_sG_aUlek4g-vAoeEmqO6DxFIpJovxF0x_No2FERm4zt_ZKGUEgjlB1nwsmAzenqEEg9EvGyw92l/s320/Universal+class_1.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5320003233681434642" /></a><br /><br />Стало после редактирования из QTP:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIy785N87paA8sP92SnqxIx70ZTH4q3mZeTpOxaxE1PCWeZqSJW37iTqj_LXeGqLcicu_MnRKKiTnSd9UYy-MTQOrpClGdHxNoabuWqF8UTf3LmyK3E_ufQjY5X_uZwdx6fR9uvRRKLtRd/s1600-h/Universal+class_2.bmp"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 113px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIy785N87paA8sP92SnqxIx70ZTH4q3mZeTpOxaxE1PCWeZqSJW37iTqj_LXeGqLcicu_MnRKKiTnSd9UYy-MTQOrpClGdHxNoabuWqF8UTf3LmyK3E_ufQjY5X_uZwdx6fR9uvRRKLtRd/s320/Universal+class_2.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5320036737572442674" /></a><br /><br />Чтобы избежать подобных казусов я давно применяю прямую вычитку из Excel файлов в массивы, используя для этого стандартные ODBC источники. Данная техника успешно прижилась уже на следующих тестовых фреймворках: Rational Robot, IBM Rational Functional Tester, WinRunner и надеюсь QTP<br /><br />Помимо решения вышеперечисленных проблем мы избегаем также серьезного, на мой взгляд, ограничения по использованию одной таблицы для одного Excel sheet.<br /><br /><br /><strong>2.2. Предварительные шаги</strong><br /><br />В Excel документах имеется функциональность которая позволяет выделять значимые для пользователя подмножества ячееек в специальные структуры. Такие структуры называемые “именованными диапазонами” обеспечивают возможность обращаться к ним к ним через логические имена. <br />Кроме того (что гораздо более значимо для нас) такие диапазоны становятся видны как стандартные ODBC таблицы из внешних приложений.<br /><br />Итак, для оформления требуемой совокупности ячеек в качестве “именованного диапазона” необходимо выполнить следющую последовательность действий:<br />- выделить все ячейки, планируемые для оформления в именованный диапазон<br />- создать именованный диапазон через “Define name” диалог (Formulas > Define Name) <br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsP7zIlNb0XRspiEJdDE2tTBSzBwY2Yf8EVQRugqBnVWVcYYoDYBCO4ujc3sSPxe5U_WHgvKSCrmMAG52rqBsHz7Q32YWEudx6mZaMRnquW4DuioLAph_VwMCOC3Bhulp3mi4qx1ZkDrSd/s1600-h/Universal+class_3.bmp"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 194px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsP7zIlNb0XRspiEJdDE2tTBSzBwY2Yf8EVQRugqBnVWVcYYoDYBCO4ujc3sSPxe5U_WHgvKSCrmMAG52rqBsHz7Q32YWEudx6mZaMRnquW4DuioLAph_VwMCOC3Bhulp3mi4qx1ZkDrSd/s320/Universal+class_3.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5320038367385256722" /></a><br /><br />или напрямую введя имя диапазона в Navigation Bar.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG2aoGD2bs2zaEvFNaS-u0ouKsSeCtmwynFVriVTSEXnlCFuLU4yJrrfqZ2Yd8BCbtVnF3US7E2CTMBFBb7upAT4Sf1F7xPabaDZgRCY9xTlePF_pxd0-ZxRWVu7-kemRqwewZzuXBfYu4/s1600-h/Universal+class_4.bmp"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 255px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG2aoGD2bs2zaEvFNaS-u0ouKsSeCtmwynFVriVTSEXnlCFuLU4yJrrfqZ2Yd8BCbtVnF3US7E2CTMBFBb7upAT4Sf1F7xPabaDZgRCY9xTlePF_pxd0-ZxRWVu7-kemRqwewZzuXBfYu4/s320/Universal+class_4.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5320038585236007682" /></a><br /><br />Для проверки корректности вновь созданного именованного диапазона – выделите все ячейки диапазона и проверьте значение в Navigation Bar. Он должен содержать логическое имя вместо A1 нотации.<br /><br /><b>Важно</b> отметить одно требование обязательно при использовании именованных диапазонов в качестве источника данных:<br />- первая строка нашего диапазона должна содержать имена столбцов, а не данные<br /><br /><br /><strong>2.3. Со стороны функциональной библиотеки</strong><br /><br />После всех подготовительных шагов осталось совсем немного поработать руками, а точнее пописать код. <br />Раз уж QTP 9.5 предоставил нам замечательную возможность работать c “почти” объектами – грех было бы ей не воспользоваться. Поэтому весь наш функционал мы гордо завернем в класс с благозвучным названием <b>TestData</b>.<br /><br />Стоит напомнить, что QTP не видит напрямую классы, объявленные во внешних библиотеках, поэтому для каждого класса должна присутствовать функция создания экземпляра класса, в данном случае – <b>CreateTestData</b><br /><br />Кроме того мы должны иметь возможность инициировать наш класс не только через загрузку из Excel источника но и напрямую из кода. Именно для этих целей появились два метода: <b>SetData</b> и <b>GetData</b><br /><br /><span style="white-space:pre"><br /><b style="color:#1F497D">Public Function</b> CreateTestData ()<br /> <b style="color:#1F497D">Set</b> CreateTestData = new TestData<br /><b style="color:#1F497D">End Function</b><br /><br /><b style="color:#1F497D">Class</b> TestData<br /> <b style="color:#1F497D">Private</b> mTestTable()<br /><br /> <b style="color:#1F497D">Private Sub</b> Class_Initialize()<br /> <b style="color:#1F497D">End Sub</b><br /><br /> <b style="color:#1F497D">Private Sub</b> Class_Terminate()<br /> <b style="color:#1F497D">Erase</b> mTestTable<br /> <b style="color:#1F497D">End Sub</b><br /><br /><br /><span style="color:#00B050"> ' @Documentation Initiates TestData object with external data<br /> '-----------------------------------------------------------</span><br /> <b style="color:#1F497D">Public Sub</b> SetData (DataArr())<br /> <b style="color:#1F497D">Dim</b> i,j<br /><br /> <b style="color:#1F497D">ReDim</b> mTestTable(<b style="color:#1F497D">UBound</b>(DataArr, 1), <b style="color:#1F497D">UBound</b>(DataArr, 2))<br /> <b style="color:#1F497D">For</b> i=0 to <b style="color:#1F497D">UBound</b>(DataArr, 1)<br /> <b style="color:#1F497D">For</b> j=0 to <b style="color:#1F497D">UBound</b>(DataArr, 2)<br /> mTestTable(i,j) = DataArr(i,j)<br /> <b style="color:#1F497D">Next</b><br /> <b style="color:#1F497D">Next</b><br /> <b style="color:#1F497D">End Sub</b><br /><br /><br /><span style="color:#00B050"> ' @Documentation Extracts data from TestData object<br /> '---------------------------------------------------</span><br /> <b style="color:#1F497D">Public Sub</b> GetData(DataArr())<br /> <b style="color:#1F497D">Dim</b> i,j<br /> <br /> <b style="color:#1F497D">ReDim</b> DataArr(<b style="color:#1F497D">UBound</b>(mTestTable, 1), <b style="color:#1F497D">UBound</b>(mTestTable, 2))<br /> <b style="color:#1F497D">For</b> i=0 to <b style="color:#1F497D">UBound</b>(mTestTable, 1)<br /> <b style="color:#1F497D">For</b> j=0 to <b style="color:#1F497D">UBound</b>(mTestTable, 2)<br /> DataArr(i,j) = mTestTable(i,j)<br /> <b style="color:#1F497D">Next</b><br /> <b style="color:#1F497D">Next</b><br /> <b style="color:#1F497D">End Sub</b><br /></span><br /><br />Итак, мы вплотную подобрались к центральной части нашего функционала – вычитке данных из Excel источника. <br />За данную часть функционала отвечают два взаимосвязанных метода: <b>GetArrayFromStore</b> и <b>LoadFromStore</b><br />Первый позволяет нам выгрузить вычитанные данные во внешний массив, минуя наш класс, а второй наоборот – инициирует наш класс вычитанными данными.<br /><br /><span style="white-space:pre"><br /><span style="color:#00B050"> ' @Documentation Extracts test data from the Excel store<br /> '------------------------------------------------------</span><br /> <b style="color:#1F497D">Public Sub</b> GetArrayFromStore(Arr(), TableName, StoreName)<br /> <b style="color:#1F497D">Dim</b> Connection<br /> <b style="color:#1F497D">Dim</b> i, j, fieldcount, rowsfetched<br /> <b style="color:#1F497D">Dim</b> ArrTemp()<br /> <br /> <b style="color:#1F497D">Set</b> Connection = CreateObject("ADODB.Connection")<br /> Connection.ConnectionString = "DBQ=" + StoreName + _<br /> ";Driver={Microsoft Excel Driver (*.xls)}" + _<br /> ";DriverId=790;FIL=excel 8.0;MaxBufferSize=2048" + _<br /> ";MaxScanRows=8;PageTimeout=5;ReadOnly=1" + _<br /> ";SafeTransactions=0;Threads=3;UserCommitSync=Yes"<br /> Connection.Open<br /> <br /> <b style="color:#1F497D">Set</b> ConnRs = CreateObject("ADODB.Recordset")<br /> ConnRs.CursorType = 3<br /> <b style="color:#1F497D">Call</b> ConnRs.Open("select * from " + TableName, Connection)<br /> <br /> fieldcount = ConnRs.Fields.Count<br /> <b style="color:#1F497D">Redim</b> ArrTemp(fieldcount - 1, 0)<br /> <br /> <span style="color:#00B050">'column names adding</span><br /> <b style="color:#1F497D">for</b> j=0 to fieldcount - 1<br /> ArrTemp(j,0) = ConnRs.Fields(j).Name<br /> <b style="color:#1F497D">next</b><br /> <br /> rowsfetched = 0<br /> ConnRs.MoveFirst()<br /> <b style="color:#1F497D">While</b> not ConnRs.Eof<br /> rowsfetched = rowsfetched + 1<br /> <b style="color:#1F497D">Redim Preserve</b> ArrTemp(fieldcount - 1, rowsfetched)<br /> <b style="color:#1F497D">for</b> j=0 to fieldcount - 1<br /> ArrTemp(j, rowsfetched + i) = ConnRs(j).value<br /> <b style="color:#1F497D">next</b> <br /> ConnRs.MoveNext()<br /> <b style="color:#1F497D">Wend</b><br /> Connection.Close<br /> <br /> <span style="color:#00B050">'matrix transposition</span><br /> <b style="color:#1F497D">Redim</b> Arr(<b style="color:#1F497D">UBound</b>(ArrTemp,2), <b style="color:#1F497D">UBound</b>(ArrTemp,1))<br /> <b style="color:#1F497D">for</b> i=<b style="color:#1F497D">LBound</b>(ArrTemp,1) to <b style="color:#1F497D">UBound</b>(ArrTemp,1)<br /> <b style="color:#1F497D">for</b> j=<b style="color:#1F497D">LBound</b>(ArrTemp,2) to <b style="color:#1F497D">UBound</b>(ArrTemp,2)<br /> Arr(j,i) = ArrTemp(i,j)<br /> <b style="color:#1F497D">next</b><br /> <b style="color:#1F497D">next</b><br /><br /> <b style="color:#1F497D">End Sub</b><br /><br /><br /> <span style="color:#00B050">' @Documentation Loads test data from Excel store to the TestData object<br /> '-----------------------------------------------------------------------</span><br /> <b style="color:#1F497D">Public Sub</b> LoadFromStore (TableName, StoreName)<br /> <b style="color:#1F497D">call</b> GetArrayFromStore(mTestTable, TableName, StoreName)<br /> <b style="color:#1F497D">End Sub</b><br /></span><br /><br />Как вы можете заметить, ничего сверхъестественного в реализации данного функционала нет. Более того очевидно, что с небольшими модификациями такую же процедуру можно применять для вычитки данных из любого ODBC источника.<br />Нам осталось добавить несколько сервисных методов, чтобы наш класс стал действительно удобным в использовании: <b>GetCellByIndex</b>, <b>GetCellByName</b>, <b>ColumnCount</b>, <b>RowCount</b><br /><br /><span style="white-space:pre"><br /><span style="color:#00B050"> ' @Documentation Gets cell value by row-column indexes<br /> '------------------------------------------------------</span><br /> <b style="color:#1F497D">Public Function</b> GetCellByIndex (RowIndex, ColumnIndex)<br /> GetCellByIndex = mTestTable(RowIndex+1, ColumnIndex)<br /> <b style="color:#1F497D">End Function</b><br /><br /><br /><span style="color:#00B050"> ' @Documentation Gets cell value by column name and row index<br /> '-------------------------------------------------------------</span><br /> <b style="color:#1F497D">Public Function</b> GetCellByName (ColumnName, RowIndex)<br /> <b style="color:#1F497D">Dim</b> j<br /><br /> <b style="color:#1F497D">for</b> j = 0 to <b style="color:#1F497D">UBound</b>(mTestTable,2)<br /> <b style="color:#1F497D">If</b> (ColumnName = mTestTable(0,j)) <b style="color:#1F497D">Then</b> <br /> <b style="color:#1F497D">Exit For</b> <br /> <b style="color:#1F497D">End if</b><br /> <b style="color:#1F497D">next</b><br /> <br /> GetCellByName = mTestTable(RowIndex+1, j)<br /> <b style="color:#1F497D">End Function</b><br /><br /> <br /><span style="color:#00B050"> ' @Documentation Returns number of columns into the test data table<br /> '------------------------------------------------------------------</span><br /> <b style="color:#1F497D">Public Function</b> ColumnCount()<br /> ColumnCount = <b style="color:#1F497D">UBound</b>(mTestTable, 2)<br /> <b style="color:#1F497D">End Function</b><br /><br /><br /><span style="color:#00B050"> ' @Documentation Returns number of rows into the test data table<br /> '---------------------------------------------------------------</span><br /> <b style="color:#1F497D">Public Function</b> RowCount()<br /> RowCount = <b style="color:#1F497D">UBound</b>(mTestTable, 1) - 1<br /> <b style="color:#1F497D">End Function</b><br /></span><br /><br /><strong>2.4. Со стороны тестового скрипта</strong><br /><br />Как же будет выглядеть минимально необходимый набор операций для инициализации нашего класса и вычитки данных на стороне скрипта.<br /><br /><span style="white-space:pre"><br /><b style="color:#1F497D">Dim</b> TestArr() <span style="color:#00B050">‘Dynamic array</span><br /><b style="color:#1F497D">Dim</b> TestD<br /><br /><b style="color:#1F497D">Set</b> TestD = CreateTestData()<br /><br /><b style="color:#1F497D">Сall</b> TestD.LoadFromStore("NamedRange", "C:\ExcelStore.xls")<br /><b style="color:#1F497D">Сall</b> TestD.GetArrayFromStore(TestArr, "NamedRange", "C:\ExcelStore.xls")<br /><span style="color:#00B050">‘Call TestD.GetArrayFromURL(TestArr, "OrgChart@"+ "C:\ExcelStore.xls")</span><br /><br /><b style="color:#1F497D">Call</b> TestD.SetData(TestArr)<br /><b style="color:#1F497D">Erase</b> TestArr<br /><b style="color:#1F497D">Call</b> TestD.GetData(TestArr)<br /><br />Print TestArr(1,1)<br />Print TestD.GetCellByIndex(2,2)<br />Print TestD.GetCellByName("Name", 2)<br />Print TestD.RowCount<br />Print TestD.ColumnCount<br /></span><br /><br />Обращаю ваше внимание, что массив (если вы решите выгружать данные из TestData объекта) должен быть динамическим, а не статическим.<br /><br />Для более глубокого понимания функционала предлагаю пройтись по нему в режиме отладки и внимательно проконтролировать весь процесс. <br /><br />Вы также наверняка заметили одну закомментированную функцию, я имею в виду <b>GetArrayFromURL</b>. <br />Я использую данную функцию для удобной реализации вложенных данных. В этом случае на уровне Excel каждая строка должна содержать дополнительную колонку, в которой хранится URL связанного массива данных.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ5UXikq2hFv06lRtNUTAL_d9aDDPtPKxUoiPUbkMNlr6wwBN4h-pIFlB-Yloh5SCBX2OkfXaOb4wt3NJFniQMfHELkGdW2Ubgdk7PMQSmvHXDvfuPK8K58g1WZ7OV6NBhBhWpflY1m_yr/s1600-h/Universal+class_5.bmp"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 92px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQ5UXikq2hFv06lRtNUTAL_d9aDDPtPKxUoiPUbkMNlr6wwBN4h-pIFlB-Yloh5SCBX2OkfXaOb4wt3NJFniQMfHELkGdW2Ubgdk7PMQSmvHXDvfuPK8K58g1WZ7OV6NBhBhWpflY1m_yr/s320/Universal+class_5.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5320040915243887378" /></a><br /><br />Предлагаю вам реализовать данную функциональность самостоятельно.<br /><br /><br /><strong>3. Выводы</strong><br /><br />Возможно, кого-то, во время прочтения статьи, не покидало ощущение бесполезности реализации дополнительной функциональности имея стандартные средства работы с Eхcel. Частично я уже объяснял причины необходимости этого выше (Основные задачи). Но кроме этого хотелось бы еще добавить в копилку знаний несколько замечаний. <br /><br />В силу особенностей моей специализации (функциональное автоматизированное тестирование) мне не удается работать с каким-то одним фреймворком. Тем не менее, всегда очень хочется использовать предыдущие наработки и обустроить свою работу максимально комфортно. Как оказалось это совсем не сложно и позволяет в итоге работать в привычных комфортных условиях, максимально используя уже проверенные схемы.<br /><br /><em>С уважением,<br />Сергей Талалаев</em><br /><span style="color:white;">С большой признательностью к моей коллеге Анне Валерьевне.</span><br /></span>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com2tag:blogger.com,1999:blog-8226300894599246881.post-80216531083772772552009-02-02T15:37:00.008+02:002009-02-02T16:16:20.118+02:00Сертификация: За и ПротивПора!<br /><br />Пора и мне, наконец, сказать, что я думаю по поводу сертификации тестировщиков и как я себе ее вижу.<br /><span class="fullpost"><br /><span style="font-weight: bold;">Начну с хорошего</span>.<br /><br />1. Как и любое обучение, подготовка к сертификации немного <span style="font-weight: bold;">дисциплинирует</span>. На это нужно, как бы вы не сопротивлялись, отводить свое драгоценное время, будь то рабочее или внерабочее, когда при других обстоятельствах вы могли бы занять это время чем-то более интересным.<br /><br />2. Сертификация <span style="font-weight: bold;">помогает систематизировать знания</span>. Особенно тем, кто не приобретал профессию тестировщика в университетах, а постигал все это на практике. Знаете, это как в школе: вам рассказывают уйму материала, например, по математике в течение 11 лет, но вы так и не можете понять, что, с чем и как связано. Вроде бы и по системе преподают, а системы в знаниях нет как таковой. И только когда вы начинаете готовиться к экзаменам, когда задачи затрагивают перекрестные темы, только тогда вы начинаете видеть и понимать, что к чему (хотя, тоже не все). Точно так же и здесь: у вас уже много практических навыков, а при подготовке к сертификации вы начинаете связывать их в логическую цепочку, понимаете, что и какими словами правильно называется в теории.<br /><br />3. Сертификация позволяет приобрести <span style="font-weight: bold;">дополнительные теоретические знания</span> (хотелось бы подчеркнуть - теоретические). Как бы там ни было, даже если вы прочитали миллион книг и статей, то при подготовке к сертификации вы, если и не сделаете для себя открытие в теории, то, по крайней мере, услышите чье-то другое мнение по некоторым аспектам изучаемой области, другой взгляд на те же вещи.<br /><br />4. <span style="font-weight: bold;">Иногда</span> сертификат <span style="font-weight: bold;">может помочь при принятии на работу</span>: либо обрести позицию повыше, либо попросить денег побольше.<br /><br />5. Международная сертификация позволяет специалисты во всем мире <span style="font-weight:bold;">говорить на одном профессиональном языке</span>, а также <span style="font-weight:bold;">по одной шкале</span> оценивать знания.<br /><br />Всего, что описано выше, можно добиться и другими методами. Однако, речь не об этом.<br /><br /><span style="font-weight: bold;">А теперь немного горькой пилюли</span>.<br /><br />1. Сертификации бывают разные… К сожалению, не всякой сертификации можно доверять (а можно ли вообще хоть какой-то?). Глупые вопросы, ни коим образом не проверяющие даже знание теории, не могут быть показателем уровня специалиста.<br /><br />2. К сожалению, с помощью сертификации, если и можно что-то оценить, то это только теоретические знания, но никак не навыки. И, если практика без теории всего лишь слепа, то теория без практики, как известно, мертва. Думаю, мало кому в команде нужен чистой воды теоретик...<br /><br />3. Точно так же, как сертификат иногда помогает найти лучшую работу, он может и затруднить ее поиски. Я, например, знакома с системным архитектором, имеющим целый ряд сетрификатов и по девелопменту, и по менеджменту, но не способному настроить Windows-сервис по инструкции.<br />Есть мнение, что, не имея достаточно аргументов, чтобы доказать свой профессионализм, люди стараются получить как можно больше сертификатов. Поэтому к обилию сетрификатов я отношусь более, чем скептически :)<br /><br />В заключение хочу сказать, что сертификат можно получать только в случае необходимости или острого желания иметь таковой. А вот какой-то экстраординарной пользы я от них не вижу. <br /><br /><span style="font-style:italic;">Всегда ваша,<br />Наташа Густыр</span><br /></span>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com0tag:blogger.com,1999:blog-8226300894599246881.post-22683862904658720842009-01-28T21:04:00.004+02:002009-01-28T23:33:38.932+02:00Дебаты вокруг сертификации тестировщиковИ снова здравствуйте! :)<br />И сразу, как говорится, вопрос в лоб:<br /><br />Коллеги, а многие ли среди ваших знакомых тестировщиков имеют сертификаты?<br />А многие ли хотят иметь?<br />А многие ли столкнулись с необходимостью их иметь?<br />А как вы относитесь к сертифицированным специалистам?<br /><br />Как ни странно, но тема сертифицирования тестировщиков очень актуальна в последнее время...<br /><span class="fullpost"><br />Писали об этом уже и Алесей Баранцев в статье <a href="http://www.software-testing.ru/editorial/368-certification">"Какие сертификаты нужны тестировщикам"</a>,<br />и Александр Орлов в статье <a href="http://www.happy-pm.com/blog/?p=226">"Шашечки или ехать"</a>. Кстати, надо сказать, что в <a href="http://www.happy-pm.com/blog/?p=242&cpage=1#comment-5460">голосовании</a>, которое устроил тот же Александр Орлов наблюдается весьма интересная картина по результатам...<br /><br />А ваше мнение какое?<br /><br />Кстати сказать, я тоже имею что сказать на этот счет, но скажу буквально очень скоро :)<br /><br /><span style="font-style:italic;">Всегда ваша,<br />Наташа Густыр</span><br /></span>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com25tag:blogger.com,1999:blog-8226300894599246881.post-75766749031053294492009-01-26T22:38:00.005+02:002009-01-26T22:58:42.502+02:00Урок 53: Оценочные (evaluation-based) техники фокусируются на том, как определить, что тест выполнен или провален<div><span style="font-style: italic;"><br />Lessons Learned in Software Testing<br />Авторы: Cem Kaner, James Bach и Bret Pettichord<br />Перевод: Сергей Талалаев</span><br /><br />Оценочные техники описывают методы для определения того, что программа выполнила или провалила тест. Они не определяют, как тестирование должно выполняться, или как должны собираться данные. Они говорят вам, что если вы можете собрать определенные данные, то вы сможете их оценить.<br /><span class="fullpost"><br /><b>Самотестируемые данные.</b> Файлы данных, используемые вами для тестирования, несут в себе информацию, которая позволяет вам определять, что выходные данные повреждены.<br /><br /><b>Сравнение с сохраненными результатами.</b> Регрессионное тестирование (обычно, но не всегда автоматизированное), в котором тот факт, пройден тест или провален, определяется путем сравнения результатов, полученных вами сегодня, с результатами предыдущей недели. Если результаты были корректными на прошлой неделе и отличаюся сегодня, то такое различие может говорить о новом дефекте.<br /><br /><b>Сравнение со спецификацией или другим авторитетным документом.</b> Различие со спецификацией - это (возможно) ошибка.<br /><br /><b>Эвристическое соответствие.</b> Соответствие - это важный критерий оценки<br />программы.Несоответствие может быть поводом для создания отчета об ошибке или отражать сознательное изменение дизайна. Мы используем в работе 7 основных соответствий:<br />1. <i>Историческое соответствие.</i> Текущие поведение функции соответствует её поведению в прошлом.<br />2. <i>Соответствие в представлении.</i> Поведение функции соответствует тому, что организация ожидала от проекта.<br />3. <i>Соответствие со сравнимыми продуктами.</i> Поведение функции соответствует поведению подобных функций в сравнимых продуктах.<br />4. <i>Соответствие утверждениям.</i> Поведение функции соответствует тому, как, по мнению людей, это должно быть.<br />5. <i>Соответствие ожиданиям.</i> Поведение функции соответствует тому, что, по вашему мнению, хочет пользователь.<br />6. <i>Соответствие продукту.</i> Поведение функции соответствует поведению сравнимых функций или функциональных шаблонов в продукте.<br />7. <i>Соответствие цели.</i> Поведение функции соответствует её истинной цели.<br /><br /><b>Оракул-based тестирование.</b> Оракул - это оценочное приспособление, которое скажет вам о том, что программа прошла или провалила тест. В высокопроизводительном автоматизированном тестировании оракул - это обычно другая программа,которая выдает результаты или оценивает результаты проверяемой программы. Оракул обычно более авторитетен, чем проверяемая программа, поэтому беспокойство, отмеченное оракулом, стоит времени и усилий, потраченных на проверку.<br /></span></div>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com6tag:blogger.com,1999:blog-8226300894599246881.post-8478829884826262102009-01-14T15:53:00.028+02:002009-02-02T15:39:50.333+02:00SQA days 2008: текст доклада "Причины пожара на проектах"Мы уже <a href="http://sqadotby.blogspot.com/2008/11/sqa-days-2008.html">писали</a> о выступлении на конференции SQA days и обещали опубликовать свои доклады. Наташа и Сергей сдержали обещание. Теперь моя очередь :) Я постаралась максимально приблизить печатную версию к устной, чтобы сохранить дух "живого" выступления. <br /><span class="fullpost"><br />«Горящий» проект – не редкость в IT сфере. Отставание от плана может возникать на разных стадиях: от инициализации проекта до тестирования. Данный доклад - попытка ответить на вопрос: «Почему тестировщики не укладываются в сроки?».<br /><br />Недавно мне «посчастливилось» принимать участие в проекте, на котором отставание от сроков – обычное дело. Сразу хочу пояснить, что я понимаю под отставанием от сроков. Это разница между реально потраченным и запланированным временем (см. рисунок 1).<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMtdot1qJNBJZf670DtilUcROdJhUU_m83mGiz4YpXx9vs1yfRAGQqKDnOFQ-PysbbhGsMNolJBZlwLh6JXq6zDwrLwlG0AAA6oeIl_8GMOS8nmMgkgWqQr01YGNQbqH_Tz3w6KdcNeGW5/s1600-h/%D0%9E%D1%82%D1%81%D1%82%D0%B0%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+%D0%BE%D1%82+%D1%81%D1%80%D0%BE%D0%BA%D0%BE%D0%B2.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 203px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMtdot1qJNBJZf670DtilUcROdJhUU_m83mGiz4YpXx9vs1yfRAGQqKDnOFQ-PysbbhGsMNolJBZlwLh6JXq6zDwrLwlG0AAA6oeIl_8GMOS8nmMgkgWqQr01YGNQbqH_Tz3w6KdcNeGW5/s320/%D0%9E%D1%82%D1%81%D1%82%D0%B0%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5+%D0%BE%D1%82+%D1%81%D1%80%D0%BE%D0%BA%D0%BE%D0%B2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5291147927520441522" /></a><br />В докладе рассматриваются причины невыполнения в срок задач тестовой команды, хотя многое из того, о чём будет говориться ниже, актуально для любых проектных активностей.<br /><br />Несколько слов о проекте, который вдохновил меня на подготовку этого доклада. Проект был сложный… :) Причём, я сейчас говорю не о сложности задач, которые стояли перед нашей командой, а о сложной структуре проекта. На рисунке 2 представлена схема этого проекта, где З1...З8 – задачи, из которых состоит реализация проекта, К1…К8 – компании (подрядчики), которые принимают участие в проекте. Как видно, каждый подрядчик отвечает за свою задачу. И даже заказчик выполняет часть работ по созданию программного обеспечения.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1SvAbonTX5dK4dwz8MJTL-75kdqnB22rjNprSaIpixI8KNaHgK0b3UScLQihKBWJ7shyphenhyphenmPjMfHQ9baH4CL8Ku97XDJHauz3QC0V0pi_236Jehsj8lMz-qDoqUqbPm40FNLK2QT9E9Jkjx/s1600-h/%D0%A1%D1%85%D0%B5%D0%BC%D0%B0+%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D0%B3%D0%BE+%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 250px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1SvAbonTX5dK4dwz8MJTL-75kdqnB22rjNprSaIpixI8KNaHgK0b3UScLQihKBWJ7shyphenhyphenmPjMfHQ9baH4CL8Ku97XDJHauz3QC0V0pi_236Jehsj8lMz-qDoqUqbPm40FNLK2QT9E9Jkjx/s320/%D0%A1%D1%85%D0%B5%D0%BC%D0%B0+%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D0%B3%D0%BE+%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5291148491298161746" /></a><br /> <br />Многое из того, о чём пойдёт речь дальше, навеяно именно этим сложным проектом, но также я использовала опыт участия в более простых проектах (Рисунок 3). <br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp-aJ1puszZIBZbdvTM_mg0Pq2srFEegJUMOJ1u2G_UyB6-OeEbF3iWCI2ayqSXpBztluCIYfCMnEg1aFeOGFZlNDgpI2aB2pchkZsMU8mOgzv0DhNUpN36ITRtjUTKvKyD64psL5pz1M2/s1600-h/%D0%A1%D1%85%D0%B5%D0%BC%D0%B0+%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%BE%D0%B3%D0%BE+%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0.JPG"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 236px; height: 261px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp-aJ1puszZIBZbdvTM_mg0Pq2srFEegJUMOJ1u2G_UyB6-OeEbF3iWCI2ayqSXpBztluCIYfCMnEg1aFeOGFZlNDgpI2aB2pchkZsMU8mOgzv0DhNUpN36ITRtjUTKvKyD64psL5pz1M2/s320/%D0%A1%D1%85%D0%B5%D0%BC%D0%B0+%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%BE%D0%B3%D0%BE+%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5291150023451274418" /></a><br />Думаю, понятно, что вероятность «пожаров» на проектах со сложной структурой больше. Естественно, здесь много зависимостей. Если один из подрядчиков на начальном этапе не уложился в сроки, то «поплывут» даты в планах у остальных компаний-подрядчиков. На сложном проекте часто возникает ситуация: «а это не я». Это когда на выявление ошибки уходит час, а на выявление ответственного за неё тратятся дни или даже недели. Каждая компания пытается сделать крайним кого-то другого. Такая проблема обычно возникает из-за плохой организации взаимодействия между участниками проекта и нечёткого разграничения обязанностей.<br /><br />Теперь непосредственно о самих причинах. Одна из самых очевидных причин «пожаров» - <span style="font-weight:bold;">нереальные сроки</span>. Как эти «нереальные» сроки появляются? Например, заказчик говорит: «нужно, чтобы эта функциональность (F1...Fn) была готова к такому-то числу». И тут начинается попытка уместить всю требуемую функциональность в указанные сроки (хотя бы в плане проекта, который потом не соответствует действительности). В данном случае ошибка в том, что не исполнитель оценивает временные затраты, а заказчик устанавливает дату. Если времени для реализации требуемой функциональности явно недостаточно, то нужно выбирать: или урезанная функциональность в указанные сроки или смещение сроков для реализации полного объёма задач. <br /><br />Также часто я наблюдала пожары, когда <span style="font-weight:bold;">требования менялись в ходе проекта</span>. Если не переписать план в связи с изменением требований, то вероятность своевременного окончания проекта невелика :)<br /><br />Для тестировщиков, которые выполняют задачи по уже составленному менеджером плану, часто очень актуальной проблемой становится <span style="font-weight:bold;">неполный учёт задач в плане</span>. Например, часто забывают о том, что уходит <span style="font-style:italic;">время на новичков, на помощь разработчикам в воспроизведении дефектов, на подготовку тестовых данных, на подготовку внеплановых отчётов для руководства</span>. Плохой анализ требований и спецификации может привести к тому, что в тест-кейсах будут присутствовать не все проверки, а, следовательно, будет неправильно оценено время на тестирование. Даже одна пропущенная строка в спецификации может послужить искрой, из которой вырастет пожар. Например, в требованиях сказано: «Система должна работать под ОС Win 98, 2000, XP, Vista». Если в тест-кейсах об этом нет ничего, то тестирование будет проводиться на любой доступной тестировщику ОС (XP, например). Дальше заказчик начинает принимать Систему (на 98-й, например) – и начинается… Неожиданные ошибки, перепроверка Приложения на всех требуемых ОС, исправление дефектов и т.д. Пожар на лицо :)<br /><br />Допустим, оценка временных затрат проводилась компанией – разработчиком (а не заказчиком), в плане учтены все задачи ориентируясь на абстрактного среднестатистического тестировщика. Вроде, всё хорошо. Но и здесь могут возникнуть проблемы. Не все тестировщики одинаковые. У них может быть <span style="font-weight:bold;">разная квалификация</span>. Здесь можно рассмотреть несколько случаев: <br />– <span style="font-style:italic;">человек просто плохой работник</span>: или он делает всё слишком медленно (гораздо медленнее, чем среднестатистический сотрудник отдела тестирования), или делает быстро, но так, что доверять результатам нельзя, или и то, и другое... Т.е. человек не на своём месте.<br />– <span style="font-style:italic;">новичок в профессии</span> (в компании, на проекте) – понятно, что человеку нужно время на адаптацию, и его не сразу можно считать полноценным ресурсом.<br />– <span style="font-style:italic;">неправильных подбор персонала на проект или неправильное распределение задач внутри тестовой команды</span> на проекте. Например, человек всё время занимался тестированием десктоповских приложений, и тут его назначают на тестирование приложений для мобильных технологий. Понятно, что нужно время на то, чтобы вникнуть в предметную область. Или другой пример: тестировщика, который всегда занимался мануальным тестированием, назначают на проект по автоматизации тестирования. Т.е. при назначении людей на проект и при распределении задач внутри команды тест-менеджер должен учитывать сильные и слабые стороны своих подчинённых. НО: нельзя всегда выдавать человеку однотипные задачи только потому, что он хорошо их выполняет. Рано или поздно тестировщику станет скучно :)<br /><br />Как правило, задачи в планах плавно перетекают одна в другую, т.е. между ними нет перерывов. Но ведь часто возникают <span style="font-weight:bold;">вынужденные простои</span>. Например, <span style="font-style:italic;">увеличение сроков анализа, разработки и других предшествующих тестированию этапов</span> ведёт к простою команды тестирования. Ещё одна причина простоя - <span style="font-style:italic;">блокирующая критическая ошибка</span>, до исправления которой тестировать невозможно или нет смысла. <span style="font-style:italic;">Недоступность приложения</span> также блокирует работу тестировщика. Причины недоступности приложения: <br />– недоступен сам сервер (сгорел, на нём проводят профилактические работы, например, увеличивают кол-во памяти);<br />– идёт установка новой версии приложения;<br />– на тестовой платформе разработчики проводят исследования и эксперименты;<br />– на тестовой платформе проводится нагрузочное тестирование;<br />– на тестовой платформе проводится приёмочное тестирование заказчиком.<br />Т.е. здесь возникает <span style="font-weight:bold;">проблема взаимодействия</span> команд тестирования, разработки, внедрения. Сюда же можно отнести <span style="font-style:italic;">проблему коммуникации между участниками проекта</span>, которые находятся далеко друг от друга: в разных странах, а ещё хуже, в разных часовых поясах. Здесь увеличивается время на обсуждения и принятие решений. Также существует <span style="font-style:italic;">проблема «свободного» графика работы</span>, который так популярен в IT сфере. Допустим, в команде есть носитель «тайных знаний», без которого «работа стоит». Если этот «тайный носитель» любит поспать, то плохо дело :) Нужно или передавать знания (а ещё лучше оформить их в виде документации), или договариваться о более строгом графике работы.<br /><br />И в заключение причины «пожаров», которые предусмотреть сложно – это форс-мажорные обстоятельства. Например, авария на серверах, отсутствие электричества, отсутствие тестировщика на рабочем месте (заболел, уволился и т.п.).<br /><br />Естественно, я не перечислила всех возможных причин отставаний от запланированных сроков. Главное, о чём я хотела рассказать: нельзя надеяться на то, что всё будет идти идеально. Хотя надеяться можно, но «соломку лучше подстелить», т.е. заложить в план риски. Нужно тщательно проанализировать тип проекта, его размеры и структуру, оценить команду и составить адекватный план, по которому будет комфортно работать. Не будет лишних переживаний ни у Вас, ни у заказчика :)<br /><br />С Уважением,<br />Ольга Балашенко<br /></span>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com0tag:blogger.com,1999:blog-8226300894599246881.post-17776947445673791822009-01-12T01:44:00.007+02:002009-01-12T02:01:26.802+02:00Вырасти себе тестировщика<span style="font-style:italic;">По мотивам доклада на конференции SQA Days 2008 в Минске. </span><br /><br />Мировой финансовый кризис оказывает значительное влияние на работу IT-компаний: сокращается количество потенциальных проектов и, соответственно, повышается конкуренция. В таких условиях компании вынуждены обратить особое внимание на обеспечение конкурентного преимущества, чтобы выжить и остаться на плаву. Приходится снижать ставки, и на первое место выходит продуктивность и эффективность работы каждого сотрудника. Решение проблемы заключается, с одной стороны, в оптимизации процессов работы компании и, с другой стороны, в развитии персонала.<br />Для того, чтобы процессы повышения продуктивности работы, обучения и развития были эффективными, они должны быть измеримыми. Для этого необходимо иметь точку отсчета.<br />За точку отсчета разумно принять оценку текущего состояния организации в целом и каждого сотрудника в частности.<br />В докладе рассматривается только одна сторона вопроса – тема оценки, аттестации, обучения и развития тестировщиков силами компании или силами внешних экспертов.<br /><span class="fullpost"><br /><span style="font-weight:bold;">1. Оценка индивидуальной деятельности тестировщиков</span><br />Как и в любой другой деятельности, тестировщику важно понимать, что ему необходимо делать, чтобы его работа была эффективной.<br />С другой стороны, организации необходимо понимать, чего требовать от сотрудника, согласно каким критериям производить оценку его работы. Таким образом, перед руководителем отдела тестирования стоит задача в определении стандартов работы тестировщиков.<br />Достижение определенных стандартов также служит почвой для вознаграждения специалистов.<br />Независимо от того, какие критерии и стандарты индивидуальной работы используются, с самого начала их необходимо обсудить с тестировщиками, и получить их согласие и понимание. В этом случае, тестировщикам будет проще самостоятельно оценивать, соответствует ли их деятельность установленным критериям. <br />Таким образом, первый этап в развитии тестировщика – это постановка цели, которую нужно достичь, причем цель эта должна соответствовать небезызвестным критериям SMART (точная, измеримая, согласованная, реалистичная и ограниченная во времени).<br />Вторым шагом менеджер, совместно с тестировщиком, должен спланировать процесс достижения поставленной цели и определить необходимые для этого мероприятия.<br />И, конечно, нельзя оставлять спланированный процесс без наблюдения. Задачи, которые вы раздаете и не контролируете, могут не выполняться или выполняться с трудом.<br /><br />Менеджер может использовать следующие методы мониторинга и оценки показателей персонала:<br />- Наблюдение и личное участие;<br />- Опрос и обсуждение;<br />- Регулярный сбор метрик;<br />- Другие отчеты;<br />- Аттестация – как оценка деятельности по истечении некоторого периода времени.<br /><br />По результатам оценки могут быть предприняты различные действия:<br />- Продолжение работы без изменений<br />- Корректировка выполнения работы<br />- Пересмотр стандартов<br /><br />Весь цикл выглядит следующим образом:<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuJZqJYRO29vr5kcAuzzRDqU49T2l0WSib7BQa1t-rZIW0EiPXTZqoUEJXDVr4QgL-Spbw0kDC9dAlLvo2F-FEQuDDK2puKvrzXqmQEONF8brkP5CTgnVhISC-N5jeXlM1FZIdh0pxTrRi/s1600-h/%D0%A2%D0%9C%D0%9002_%D1%80%D1%8B%D0%B1%D0%B02_Page-2.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 261px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuJZqJYRO29vr5kcAuzzRDqU49T2l0WSib7BQa1t-rZIW0EiPXTZqoUEJXDVr4QgL-Spbw0kDC9dAlLvo2F-FEQuDDK2puKvrzXqmQEONF8brkP5CTgnVhISC-N5jeXlM1FZIdh0pxTrRi/s320/%D0%A2%D0%9C%D0%9002_%D1%80%D1%8B%D0%B1%D0%B02_Page-2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5290188947610746162" /></a><br />Регулярный обмен информацией создает у исполнителей ощущение собственной значимости, поддерживает в них ясное понимание того, что от них ожидается при выполнении порученной работы. Плюс ко всему, может использоваться для контроля показателей деятельности.<br />Когда работа выполняется хорошо, тестировщик должен получать позитивную обратную связь, если работа не соответствует ожиданиям, то обратная связь должна быть конструктивной (похвала сильных сторон и комментарии по слабым, с акцентом на то, как справиться с трудностями). Только в этом случае человек будет чувствовать себя ценимым, и, соответственно, будет мотивирован к достижению установленных показателей. Ибо незабота о персонале является сильным демотивирующим фактором, и ни о каком росте и развитии в этом случае не может быть и речи.<br />Обратная связь должна быть: уместная, справедливая и своевременная.<br />Регулярная и уместная обратная связь является основой для формальной аттестации.<br /><br /><span style="font-weight:bold;">2. Аттестация персонала</span><br />Аттестация – это формализованная обратная связь. В ходе этого мероприятия рассматриваются достижения и проблемы, подводятся итоги и строятся планы на будущее.<br />Выгодна она тем что:<br />- Подталкивает к осмыслению достижений и осознанию затруднений<br />- Определению направлений развития и карьерных устремлений<br />- Дает возможность мотивировать персонал<br />- Улучшать эффективность работы команды<br />- Улучшать обмен информацией<br />- И др.<br />Мы будем рассматривать только узкий аспект аттестации – оценка знаний и навыков тестировщиков с целью их дальнейшего развития. Все остальное – условия работы, соответствие трудовому договору, межличностные отношения и взаимодействие с другими людьми, управление временем и др. – в настоящей статье не затрагиваются.<br />И, кстати говоря, не рекомендуется использовать аттестацию для вознаграждения (хотя некоторые компании именно так и поступают). Первоначальная идея аттестации – создание дружественной атмосферы развития.<br />Стандартной процедуры проведения аттестации не существует, есть только некоторые общие принципы. Рассмотрим их.<br /><br /><span style="font-style:italic;">Подготовка аттестации</span><br />Если организация тщательно готовилась к набору тестировщиков, то подготовка аттестации будет проводиться немного проще, нежели начинать ее с нуля.<br /> Что необходимо сделать:<br />- Анализ работы. Должен ли тестировщик писать тестовую документацию, проводить статическое тестирование требований, писать скрипты, работать с определенными инструментами и т.д.?<br />- Анализ организации. Какие именно инструменты используются в организации, каковы процессы в организации (старт проекта по тестированию, передача программного обеспечения на тестирование, коммуникации внутри команды и др.), с какими заказчиками работает организация, какие проекты разрабатывает (веб, десктоп, специальные бизнес-области) и т.д. <br />- Должностная инструкция. На основании двух описанных видов анализа составляется должностная инструкция. <br />- Требования к исполнителю. На основании должностной инструкции определяются требования к тестировщику (или группе тестировщиков).<br /><br />На основании результатов этих действий составляются анкеты, вопросники и готовятся аттестационные собеседования.<br />Тестировщики должны быть осведомлены о том, что будет проводиться аттестация, и ознакомлены с предъявляемыми требованиями.<br /><span style="font-style:italic;"><br />Проведение аттестации: тесты и собеседования</span><br />Ранее уже упоминалось, что при проведении аттестации будем делать акцент на проверке знаний и навыков.<br />Для проверки знаний удобно использовать тесты. Желательно формулировать открытые вопросы, потому что ответ на закрытый вопрос можно легко угадать.<br />Проверку навыков с помощью тестов осуществить затруднительно. Поэтому в данном случае рекомендую проводить аттестационные собеседования (с выдачей, например, тестовых заданий или наблюдением за работой тестировщика на текущем проекте). <br />При отсутствии времени и/или навыков в составлении вопросников для проверки знаний также можно использовать аттестационные собеседования. <br /><span style="font-style:italic;"><br />Обработка результатов, принятие решений</span><br />Результаты проведенных тестов и собеседований необходимо собрать и обработать. Для наглядности удобно составлять профиль по каждому человеку, выделяя области знаний и навыков.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8HmpzHRAV6_00haoowoy1nbW-Rk233ZG_JF3FZtsWNoKYiDhBPmhJY63_4j17Zd6a7fKZwt6ghyphenhyphenRHH3_7r9sw2OqPSG3xFUCFRcyOA79OMa-HMQxf0UZVtMg1jHIkwHaE2Bd5GHH4jrT0/s1600-h/%D0%A2%D0%9C%D0%9002_%D1%80%D1%8B%D0%B1%D0%B02_%D0%BF%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D1%8C.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 179px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8HmpzHRAV6_00haoowoy1nbW-Rk233ZG_JF3FZtsWNoKYiDhBPmhJY63_4j17Zd6a7fKZwt6ghyphenhyphenRHH3_7r9sw2OqPSG3xFUCFRcyOA79OMa-HMQxf0UZVtMg1jHIkwHaE2Bd5GHH4jrT0/s320/%D0%A2%D0%9C%D0%9002_%D1%80%D1%8B%D0%B1%D0%B02_%D0%BF%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D1%8C.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5290189463170347458" /></a><br />При необходимости можно использовать и сводные таблицы для группы тестировщиков одной должности, или другие схемы визуализации.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkproDHqu7rh1pan57z04xCf4QKnYYvBuDmj1qAwy5mMnZCHyYVqO6b92OLlZq2Wltz0yR-uQAYaz-ZTZzPX0GEP3hWIXHjjScEitfS5Pdg-yNx6s05d2pb7uKrzlrnLu9z1PWQZxNzDQb/s1600-h/%D0%A2%D0%9C%D0%9002_%D1%80%D1%8B%D0%B1%D0%B02_%D1%81%D0%B2%D0%BE%D0%B4%D0%BD%D0%B0%D1%8F.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 239px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkproDHqu7rh1pan57z04xCf4QKnYYvBuDmj1qAwy5mMnZCHyYVqO6b92OLlZq2Wltz0yR-uQAYaz-ZTZzPX0GEP3hWIXHjjScEitfS5Pdg-yNx6s05d2pb7uKrzlrnLu9z1PWQZxNzDQb/s320/%D0%A2%D0%9C%D0%9002_%D1%80%D1%8B%D0%B1%D0%B02_%D1%81%D0%B2%D0%BE%D0%B4%D0%BD%D0%B0%D1%8F.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5290189605016431842" /></a><br />Имея информацию в обработанном виде, необходимо ее проанализировать и принять решение о дальнейших действиях для развития конкретного специалиста по тестированию.<br /><br /><span style="font-weight:bold;">3. Разработка программ обучения</span><br />Что такое развитие? Это расширение способностей и навыков. Индивидуальное развитие должно увеличивать уверенность тестировщика в своих силах, его самосознание и знания. И в первую очередь, развитие – это ответственность самого человека.<br />Вы же, как менеджер, можете и должны содействовать развитию своих подчиненных. Для этого, как я уже говорила в самом начале, необходимо снова согласовать цели, установить, при необходимости, новые стандарты, а затем спланировать обучение. Вы должны выступать интегратором обучения своих тестировщиков на работе и вне ее.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI5qYi6jN8BW4W5mHoqakUnjGO1w6YIuQMKUOy96wvLRzyVuFQoK8JpE9i9siNSIkdmd9CNX5CHZg89OxaBeocP1hYyfAebjyncz7C2YhzqWFBggg16gkQtTVnUBMpvQ89TBl__N9rrvHM/s1600-h/%D0%A2%D0%9C%D0%9002_%D1%80%D1%8B%D0%B1%D0%B02_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 215px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI5qYi6jN8BW4W5mHoqakUnjGO1w6YIuQMKUOy96wvLRzyVuFQoK8JpE9i9siNSIkdmd9CNX5CHZg89OxaBeocP1hYyfAebjyncz7C2YhzqWFBggg16gkQtTVnUBMpvQ89TBl__N9rrvHM/s320/%D0%A2%D0%9C%D0%9002_%D1%80%D1%8B%D0%B1%D0%B02_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5290189817045709666" /></a><br />Есть одна опасность – обучение ради обучения. Это означает, что вы готовите курсы, семинары, тренинги или отправляете подчиненных для обучения в незавичимых центрах, а тестировщики реально не используют полученные знания и навыки на практике. Поэтому компания тратит ресурсы, но не получает результата взамен, тестировщик – тоже. <br />Чтобы подобная ситуация не произошла, цели развития должны быть согласованными с самим тестировщиком. То есть после получения результатов аттестации задача менеджера выработать цели и программу развития совместно с тестировщиком, опираясь на способности, опыт, устремления специалиста, требования и возможности его текущей работы, а также на перспективы и будущие потребности самой организации.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgirS-qdxQb69dWM5BCqlhw46SY1E3atzRPz0oKZ-yiUCArPzbcBVessI1CiM9f4n30pmmHYgUjmWF3ESNSJGqewMLqRHrNDm1pJHhUmMiEdjVR9b3anPuUs7gAmWd8kHezAaJEh7_RlvvK/s1600-h/%D0%A2%D0%9C%D0%9002_%D1%80%D1%8B%D0%B1%D0%B02_%D0%BF%D0%BE%D1%82%D1%80%D0%B5%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D0%B8.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 121px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgirS-qdxQb69dWM5BCqlhw46SY1E3atzRPz0oKZ-yiUCArPzbcBVessI1CiM9f4n30pmmHYgUjmWF3ESNSJGqewMLqRHrNDm1pJHhUmMiEdjVR9b3anPuUs7gAmWd8kHezAaJEh7_RlvvK/s320/%D0%A2%D0%9C%D0%9002_%D1%80%D1%8B%D0%B1%D0%B02_%D0%BF%D0%BE%D1%82%D1%80%D0%B5%D0%B1%D0%BD%D0%BE%D1%81%D1%82%D0%B8.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5290190018326489730" /></a><br />Необходимо стремиться к тому, чтобы эти 3 диска максимально перекрывали друг друга. Только в этом случае мероприятия по развитию специалиста будут успешны и выгодны обеим сторонам. <br /><br /><span style="font-weight:bold;">4. Тренинги, семинары, наставничество</span><br />Необходимо понимать, что существуют различные виды обучения и предназначены они для разных целей.<br />Так, например:<br />- Курсы: очень похожи на академическое образование. Охватывают довольно большой объем материала, могут состоять из лекционных и семинарских частей, а также практических занятий. <br />- Семинары: направлены на прояснение узкого круга вопросов или же конкретного вопроса.<br />- Тренинги: направлены на развитие конкретных навыков.<br />- Наставничество: направлено на развитие конкретных навыков.<br /><br />Что же выбрать для обучения своих тестировщиков?<br />Для ответа на этот вопрос разумно использовать обработанные результаты аттестации. Если из аттестационного профиля видно, что у тестировщика не хватает знаний, то необходимо по конкретным темам организовать семинары.<br />Если человеку нужны определенные навыки, то стоит сосредоточиться на их развитии посредством тренинга (если это несколько человек) или же назначить наставника (одному или нескольким тестировщикам).<br />Если же мы видим, что пробелов у тестировщика(ов) довольно много, то, возможно, имеет смысл подготовить даже обучающий курс.<br /><br />P.S. Необходимо отметить, что описанная схема развития тестировщиков применима также и к другим специалистам. Важно в каждом конкретном случае использовать индивидуальный подход к вашему персоналу. <br /><br /><span style="font-style:italic;">Всегда ваша,<br />Наташа Густыр</span><br /></span>Команда sqadotbyhttp://www.blogger.com/profile/10348375883727790534noreply@blogger.com0