четверг, ноября 22, 2012

RamDisk – делаем всё быстрее!


Наверное, самый лучший практический совет, который я вынес из конференции XP Days – это совет по работе с Ram Disk'ами из доклада Crazy Talk: When 10 second builds start to make you nervous

Ram Disk – это технология не новая. Помню, как еще грузился с загрузочной дискеты Windows 95, где создавался такой диск с голым ДОСом. И в то время, при жестком дефиците оперативной памяти, навряд ли можно было использовать эту технологию каким либо другим способом.

Но, сейчас, когда 8 Гб – это уже так, средненько, а стоимость SSD как-то все еще неоправданно высока – для оптимизации процесса сборки большого проекта, особенно если он написан на С++ или Java – отлично подходят RAM-диски.

Простые тесты ввода-вывода показывают прирост производительности дисковых операций в 150 – 200 раз. Ну, а сам билд, со слов докладчика,  может собираться в 2 – 3 раза быстрее. Т.е. за 20 минут вместо 60-ти.

Для создания RAM-дисков существует множество как недорогих платных, так и бесплатных решений.
Я пока остановился на бесплатном ImDisk Virtual Disk Driver. Попробую, возможно получится оптимизировать некоторые операции backup/restore

пятница, ноября 16, 2012

Devnology Podcast 034 - Gojko Adzic


Я давно не пополнял запасы Спецификации через пример. В последнее время, по этой теме какое-то затишье, в смысле хорошых материалов и презентаций. Но, это подкаст действительно очень стоящий.

Гойко рассказывает о том, как он придумал "Спецификацию через пример", и где он подчерпнул нужные знания. Об успешном применении и причинах неудач в применении методологии. И о том, что создание рабочего софта – это главное, и намного важнее создания "запускаемой спецификации"

MP3: Ссылкана аудиофайл 

вторник, ноября 06, 2012

О чем я расскажу на Test Automation Days

Так сложилось, что мы, тестировщики-автоматизаторы, зачастую идем позади программистов. Когда они говорят, что DRY (Не повторяйся ), и стараются умело жонглировать классами и абстракциями – то, нередко, мы копи-пастим целые куски кода.

Только сейчас, многие из нас, автоматизаторов, пытаются как-то использовать паттерн PageObject для того, чтобы и сделать код тестов понятней, и держать "все локаторы в одном классе". Буквально только сейчас люди начинают использовать некоторые преимущества объектно-ориентированного программирования. То есть применять то, чем программисты активно пользуются уже более 20-ти лет. И если они используют эти техники такой продолжительный срок – значит в этом что-то есть!

Так почему бы на не взять все самое лучшее? Все то, что заставит нас писать меньше кода, но, при этом покрывать больше функционала приложения.

Например, есть ли чего общего между страницей регистрации нового пользователя и формой обратной связи? И там и там есть некоторые ожидаемые поля. И там и там некоторые поля обязательны. Можем ли мы спросить у каждой страницы "А дай-ка мне список своих текстовых полей" и, получив список, – проверить каждое.

И все это одним участком кода? И код проверки будет единым для всех страниц, а для каждой страницы будет генерироваться отдельный тест. Но, только не путем копи-паста, а путем наследования.

Я покажу, как для каждой существующей страницы приложения прогнать целый набор тестов, а выполнятся, будут только лишь те, которые поддерживаться самой страницей.

Хорошо. Предположим, на страницу была добавлена фича "Если форма не сохранена и пользователь закрывает страницу – приложение должно известить о несохраненных изменениях". Сколько кода нужно написать, чтобы проверить эту фичу для 50-ти страниц в приложении?

Я покажу, как добавить 50 таких тестов, произведя изменения всего лишь в одном в файле.
Если интересно – приходите на мой доклад "За пределами PageObject" на конференции Test Automation Days, которая состоится в Киеве 9-го февраля 2013-го года.


вторник, октября 23, 2012

Шапка тестировщика


Буквально на прошлой неделе, я закончил одно интереснейшее задание по тестированию. Суть была в том, что наш Аппликейшн позволял расширить свою функциональность посредством плагинов.

В самом начале, мне, а это бывает не часто, досталась хорошая документация с детальным описанием протокола работы Аппликейшена с плагином.

Кроме того, был даже отдельный пример реализации такого плагина.  И, скорее всего, для того чтобы «протестировать» функциональность, мне достаточно было убедиться в том, что код примера компилируется и работает. Но, в тот момент у меня и сомнений не возникало, что этот код плагина не работает, а в правильной работе той функциональности, которая вызывала методы плагина – сомнения были.

Шапка программиста
Я решил примерить на себя «шапку программиста»  и реализовать тестовой плагин с нуля, не копируя код примера.
Для этого, в начале, я написал модульные тесты, которые бы эмулировали функциональность Аппликейшена, и вызывали нужные методы согласно протоколу. А сами методы отдавали необходимые данные, которые читались из внешнего файла. И данные, и вызовы – все это было покрыто модульными тестами. Кроме того, я добавил логирование вызовов методов плагина в отдельный лог, и при помощи тестов, еще даже не подключая плагин к Аппликейшену, я уже был доволен тем, что все работает так, как я хочу.

Шапка тестировщика
Но, тут я понял, что шел по пути наименьшего сопротивления, думая лишь о позитивных сценариях. А как же негативные? А что если вопреки протоколу работы, будут вызваны методы в другой последовательности? А почему у меня два похожих метода возвращают одинаковые значения? Но, эти вопросы я задал себе только после того, как надел «шапку тестировщика».

Проверки последовательности вызовов я реализовал в самом плагине с последующим выводом ошибок в лог. А возвращаемые тестовые данные я сделал уникальными для каждого варианта.

После того, как я впервые подключил тестовый плагин, мне нужно было поправить проект всего лишь один раз, потому что я не учел одну незначительную конфигурационную ошибку. После  – все заработало как я хотел. Я был доволен своей работой. Мне удалось протестировать новую функциональность в достаточном объеме, чтобы быть уверенным в ее работоспособности.

И я нашел две ошибки. Первая была в том, что в определенной конфигурации, файлы источника данных удалялись Аппликейшеном. Эту ошибку можно было найти еще на стадии «шапки программиста».
Но, потом оказалось, что в другой конфигурации, Апликейшен вызывал не тот метод плагина, который был должен вызвать согласно спецификации.  И нахождению этой ошибки я благодарен «шапке тестировщика», надев которую я сделал возвращаемые данные уникальными для каждого метода, и добавил проверки на вызов методов плагина согласно протоколу.

Выводы
Я думаю, многих из нас немного злят те случаи, когда после допиливания одной функциональности, отваливается тот функционал, который стоял в паре кликов. И даже особо не напрягаясь, можно найти новую блестящую ошибку JavaScript или ошибку от сервера.
Возникают мысли «ну как же ЭТО можно было не заметить?». А можно, если вдруг программист забыл надеть «шапку тестировщика». И причин тут может быть целая масса: от личных проблем – до проблем на производстве, авралов, невнимательности.

Да, так повелось, что большинство тестировщиков ходят в своих шапках, а программисты в своих. А людей, которые примеряют обе – не так уж и много. Но, это значит лишь то, что людям, владеющим навыком ношения «шапки программиста» все больше и больше будут нужны люди, владеющие «шапкой тестировщика»

четверг, октября 04, 2012

WebDriver: отладка CSS селекторов в Internet Explorer


Есть такие странные сайты, которые сейчас, в 2012 году, извините за слово, поддерживают только Internet Explorer 4 и выше. (пример 1, пример2, пример3).

При автоматизации таких сайтов, возникает проблема: как можно быстро убедится в том, что новый CSS селектор работает, не запуская тесты?

Как оказалось, в Internet Explorer такая функциональность по отладке CSS селекторов – есть.
Достаточно в IE Developer Tools (F12) в поле поиска задать селектор после символа “@”:
@a[onclick*='Home/login.asp']

вторник, сентября 18, 2012

Цитаты про тестирование


"Я вижу резолвленные баги но не ощущаю ожидаемого результата"
© наш QA
Лежали всем офисом.
http://juick.com/MaEcTPo/1230654

Писать тесты — это как писать код. Только тесты.
http://juick.com/V1ncE/1857174

Тем кто считает, что юнит тесты не могут работать с базой: если вы тестируете связку человек+лопата, и знаете, что лопата в порядке, а тест падает. Где будете искать ошибку?
http://juick.com/korchasa/1425218

В который раз сталкиваюсь с заблуждением "тесты == автоматизированные тесты". Если вы проверяете результаты работы своих скриптов, то вы уже тестируете. А уж автоматизировать этот процесс или нет, второй вопрос.
http://juick.com/korchasa/1232004

Блин, без BDD я не знаю, что сейчас надо сделать. о_о
http://juick.com/neFormal/1857653

"Humans make mistakes; programs (if coded correctly) do not." — Rails 3 in Action.
Интересно, время подтвердит эту гипотезу?
http://juick.com/wyldrodney/1854703


Тестирование и правда облегчает жизнь. Причем невероятно сильно. =)
http://juick.com/demiazz/1450005

Меня тут спросили, как я пошучу над коллегами первого апреля. А у нас какбе релиз. Первого. А я какбе тестер. Столько клевых идей!
А как бы пошутили вы?
http://juick.com/kisinkaito/602452

Узнал сегодня в институте 3 главных правила тестирования программы: 1) Тестирование легко начать, но сложно закончить. 2) С ростом числа обнаруженных ошибок увеличивается вероятность обнаружения новых. 3) Никогда не тестируйте свою программу сами. Пусть за вас её тестирует другой программист.
До сих пор не верится, что лектор говорил это на полном серьезе. Хотя с этими пунктами тяжело поспорить.
http://juick.com/ubuntard/521783
Запомню.
Памятка по приоритетам для QA:
blocker/highest — падение игры, нерабочая основная механика, ошибки, приводящие к невозможности дальнейшего игрового прогресса
critical/high — баг основной механики, нерабочая вторичная механика, ошибки, приводящие к невозможности дальнейшего игрового прогресса без перезапуска
major/normal — баг вторичной механики, ошибки визуализации или анимации, ошибки сохранения прогресса с предыдущей сессии
minor/low — ошибки позиционирования элементов, нелогичность поведения, перепутанные картинки/звуки
trivial/lowest — орфография(её проверяют в последний момент сразу всю), пожелания/заметки
Для багтрекеров с раздельными полями "важность" и "приоритетность"(например, mantis) это всё относится только к "важности", "приоритет" выставляется дополнительно в зависимости от пожеланий менеджмента.


Потеря душевного равновесия — побочный эффект работы куа инженера.http://juick.com/estet/507684
"хомо багус" — человек тестирующий (лат.).


Багзилла как зеркало души тестировщика...http://juick.com/estet/97844

суббота, сентября 15, 2012

Между (QA) Quality Assurance, (QC) Quality Control и тестировщиками – разницы нет


Нас, тестировщиков, по-прежнему продолжают называть – QA (Quality Assurance), хоть и многие из нас с пеной у рта доказывают, что QA – это не человек, а процесс. Что мы тестировщики, не пишем код, а, следовательно, не можем обеспечить его качество. Это возможно только косвенно, путем предоставления информации о текущем качестве продукта и другими, но опять же, косвенными методами.

Но, все равно нас продолжают так называть. Все говорят «отдали в QA». Нам нужен новый QA.

Не видите разницы между QA, QC и тестировщиками?

Так значит и между:
Программистами, разработчиками и кодерами;
HR’ами и рекрутерами;
Менеджерами, начальниками и руководителями;
Тимлидами и скрам мастерами;
Эникейщиками и сисадминами – разницы тоже нет!



Upd: Расшифровки QA:
  • Quality Assurance
  • Quality Assistant
  • Quality Analyst
  • Quality Auditor
  • Quick Assistance (support)
  • Quality A… 

среда, сентября 12, 2012

Как твитнуть из Google Формы. Руководство-детектив

– Так вы говорите, что этот хомяк пришел в Твиттер из Гугл формы?

– И да,  и нет. Гугл-форма была началом его пути, но в твиттере он оказался благодаря рецепту в http://ifttt.com в котором все элементы rss ленты одного из блогов на Blogger попадают в твиттер

– Стоп, а кто тогда опубликовал этот пост с хомяком в Blogger (http://dztwitter.blogspot.com/)?


– Известно, что в настройках Blogger можно разрешить публикацию через email. И по горячим следам, мы выяснили, что этот хомяк запостился именно так. Это можно настроить вот здесь:
Настройки  --  Электронная почта и мобильные устройства


– Значит хомяка прислали по имейлу… Хм… странно, кто же способен на такое?
– На это способна обычная Гугл-форма, в которой есть пользовательский скрипт привязаный к событию отправки формы. Как только новая форма отправляется – запускается вся цепочка: на специальный почтовый адрес для публикации в блоггер – отправляются данные формы. Ifttt читает RSS блога – и постит новые элементы в твиттер.

Добавить новый пользовательский сценарий в Google Forms можно через Tools - Script Editor
В самом редакторе необходимо ввести следующий код, и привязать его к триггеру отправки формы. Это делается через меню Resources – Current Script Triggers.

Вот и все. Вот так хомяк случайно попал в форму, прошел по десятку серверов и оказался в твиттере.
– Но, зачем использовать гугл формы для хранения Хомяков?
– Дело в том, что Властелину Хомяков очень удобно парсить данные Google Docs для создания готового для публикации HTML с собранными ссылками. Но, Властелин очень хотел, чтобы при добавлении новой ссылки, она сразу же попадала в твиттер. А копи-пастить руками каждый раз Властелин не хотел, потому что он очень ленивый.

Кроме того, многие люди используют Google Forms для регистрации даже на очень большие конференции. А мгновенного автоматического подтверждения регистрации у многих нет.
Но, теперь то вы знаете, что это вполне реализуемо.

А вот сам скрипт-триггер:
function onFormSubmitted() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues()[numRows-1]; // Последняя запись

  message = values[1] + ": " + values[2] + " " + values[4];
  
  MailApp.sendEmail("dzhariy.!!!SALT!!!@blogger.com", "", message);
}

вторник, сентября 11, 2012

Бесплатные Вебинары по Selenium Webdriver с самого начала

Tarun Kumar, автор
Вебинаров по Selenium
На сайте «No Automated Testing», Tarun Kumar проводит бесплатные вебинары по Selenium Webdriver для начинающих. Примеры рассматриваются для платформы Java, с разбором работы не только Selenium IDE и Selenium Webdriver, но и достаточных основ объектно-ориентированного программирования на языке Java, с использованием сопутствующих инструментов тестирования.

Обучение ведется на английском языке, но, произношение тренера четкое и будет понятным для русскоязычных слушателей.

Инструкция для просмотра:

  1. Зайдите на страницу трейнингов: http://www.seleniumtests.com/p/free-selenium-training.html Выберете интересующий вебинар – вы перейдете по ссылке на советующий пост 
  2. В посте найдите ссылку на anymeeting и перейдите на этот сайт 
  3. На странице ввода пароля, введите – seleniumpassword 
  4. Имя и почту можно указать любые 


Выглядеть это должно так:


 На странице тренингов вы можете подписаться на следующие вебинары.
Все права на упомянутые материалы принадлежат их автору – Tarun Kumar. При возникновении вопросов – свяжитесь с ним лично.