Показаны сообщения с ярлыком Майкл Болтон. Показать все сообщения
Показаны сообщения с ярлыком Майкл Болтон. Показать все сообщения

вторник, 15 июля 2014 г.

Книжная полка. Дмитрий Чернышев "Как люди думают"

Решаю проблему "книжного долга": как и обещал, возвращаюсь к прочитанным книгам в июне, чтобы поделиться отзывами и пополнить Книжную полку. Сегодня я расскажу вам о книге Дмитрия Чернышёва "Как люди думают".
Дмитрий Чернышев "Как люди думают", на oz.by
Технико-тактические характеристики:
Год издания: 2014
Страниц: 304
Формат: 145*215мм
ISBN: 978-5-91657-889-8
Язык - русский
Скорость чтения - выше среднего
Ориентировочное время на прочтение:  5 - 7 часов
Полезность - высокая

После апрельского тренинга Болтона "Критическое мышление" я решил уделить внимание этой теме - что такое мышление, как люди думают, принимают решения. Литературы по данной теме очень мало, на русском ее еще меньше, а между тем это очень актуальная тема для тестировщика. Умение думать и размышлять, а не только действовать согласно имеющемуся алгоритму отличает QA от автоматизированной проверки. Мало написать работающий алгоритм, нужно периодически и сам незыблемый алгоритм ставить под сомнение с целью его улучшить, найти новый кейс, придумать, как его можно обойти, "сломать".

Книга "Как люди думают"  - шаг в этом направлении. Она состоит из теоретической части о мышлении, творчестве, и практических упражнений-задачек, среди которых есть как и простые загадки, так и неожиданные задачи на применение повседневных предметов. Вдобавок к теории приводится множество занимательных примеров, которые позволяют лучше понять и запомнить приведенные факты.

Общий вывод: однозначно маст-рид для тестировщика. Начинающему - для расширения своего кругозора. "Сеньору" - пополнить свой арсенал "мышлительными" инструментами и потренироваться на практических задачах. На мой взгляд, эта книга также может послужить хорошим вводным материалом в мир "тестирования и проверок" Болтона, или мир Исследовательского тестирования Баха и/или Виттакера - темы, которые без мышления никак не осилить.

Читается книга очень легко, за один-два вечера. И чтобы она не прошла мимо вас из-за своей кажущейся простоты, я составил карту памяти по книге. Обращайтесь к карте, дополняйте ее, помечайте в ней области, в которых вы рассчитываете "прокачаться". И обязательно находите время, чтобы на работе, за написанием или прогоном очередного тест-кейса, остановиться и поразмышлять: "Как (еще) люди (пользователи) думают?"
Ссылка на карту памяти в полном размере - https://dl.dropboxusercontent.com/u/81883673/Dmitry%20Chernyshev%20-%20Kak%20ludi%20dumayut.png

четверг, 1 мая 2014 г.

Рубрика "ПочитайQA". Полезные ссылки за апрель-2014

Всем привет! Как обычно, первого числа каждого месяца - рубрика "ПочитайQA", или список ссылок, на этот раз все самое интересное за апрель.

Апрель, как и прошедший март,  для меня тоже был очень интенсивным, плотно упакованным на события:

  •  внутренний тренинг в компании с игровыми элементами, тут пригодились и мои знания по геймификации. Пилотный запуск оказался успешным, продолжение следует.
  • Участие и выступление в конференции SQA Days-15, обзор уже писал: первый день и второй день
  • Участие в тренинге Майкла Болтона "Критическое мышление для тестировщиков". Обзор и конспект можно почитать здесь - http://qastugama.blogspot.com/2014/04/training-michael-bolton-critical-thinking.html
  • С 21 апреля прохожу курс BBST:Foundations, нагрузка получается 10-12 часов в неделю, много практических заданий, самостоятельного чтения, работы в группах, и все это в условиях довольно жестких сроков для каждого задания. 
Так как сейчас практически все "свободное" время у меня уходит на обучение BBST, то в конце мая планирую написать о курсе и впечатлениях, а пока, если будет время - продолжу серию про экзамены ISTQB и пополню  коллекцию - Книжную Полку (прочитанные книги есть, дело за обзорами).


Теперь к ссылкам. Разбиение на группы остается прежним-традиционным:

QA - Quality Assurance, обеспечение качества, все грани со всего мира. Наиболее заинтересовавшие меня статьи по профильной теме за месяц.
STU - Studying, образование и самообразование, обучение.
GA - Gamification, или геймификация тестирования, обучения, управления - всех составляющих Qastugama.
MA - Management and leadership - управление командой, людьми, лидерство. Все составляющие Management.
+
Books - обзоры прочитанных и/или рекомендованных книг.
+
Other - "сборный раздел". То, что не относится к предыдущим четырем темам, но то, чем я хотел бы с вами поделиться.
+
Bonus.Fun. - (не)серьезно о тестировании и вообще об IT.


Quality Assurance.

Studying.

Gamification.

Management.

Books.

Other.

Bonus. Fun.

До встречи в мае, оставайтесь с Qastugama!

воскресенье, 27 апреля 2014 г.

Тренинг Майкла Болтона "Критическое мышление для тестировщиков". Мой обзор.

На конференции SQA Days-15 в Москве было много классных докладчиков, но приглашение на юбилейную конференцию Майкла Болтона - это вишенка на вкусном торте. Полуторачасовой доклад собрал полную аудиторию: в конце второго дня Майкл дразнил пивом, троллил продукты Майкрософт, но главное - разбирался вместе со слушателями, в чем проблема?

А на следующий день, 20 апреля, Майкл Болтон проводил восьмичасовой тренинг "Критическое мышление для тестировщиков". Анонсы про тренинг были еще за 2 месяца до конференции, участникам SQA Days была скидка 10% на тренинг, но народу собралось непривычно мало: всего 15 человек (в том числе я с коллегами Игорем Бондаренко и Сергеем Остапенковым) приняло участие. Довольно неожиданно, ведь нечасто к нам приезжает звезда по тестированию такого уровня...

В целом, тренинг оказался очень полезным и познавательным, а Майкл - отличным учителем. Я бы порекомендовал этот тренинг всем: для новичков он будет полезен ... всем: очень много новой информации; те, кто поопытнее, тоже найдут для себя новое в привычных вещах, получат ссылки на дополнительную литературу для более полного изучения темы, а очень опытным и тем, кто читает свои лекции и проводит свои тренинги, - стоит посмотреть, как это делает Майкл, почерпнете много полезных "фишек".

Мой нижеприведенный конспект не отразит все то множество мыслей и идей, затронутых на тренинге, но поможет вам (и мне) восстановить хронологию событий, как это было, и узнать что-то новое. За более подробной информацией обращайтесь к первоисточнику на последующих тренингах, или почитайте статьи Болтона на его сайте - http://developsense.com/

Слайды Майкла Болтона с конференции Eurostar по данной теме "Critical Thinking for testers" можно взять здесь - http://www.developsense.com/presentations/2012-11-EuroSTAR-CriticalThinkingForTesters.pdf

Начался тренинг с двух простых задачек: про биту и мяч и про Стива-библиотекаря-фермера. Затем мы поупражнялись в переводе с 10-ричной системы в 16-ричную, и заодно проверили наши предположения о том, сколько человек в аудитории знают этот алгоритм и сделали задачу правильно :)


Рефлекс важен, но критичное мышление - это рефлексия.
Что ты видишь - это все, что есть (c) Майкл Болтон ("What you see is all there is")
Технологии более сложные, чем вещи, происходящие в реальной жизни. Но тестировщики не должны быть одурачены.
Тестировщик - тот, кто знает, что вещи могут быть разными.

Затем мы решали задачу: есть последовательность, есть программа, которая по введенной последовательности отвечает, удовлетворяет ли введенная последовательность некоторой закономерности или нет. Задача была - обнаружить данную закономерность за наименьшее число тестов. Вначале каждый работал сам, затем мы объединились все вместе (о минимальном количестве тестов речи уже не шло:) ), но даже все вместе мы не смогли полностью, на все 100% описать данную закономерность. И даже после знакомства с исходным кодом программы (буквально 4 строки исходного кода) мы выяснили, что не все нюансы программы были обнаружены.

Алгоритм поиска закономерности - creep and leap.
No experience about the past can logically be projected into the future, because we have no experience OF the future.
Passing tests cannot prove software is good. 
Critical thinking is thinking about thinking with the aim of not getting fooled (c) Michael Bolton.

Затем Майкл говорил о тестировании и проверках (testing-vs-checking) - я публиковал в блоге перевод исходной статьи - http://qastugama.blogspot.com/2013/09/blog-post_6.html И немного о том, что все думают, что делают тестировщики (сравнивают продукт со спецификацией, круги described-actual), и что тестировщики делают на самом деле (круги imagined-described-actual) - вначале мы сами обсуждали данные круги, затем обсуждали свои результаты с Майклом. И на десерт данного блока - задача "сломанный калькулятор": я уронил калькулятор, возможно, он поврежден, как я должен проверить его работоспособность.

Следующая часть - блок про предпосылки, утверждения и выводы. И о том, что делает утверждения более опасными (безосновательными и ведущими к ложным выводам). О помогающих вопросах, чтобы не попасться в ловушки (Huh? Really? So?) - эти вопросы также позволяют восстановить контекст.


It is silly to say “don’t make assumptions.” Instead say “let’s be careful about risky assumptions.”


Book "Perfect Software and Other Illusions About Testing" by J. Weinberg


Следом  - практическая задача-диаграмма с одним ветвлением: A < 70? Если да, то выполняем 1, если нет, то выполняем 2. И вопрос, сколько кейсов. Очевидный ответ 2 неправильный: каждый блок диаграммы может содержать несколько действий, каждое из которых тоже необходимо проверять:

Things that don't appear on diagram are easy to forget.
The feature worked. -> I've not yet seen any failures in the feature.

Далее мы говорили о "безопасном языке" (в тестировании это оценка и использование безопасных формулировок с целью избежания ложной уверенности) и вербальных эвристиках (Unless, And also, Or Not, So far & Not Yet), разбирали статьи с безопасным языком.

The Regression Testing Fantasy “I rerun my old tests to ensure that nothing has broken.”

Books:
Gerome Groopman "How Doctors Think"
Gerd Gigerenzer "Gut Feelings: The Intelligence of the Unconscious"

И на десерт - логические задачи, головоломки, фокусы от Майкла, некоторые нам даже удалось раскусить :) И автографы для желающих и возможность сфотографироваться с самим Майклом Болтоном.

Восемь часов пролетело очень быстро, не хотелось расходиться, да и была еще возможность попить пива с Болтоном второй раз за два дня, но впереди ждали поезд и Минск :) Московские три дня пролетели очень быстро, продуктивно, насыщенно, много знакомств, общения со старыми знакомыми, новые идеи, мысли, пивное афтепати в Гамбринусе, критическое мышление Майкла Болтона... Вобщем, нужно встречаться, хотя бы раз в полгода. До встречи на следующей SQA Days!

понедельник, 21 октября 2013 г.

Куда уходит все время - перевод статьи Майкла Болтона

На прошлой неделе отзвучали сладкие ноты онлайн-конференции по тестированию ПО Chief Confet&QA. Как всегда, были очень интересные доклады, ценные мысли, а главное - дополнительный заряд мотивации действовать и развиваться. Чуть подробнее свои мысли по докладам я напишу в одном из следующих постов.

А сегодня я подготовил перевод статьи Майкла Болтона "Куда уходит все время" (Michael Bolton - "Where Does All That Time Go?"), о которой я рассказывал на своем конфетном докладе о тайм-менеджменте в тестировании. Статья очень интересная и поучительная, поэтому рекомендую к прочтению.

Ссылка на оригинал  -  http://www.developsense.com/blog/2012/10/where-does-all-that-time-go/
Формат текста (выделение терминов, курсив, цитирование) и ссылки на другие статьи из текста взяты с оригинала "как есть".

В конце долгого и трудного дня небольшая компания одноклассников собралась на встречу в одном из ресторанов в центре города. Основные блюда были съедены и убраны со стола, нам принесли пиво и мы сидели в ожидании десерта. Петр (это вымышленное имя) продолжал жаловаться о том, сколько времени он вынужден тратить на административные задачи - встречи, заполнение форм, расписаний, заявок и т. п.

- Все это отнимает столько времени. Когда мне нужен лист бумаги для заметок, я обязательно должен заполнить соответствующую форму. Боже, спаси меня, если формы вдруг закончатся!
- Сколько времени ты тратишь на подобную работу каждую неделю? - спросил я.
- Около часа в день. Иногда два. Встречи... Скажем, полтора часа в среднем.
- Вау, это ощутимая часть этой недели. У меня есть идея.
- Давай изобразим это, - сказал я и достал мой верный молескин. Я предпочитаю вариант в клеточку для таких случаев, как этот. Я нарисовал прямоугольник, 20 клеточек в длину и 2 - в ширину.


- Итак, ты тратишь в среднем полтора часа в день на согласование (C - compliance stuff). Полтора умножить на пять, или семь с половиной часов в неделю. Давай округлим до восьми. Напиши С в восьми клетках.

Петр так и сделал.


- Хорошо. - сказал я, - А теперь напрягись и вспомни, сколько ты потратил времени на борьбу с тестовым окружении.

Глаза Петра загорелись.

- Да! - воскликнул он. - Это большая часть дня. Смотри, это мобильное приложение. У нас есть серверная  компонента и клиентская, с которой мы имеем дело, и серверная компонента - это настоящий слон.
- Расскажи-ка подробнее.
- Долгая история. Мы получаем окружение, которое моделирует систему на продакшн. Софт, который мы разрабатываем, содержит столько багов, что мы не можем определенно сказать, является ли эта проблема общей, или воспроизводится только для некоторой модели телефонов, и поэтому мы заводим еще одну конфигурацию для того, чтобы провести целенаправленное тестирование каждый раз, когда мы добавляем поддержку нового телефона. Это то, над чем я сейчас работаю. Проблема в том, что настойка нового телефона крайне скрупулезна и занимает очень много времени. Я должен делать все очень внимательно. Я несколько раз просил время на то, чтобы автоматизировать процесс настройки некоторых конфигураций, но мне отказали, так как времени недостаточно, мы и так постоянно в цейтноте. Поэтому, я вынужден делать это вручную. Процесс запутанный, и во время него я часто ошибаюсь. С другой стороны, если я обнаруживаю, что что-то не работает, я должен выяснить, почему. Это означает, что я должен сообщить об этом разработчикам и разобраться, в чем ошибка; затем я должен вернуться назад к тестированию нового окружения. И чаще всего, приходится начинать тестирование с самого начала. Это отнимает часы. И так каждый день.
- Окей. Давай запишем это в нашей маленькой таблице, прямо здесь. Напиши S в каждой клетке для каждого потраченного часа в неделю.

После этого Петр принялся заполнять клеточки. Один десяток, второй. И затем еще восемь клеток.


- В самом деле?! - воскликнул я. - Двадцать восемь часов в неделю, разделенные на пять дней - это более пяти часов в день. Ты серьезно?
- Абсолютно - вздохнул Петр. - Это занимает большую часть, иногда весь день. Это скучно. Что в самом деле меня убивает, так это то, что я не ощущаю, что занимаюсь тестированием.
- Я не шучу. На это нет времени. Остаются только четыре клеточки в неделю. Плюс, то, о чем ты уже говорил - тонны багов, которые не относятся к настройкам и целенаправленному тестированию.
- Это так. Когда дело доходит до тех вещей, которые на самом деле нуждаются в тестировании, в них тоже находится множество багов. Таким образом, мое время на тестирование - не чистое тестирование. Это в основном время, потраченное на то, чтобы воспроизвести и задокументировать баг.
- Да. В сессионном тестировании, это исследование и документирование бага - Б-время. И оно прерывает время на дизайн и выполнение теста - Т-время - которое создает актуальное покрытие тестами и позволяющее изучить, что в самом деле происходит в продукте. Так, сколько занимает Б-время?

Петр поставил букву Б в три из четырех клеток.


- И, наконец, Т-время?

У Петра осталось только место для одной буквы Т в правом нижнем углу.


- Вау, - усмехнулся я, - одна сороковая часть твоей целой недели уходит на получение реального покрытия тестами. Остальное - накладные расходы. Говорил ли ты им, как это влияет на твою работу?
- Я упоминал об этом - ответил он.
- Давай посмотрим - предложил я- Если мы будем использовать цвета, это станет еще более очевидным.


- М-да, я никогда не смотрел на эту проблему таким образом. И затем, - Петр остановился. - Они спрашивают меня, почему я не обнаружил этот баг?
- Хорошо, -  сказал я, - учитывая заблуждение, в котором они, скорее всего, находятся, вопрос небезосновательный.
- Что ты имеешь в виду? - спросил Петр.
- Что написано у тебя на визитке?
- Тестирование ПО.
- Что написано у тебя на двери твоей тестовой лаборатории?
- Тестовая лаборатория - ответил Петр.
- И они называют тебя...
- Петр.
- Нет! - я улыбнулся. - Они говорят, что ты ... кто?
- Тестировщик.
- Итак, с того момента, как ты тестировщик, на двери у тебя написано "тестовая лаборатория", на визитке - "тестирование", они полагают, что тестирование - это все, что ты делаешь. Это заблуждение, которое Джерри Вейнберг называет проблемой укрупнения. Все из перечисленных активностей - административная работа, установка, исследование и документирование бага, проектирование и выполнение тестов, - для них это одна большая идея. И я нарисовал ее Петру.


- Это заблуждение менеджмента. С того момента как, в их воображении, у тебя есть сорок часов на тестирование в неделю, и для них это нормально - спросить, почему ты не обнаружил этот баг.
- Хммм... Так и есть. - согласился Петр.
- Когда в реальности они получают это. И я нарисовал для Петра.


- Для тестирования - реального взаимодействия с продуктом, поиском проблем, ты получаешь одну сороковую часть времени, которое они думают у тебя есть. Одну-единственную букву Т. Это входит в твой отчет о тестировании?
- Оу, пожалуй, мне стоит показать им это.
- Пожалуй, стоит.

Несколько дней спустя, я показал эту страницу из блокнота Джеймсу Баху.

- Вау! - ответил он. - Этот парень может быть в сорок раз продуктивнее!
- Сорок?
- Ну нет, не совсем, конечно. Но предположим, программисты проверят свою работу более тщательно, или предположим, что тестировщики попрактикуются в написании более точных отчетов о дефектах и отточат свои исследовательские навыки. Одна из этих двух вещей поможет сократить время на треть на исследование дефекта. Это позволит освободить больше времени на тестирование, если тестировщиков не будут отвлекать. Что если наполовину сократить время на согласование и борьбу с тестовыми окружениями?
- Четыре плюс четырнадцать... - посчитал я. - Это даст ему восемнадцать дополнительных часов на тестирование и исследование багов. Итого 22 часа. И даже если они будут продолжать тратить по два часа на исследование багов для каждого часа времени на тестирование... Отлично, это значит, продуктивность возрастет в семь раз, как минимум.
- В семь раз больше времени на тестовое покрытие, если предложенные идеи сработают. - ответил Джеймс.
- Может быть, разделение времени на составляющие - это то, что захотят сделать многие тестировщики в своей работе.

А как обстоит дело у вас?

Майкл Болтон, 30 октября 2012 года.

пятница, 6 сентября 2013 г.

Тестирование и проверка - перевод статьи Майкла Болтона.

У меня для вас очередной сюрприз - я представляю вашему вниманию свой перевод очень известной статьи Майкла Болтона "Тестирование и проверка" (Michael Bolton "Testing VS checking"). Работа оказалась довольно продолжительной, но очень интересной и насыщенной, богатой новыми впечатлениями и получением нового ценного опыта.

Большое спасибо моей сестре Лизе Ладутько - за помощь в переводе и придание ему более литературной формы :) Если вы не читали статью - рекомендую восполнить этот пробел прямо сейчас, если читали и знакомы - буду признателен за ваши отзывы - баг-репорты и улучшения, которые помогут сделать перевод качественнее.

Ссылка на оригинал  - http://www.developsense.com/blog/2009/08/testing-vs-checking/
Формат текста (выделение терминов, курсив, цитирование) и ссылки на другие статьи из текста взяты с оригинала "как есть".

Эта статья раскрывает тему моего блиц-доклада на конференции Agile 2009. Я выражаю огромную благодарность Арлу Бельши (Arlo Belshee) и Джеймсу Шору(James Shore) за помощь в воплощении идеи в реальность. Также я хочу сказать «большое спасибо» программистам и тестировщикам за огромную поддержку моего доклада и моей идеи. Особую благодарность я выражаю Джо Рейнсбергеру (Joe (J.B.) Rainsberger). Распространите этот мем!

P.S. На протяжении многих лет люди неверно истолковывали эту статью как отказ или от проверки, или от регрессионного тестирования, или от автоматизированного тестирования. Вдобавок к этой статье, для лучшего понимания вам также необходимо прочитать (http://www.developsense.com/blog/2009/11/merely-checking-or-merely-testing/ ).

P.P.S. С момента публикации прошло довольно много времени, этот пост достаточно старый. В течение последующих нескольких лет после того, как он был опубликован, я дополнил мои исследования данной темы, в основном благодаря сотрудничеству с Джеймсом Бахом. Наши размышления на эту тему появились в блоге Джеймса, а я разместил свой ответ здесь. В усовершенствовании процессов нам помогли вопросы и комментарии коллег. Мы просим вас прочитать их комментарии и оставить свои (Апрель 2013).

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

Проверка – это подтверждение.


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

Тестирование - это исследование и изучение.


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

Для проверки достаточно использование компьютера, для тестирования нужен ум.


Проверка даёт бинарный результат – «истинно» или «ложно», «да» или «нет». Проверка задаёт и в то же время отвечает на вопрос «Это утверждение истинно или ложно?». Для этих простых утверждений достаточно использование компьютера, и такие утверждения нейтрально оценочные.

Тестирование содержит открытый результат. Тестирование задаёт и в то же время отвечает на вопрос «Есть ли здесь проблема?». Ответ на такой вопрос требует большого количества наблюдений человека в сочетании с большим количеством оценочных суждений.

Когда проходит проверка, мы не знаем, работает ли программа, мы знаем только то, что она работает в границах наших ожиданий. В программе могут быть серьёзные проблемы даже если проверка успешна. Перефразируя Дейкстру, можно сказать, что "проверка может показать наличие ошибок, но не их отсутствие". Машины могут распознать несоответствия и проблемы, на которые они были запрограммированы для распознавания, но не новые проблемы. Тестирование также не отвечает на вопрос, работает ли эта программа – оно не способно отвечать на такие вопросы – но тестирование может давать основу для весомого заключения для ответа на вопрос: «Есть проблема или ее нет?».

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

Будем ли мы автоматизировать процесс или нет, если бы мы могли сформулировать вопрос так, чтобы машина смогла задать и ответить  на него через утверждение, это почти точно будет проверка. Если же для проведения этой работы необходим человек, если эта работа интеллектуального характера, это, скорее всего, тестирование. В самом начале своей статьи  «Разумные процессы», Джеймс Бах сказал «Я занимаюсь тестированием программного обеспечения. Я слышал от многих людей, что они занимаются тем же делом, что и я. Иногда, после того, как эти люди говорят об автоматизации тестов, мне начинает казаться, что они занимаются не тем же делом, которым занимаюсь я. И это так, потому что, на мой взгляд, то, что делаю я, невозможно автоматизировать в самом полном значении этой фразы. И я спрашиваю сам себя: «Какого черта они что-то автоматизируют?!». И тут же отвечаю «Они автоматизируют проверки».

Когда мы говорим о «тестах» на каком бы то ни было уровне, в которых мы делегируем решение "Да или Нет" машине, мы говорим об автоматизированных проверках. Я предлагаю называть «модульные тесты» "модульными проверками". По этой же причине, я предполагаю, что автоматизированное приемочное тестирование (Рон Джеффрис ссылается в своём блоге в статье Автоматизация историй «тестами») должно быть известно как "автоматизированные приемочные проверки". Это предложение появилось, чтобы оживить группу опытных программистов и тестировщиков на воркшопе конференции Agile 2009, о чем я расскажу вам поподробнее в следующем посте блога.

Тестирование - это не контроль качество, проверка - может быть.


Вы можете подтвердить качество чего-либо, над чем у вас есть контроль; это означает, что вы можете предоставить некоторый уровень качества - соответствие некоторым требованиям, и вы можете взять ответственность на себя, если продукт не удовлетворяет этим требованиям. Если у вас нет прав, чтобы изменить что-либо, вы не можете гарантировать качество, хотя вы можете оценить уровень качества и сообщить о найденной проблеме (см. страницы 6-7 этой статьи, в которой Сэм Канер объясняет различие между тестированием и контролем качества и ссылается на отличный набор вопросов от Джоанны Ротман, который поможет вам обнаружить различие между ними). Тестирование - это не контроль качества, но действует в его интересах; мы предоставляем информацию программистам и менеджерам, которые наделены полномочиями принимать решения.

Проверка, выполненная программистом, - это практика контроля качества. Когда программист пишет код, он проверяет свою работу. Он может это делать различными способами: запустить код и сравнить результаты, или наблюдать за поведением системы при отладке, но чаще всего программист пишет набор процедур, которые проверяют код и выполняют некоторые утверждения (Assert) на нем. Мы называем это модульными "тестами", но в реальности это проверки, так как смысл заключается в проверке существующих знаний. В связи с этим, поиск новой информации считается сюрпризом, зачастую неприятным. Неудачная проверка дает подсказку программисту - изменить код, чтобы тот работал так, "как ожидается". Это точка зрения контроля качества: программист сам же помогает оценить качество своей работы с помощью проверок.

Тестирование, как поиск новой информации, - это по сути, не практика контроля качества. Взамен, тестирование информирует контроль качества. Тестирование, перефразируя слова Джери Вайнберга, это сбор информации с целью информирования решения, или как говорит Джеймс Бах, "опрос продукта с целью его оценки". Оценка продукта не обеспечивает его качество, но она может информировать решения, которые влияют на качество. Тестирование может включать в себя много проверок, более развернуто я напишу об этом ниже.

Проверщикам нужна спецификация, тестировщикам - нет.


Тестировщик, по словам Джерри Вайнберга, это "кто-то, кто знает, что вещи могут отличаться" (things can be different (c)). Как тестировщики, наша работа - поиск инорфмации, которая зачастую представляет разницу между тем, как думают люди и тем, что верно на самом деле. (определение тестирования Сэма Канера включает в себя вышесказанное: "Тестирование - это эмирическое, техническое исследование продукта, выполняемое заинтересованными сторонами с целью выявления информации про качество такого типа, который они ищут".)

Мы часто слышим от оппонентов "старой закалки", что для хорошего тестирования нужны четкие, полные, актуальные и однозначные спецификации. (Я люблю спрашивать таких людей "Что вы понимаете под "однозначностью"?" Они редко понимают, что это шутка. Но я отвлекся.) Тестировщику не нужно быть уверенным в совершенстве спецификации для того, чтобы сделать полезные наблюдения и выводы о продукте. В самом деле, задачей тестировщика может быть сбор информации, которая выявляет слабости и неоднозначности в спецификации, с целью предоставить информацию людям, которые могут объяснить ее. Отчасти роль тестировщика может заключаться в выявлении проблем, связанных с тем, что планирование продукта расходится с его реализацией, даже если планирование не было описано. Задачей тестировщика может быть обнаружение проблем, которые возникают, когда наш замечательный код вызывает код с ошибками в сторонней библиотеке, для которой у нас нет спецификации. Опытные тестировщики могут справиться в этой ситуации.

Человек, которому нужны четкие, полные, актуальные и однозначные спецификации для работы, - это проверщик, а не тестировщик. Человек, которому нужен проверочный скрипт для работы, - это проверщик, а не тестировщик. Человек, которые не делает ничего, кроме проверки программы по образцу - это проверщик, а не тестировщик.

Тестирование VS Проверка - это дырявая абстракция.


Джоэл Спольски назвал закон о ценных движениях системы Законом Дырявых Абстракций ("Все нетривиальные абстракции, в некоторой степени, дырявые.") В процессе разработки продукта мы можем быстро переключаться между тестированием и проверкой. Различие между ними находится непосредственно в нашей мотивации. Давайте рассмотрим несколько примеров.
  • Программист, который пишет новый код и исследует новое проблемное поле. В его понимании, есть ситуация, которую нужно обработать. Он пишет утверждение - проверку. Затем он пишет код, чтобы утверждение прошло успешно. Утверждение не проходит успешно, тогда разработчик переписывает код. Проверка все равно не проходит. Программист обнаруживает, что его первоначальное предположение о проблеме было неполным, поэтому он меняет утверждение, и дописывает код. В этот раз проверка проходит успешно, что означает, что утверждение и код приложения согласованы. У него появляется идея - дописать еще код, и он снова повторяет свой алгоритм - сначала пишет проверку, затем - код, для того, чтобы проверка прошла успешно. Он также удостоверяется в том, что предыдущая проверка также работает. Затем, он видит, как код может "упасть", если ввести другое значение. Он уверен, что код пройдет успешно, но он пишет новую проверку, чтобы удостовериться в этом. Проверка проходит успешно. Он пробует другие входные значения - тест падает, и программист вынужден исследовать проблему. Он сознает свою ошибку, и использует полученное знание для новой проверки; затем он пишет функциональный код, чтобы исправить проблему и чтобы проверка прошла успешно. Таким образом, данный процесс - в значительной мере, исследование. Несмотря на то, что она продолжает использовать проверки для продолжения процесса, его фокус направлен на изучение, исследование проблемного поля, обнаружение проблем в коде и разбор  этих проблем. В этом смысле, он тестирует и программирует. В конце этого всплеска разработки, он получил работающий код, который пойдет в версию продукта. В качестве положительного побочного эффекта, у программиста появился кусок кода, который поможет ему выполнить автоматические проверки, если функциональный код будет изменен. Марк Симпсон, программист, с которым я беседовал на конференции Agile 2008, сравнил этот циклический процесс с расчисткой тропы в зарослях, прорубанием нового пути через проблемное поле. Есть множество путей, по которым ты можешь пойти, и ты расчищаешь заросли неопределенности вокруг себя в попытке добраться туда, куда направляешься. Исторически, этот процесс называется "разработка через тесты" (Test Driven Development, TDD),  с маленькой поправкой - в разработке через тесты, "тесты" - на самом деле, проверки. Хотя это может быть трудно, и даже несправедливо, доказывать, что в общем-то, весь этот процесс, в большей мере, не исследование. У программистов, работающих по TDD, есть цель, но путь к этой цели не всегда очевиден. Если вы знаете точно, куда идти и как вы намереваетесь идти, вам придется исследовать.  Название "разработка через поведение" (Behaviour Driven Development, BDD) отчасти наводит порядок в этой неразберихе, но оно еще не получило широкое распространение. Разработка через поведение использует проверки в форме "(Программа) должна...", но процессу разработки необходимо тестирование идей по мере их формирования.
  • Затем наш программист просматривает код и обнаруживает, что имя одной из переменных не "говорящее", что одна строка кода должна быть более читабельна и сопровождаема, если ее переписать в две строки, что группа из трех строк можно переписать более красиво и понятно, используя цикл. Он решает отрефакторить код и обращается к решению этой проблемы - запустить проверки после каждого изменения. Его цель при запуске этих проверок - не исследование, а подтверждение, что ничего не было сломано. Он не пишет новые проверки, он вполне уверен, что старые справятся с этой задачей. В этом случае, она не тестирует продукт, она проверяет свою работу.
  • Большинство книг по традиционному "тестированию" утверждает, что "тестирование" это процесс валидации и верификации, как будто мы уже заранее знаем, как должен работать код. Хотя тестирование включает в себя проверку, программа, на которой были выполнены только проверки, скорее всего, недостаточно протестирована. Большинство литературы по тестированию фокусирует внимание на корректности - которая может быть проверена - и игнорирует тот факт, что необходимо задавать более глубокие вопросы о значениях, которые должны быть протестированы. Например, то, что называется "тестирование граничных значений" - обычная "проверка граничных значений". Классический пример программы, которая проверяет сложение двух двузначных целых чисел, в котором значения находятся в допустимом интервале от -99 до 99, а все значения вне пределов интервала отбрасываются. Классический совет, как "протестировать" такую программу, направлен на граничные условия, звучит как "Попробуйте -99 и 99 чтобы убедиться, что допустимые значения обрабатываются, и попробуйте -100 и 100, чтобы проверить, что недопустимые значения не обрабатываются. " Я бы хотел поспорить, что эти "тесты" настолько слабы, поэтому должны называться "проверками"; они крайне очевидны, они направлены на подтверждение, они направлены на исход, а не на результат, и могут быть легко автоматизированы. Если вы хотите протестировать подобную программу, сам следует настроить, поработать, рассмотреть продукт внимательно, с учетом и других рисков, включая не совсем очевидные, которые могут оставаться незамеченными, пока не проявят себя. Вы должны быть готовы рассмотреть все, что может повлиять на ценность продукт - проблемы, связанные с производительностью, инсталляцией, удобством использования, тестируемостью и другими критериями качества. Вам следует изменять свои тесты, а не повторять их. Вам следует быть любознательными, и выполнять некоторые тесты, не связанные с вашей текущей моделью рисков и угроз, с целью обнаружить непредвиденные риски. Вы можете использовать автоматизацию как помощник в исследовании; например, для генерации данных, для отслеживания покрытия, для разбора лог-файлов, просматривать реестр файловой системы для поиска непредвиденных последствий. Даже если вы используете автоматизацию с целью нажимать клавиши за вас, вам следует использовать автоматизацию для исследования, вы должны быть готовы изменять направление исследований и тактику, когда тест вам выдает неожиданный результат.
  • Исследовательское мышление использует вопросы наподобие "Что, если...?", "Мне интересно, ...?", "Как эта вещь...?", "Что произойдет, если я...?" Даже если мы тестируем программу, используя строгий подход к исследованию, мы дополнительно задействуем новые идеи, как это должно работать. "Если я нажму кнопку Отмена, диалоговое окно закроется", "Это поле запрашивает ЗИП-код в США, следовательно, это поле должно позволять вводить как минимум 5 символов", "При двойном клике по "foo.doc", файл должен открыться в программе Microsoft Word". Тестировщики-профессионалы использует эти и другие утверждения как сами собой разумеющиеся. Мы даже можем их сознательно не называть проверками, но мы подсознательно проверяем во время своего исследования и изучения программы. Если одна из проверок выполнится с ошибкой, мы наверняка получим подсказку в поиске новой информации, или если поведение программы кажется правильным, мы изменим наше представление о том, как программа должна работать. Это эвристический процесс (подверженный ошибкам означает, что при решении проблем или принятии решений, мы обучаемся, и эвристика обычно работает, но может и не работать).
  • Также на конференции Agile 2009, Крис МакМахон показал презентацию "История большого проекта автоматизации с помощью Selenium". Он описал подход с использованием тысяч автоматизированных проверок (он называл их "тестами") с целью обнаружить проблемы в приложении с помощью тестирования. Как описать разницу? Опять-таки, различие - это одна из мотиваций. Если вы запускаете тысячи автоматизированных проверок с целью показать, что у вас сегодня все работает, как и вчера, вы проверяете. Хотя, вы можете использовать тысячи автоматизированных проверок другими способами. Если вы пытаетесь ответить на новые вопросы, например "что случится, если мы запустим наши проверки на 30 машинах одновременно, чтобы нагрузить сервер?" (мы выполним стресс-тест), или "что может случиться, если мы запустим все проверки на другой платформе?" (мы выполним тестирование совместимости), или "что будет, если мы запустим автоматизированные проверки 300 раз подряд?" (тестирование последовательности), проверки помогут нам в тестировании (что будет замечательно в этих ситуациях).
Можно еще долго, очень долго рассказывать про тестирование и проверки. Я гарантирую, что это различие не будет принято полностью, и никто не будет заниматься этим ночи напролет. Но я призываю вас обратить внимания на эти различия, и явно различать эти понятия там, где вы сможете это сделать.

Майкл Болтон, 29 августа 2009 года.

вторник, 22 января 2013 г.

Обзор 1. Размышления о регрессионном тестировании от Майкла Болтона, или "все могло быть гораздо хуже".

Открываю серию постов-обзоров, постов-конспектов по очень полезным материалам по тестированию, которые, на мой взгляд, просто НУЖНО просмотреть-прочитать-прочувствовать и много других "про-" начинающему и не очень тестировщику.

Начну с темы, которая сейчас наиболее для меня актуальна - регрессионное тестирование. Автор - Майкл Болтон. Лекция "Things Could Get Worse: Ideas About Regression Testing" и презентация.



Почему регрессионное тестирование важно? 

С ростом проекта мы получаем рост сложности, функционала, числа тест-кейсов, которые нам необходимо будет запускать каждый раз. Растет объем регрессионного тестирования, проверок и тестирования, которые нам будет необходимо выполнять (в чем разница между тестированием и проверкой - "testing vs checking" - здесь). Времени на регрессионное тестирование не увеличивается, а если и увеличивается, то незначительно, недостаточно, чтобы выполнить его в том всевозрастающем с каждой итерацией объеме, котором нам нужно. А ошибки в регрессионном тестировании и обходятся "дороже", и иногда не настолько очевидны из-за сложности продукта.

Что же делать, как правильно распределить усилия на этом этапе?
Давайте посмотрим, что нам советует Майкл Болтон (далее ниже синим шрифтом - выдержки из лекции Майкла Болтона, черным стандартным - мои комментарии).

Начнем с определения: "Регрессионные тесты - тесты, которые мы выполняли ранее и запускаем после изменений в программе". Тесты мы запускаем для того, чтобы убедиться, что качество программы не ухудшилось.

Хорошее знание вашего продукта и взаимодействия модулей внутри программы поможет вам правильно выбрать тот набор кейсов, который позволит минимизировать риск регрессионной зависимости. Но как же его выбрать?

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

Тестирование против проверки (Проверка - процесс подтверждения, верификации и валидации. Тестирование - процесс поиска новой информации, это исследование, открытие, изучение).

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

Вместо того, чтобы думать, прошел тест или нет (Pass или Fail), опытные тестировщики задают вопрос "Есть ли здесь (в этом функционале) проблема?"

"Замыливание взгляда", характерное для регрессионного тестирования (ну сколько можно уже это проверять, оно и так работает), усугубляется еще недостатком времени в конце итерации.
И времени на то, чтобы разбираться в "этом минорном баге", нет. Но порой получается так, что  незначительный видимый нам баг - только вершина айсберга, а последствия бага более критичны.

Если в регрессионном тестировании вы выделите недостаточно времени на проверки, это может привести к тому, что
- риски будут не обнаружены
- проблемы будут не обнаружены
- программа будет недостаточно изучена

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

"Тестирование важнее проверок" (дословно - "Testing Dominates checking") (c) Майкл Болтон

Проверки - это "пестициды", а тестирование - это нестандартные ходы. Пока не изобретено универсального пестицида от всех багов (а будет ли оно вообще изобретено?), тестирование просто необходимо, и без него не обойтись.

Функциональность - должна быть проверена. Производительность, масштабируемость, надежность, инсталляция - может быть проверена. Удобство использования, безопасность, совместимость, поддерживаемость, тестирумость - должна быть протестирована.

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

Риск регрессионной зависимости - самый большой проектный риск? Нет, только в 6-15% случаях (опрос тест менеджеров).
Риск регрессионной зависимости - эмоциональный страх.

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

Способы снижения риска регрессионной зависимости в Agile:  разработка через тесты (Test Driven Development), модульные тесты (Unit Tests), парное тестирование, непрерывная интеграция (Continious Integration), контроль сборок и версий (Version and Build Control).

Оставим эту тему для отдельного озбора, вместе с ролью QA в Aglie-команде.

Даже самый лучший вратарь пропускает "неберущиеся" мячи. Даже самый лучший вратарь не спасет вас, если у вас слабая защита.

Тренируйте защиту, внедряйте проверки, и тренируйтесь сами как вратарь - "ближний угол вратаря", "20 копеек - это всегда обидно" и другие базовые навыки.

Как выбрать то, что нужно протестировать в регрессионном тестировании. Карен Джонсон, эвристика RCRCRC + автоматизированные проверки в регрессионном тестировании, Майкл Келли.

Это общая эвристическая модель, на вашем проекте многое зависит и от вашего опыта, предыдущих регрессий. Используйте ретроспективные митинги, чтобы не повторять прошлых ошибок, регулярно обновляйте тест-кейсы, матрицу трассируемости (Traceability Matrix). И я бы сюда еще добавил саморазвитие: регрессионное тестирование у вас будет повторяться в каждой итерации, применяйте полученные знания и внедряйте опыт.

Стратегические идеи во время регрессионного тестирования (по клику начинается просмотр видео со слайда презентации).

На чем важно сфокусироваться, выполняя ту или иную активность. На этом месте можно вставить притчу о трех каменотесах. В тестировании то же самое: то, как вы воспринимаете свою работу, так вы ее и выполняете.

На этом все. Спасибо за внимание, и успехов вам в регрессионном тетсировании!