|
|
|||||||||||||||||||||||||||||
|
TOP 13 ошибок тестировщиковИсточник: thalion Артём Ваулин
Странное название? Обычно TOP-ы круглочисленные (Fortuna 500, Русская 10-ка и т.д.)? Почему именно 13? Не потому ли, что по общепринятому мнению (программисты часто считают свое мнение - общепринятым) тестировщики приносят одни несчастья? Думаю, что примерно такие вопросы за долю секунды промелькнут в ваших головах, когда вы увидели название этого эссе. Все намного проще... Именно столько пометок (13 штук) я сделал в своем блокноте во время подготовки к совещанию с группой тестирования, на котором я хотел выступить с вопросом о том, какие недочеты и промахи в своей работе допускают тестировщики и какие проблемы имеются в организации нашего процесса тестирования. Сразу же хочу оговориться, что данные рекомендации выработаны на основе одного конкретного процесса тестирования, которого придерживается созданная мной группа тестирования. Но я также не исключаю, что любой практикующий тестировщик, руководитель тестировщиков и т.д. сможет вынести нечто полезное из нашего опыта. Для лучшего восприятия и наибольшей запоминаемости, я постарался сгруппировать свои 13 рекомендаций в несколько обобщенных категорий и расставить их по приоритету, начиная, по моему мнению, с самого важного. Получилось следующее:
Внутри каждой категории я обозначу и постараюсь объяснить каждую пометку из тех, которые я набросал в своем блокноте во время подготовки. Требования1. Требования необходимо тестироватьРечь здесь идет о тестировании требований всех уровней и видов: бизнес-требования, пользовательские требования, системные требования, функциональные требования, нефункциональные требования, требований производительности, требования удобства использования и т.д. Мало того, что их надо тестировать. Тестировать требования необходимо на самых ранних этапах и/или стадиях процесса разработки (думаю, что Америки я не открыл). Начинать тестировать требования надо сразу, как только у вас появилась уникальная возможность получить к ним доступ, несмотря на то, где и в каком виде они находятся - в электронном виде, размещенные на общедоступном ресурсе, высланные вам по электронной почте или только что сформировавшиеся в голове консультанта/аналитика и еще не получившие формального отражения. Если вы действительно радеете за результат, то обязательно постарайтесь привлечь к тестированию требований и ваших разработчиков, если самостоятельно они этого не делают, ошибочно полагая, что всем связанным с тестирование должны заниматься вы (т.е. тестировщики), а всем, связанным с требованиями, - консультанты и аналитики. Проанализировав требования с точки зрения внутренний архитектуры системы (программы) и кода, разработчики могут дать множество ценных советов и замечаний относительно того, что в требованиях написано не так или чего там не хватает. Последствиями либо отсутствия тестирования требований вообще, либо откладывания тестирования требований до лучших времен или тезиса "все их недостатки выявятся в процессе разработки и тестирования" являются:
Несмотря на важность тестирования требований программистами, речь здесь идет прежде всего о тестировщиках, которые громко кричат, что консультант Пупкин здесь не написал то, здесь недодумал это, тут не понятно, а в следующем абзаце вообще чушь полную написал, которая никак не состыкуется с тем, что было написано и сделано до этого. Честь бы и хвала была такому тестировщику, если бы кричал он об этом не за день до выкладки релиза, а в первый день работы над данной функциональностью. В заключении заметки о тестировании требований еще раз осмелюсь повторить критерии качества требований к программному обеспечению:
Тест- кейсыДля лучшего понимания раздела, посвященного тест-кейсам, приведу здесь определение этих самых тест-кейсов, которое предлагает энциклопедия Wikipedia (прошу прощения за мой вольный перевод). Тест-кейс (тестовый случай, test case) - это набор условий и/или переменных, с помощью которых тестировщик будет определять насколько полно тестируемое приложение удовлетворяет предъявляемому к нему требованию. Для того, чтобы убедиться, что требование полностью удовлетворяется, может понадобиться несколько тест-кейсов. Для полного тестирования всех требований, предъявляемых к приложению, должен быть создан/выполнен по меньшей мере один тест-кейс для каждого требования. Если требование имеет дочерние требования, то для каждого такого дочернего требования должен быть создан/выполнен также по крайней мере один тест-кейс. Некоторые методологии (например, RUP) рекомендуют создавать по меньшей мере два тест-кейса для каждого требования. Один из них должен выполнять позитивное тестирование, другой - негативное. Если приложение создается без формальных требований, то тест-кейсы пишутся основываясь на обычном поведении программ схожего класса (на так называемых оракулах - но это уже совсем другая история). Что формально характеризует написанный тест-кейс? Наличие известного ввода (входные данные) и ожидаемого результата, который достигается после выполнения теста. Входные данные называются предусловиями теста, а ожидаемый результат - постусловиями теста. Написанные тест-кейсы часто объединяются в тестовые наборы (test suite). Комбинации тест-кейсов наиболее часто используются в приемочном тестировании. Приемочное тестирование выполняется группой конечных пользователей, клиентов (или как в нашем случае, группой разработчиков - об этом позже), чтобы убедиться, что разработанная система удовлетворяет их требованиям. Приемочное тестирования обычно характеризуется включением в него позитивных тест-кейсов, которые определяют удачный путь выполнения приложения. 2. Тест-кейсы необходимо писать по требованиямНачну здесь, пожалуй, с того, что же такое тестирование и какой программный продукт (систему) мы можем назвать качественным. Надеюсь, что дальше станет понятно, почему я начинаю с определения очевидных вещей. Одним из определений качественного продукта (не обязательного программного) является то, на сколько данный продукт удовлетворяет предъявляемым к нему требованиям. Исходя из такого подхода к качественному продукту, можно дать следующее определение тестированию. Тестирование - это процесс проверки соответствия продукта предъявляемым к нему требованиям. Т.е. в процессе тестирования программного продукта мы определяем соответствует ли то, что написали программисты, тому, что написали консультанты и аналитики (формализовав требования и пожелания Заказчика). Данное определение ни в коем случае не претендует на полноту и описывает процесс тестирования только с одной стороны. С той стороны, которая повернута к требованиям. Именно поэтому не стоит расценивать все, что будет написано дальше, как исчерпывающую инструкцию по написанию тест-кейсов. Отталкиваясь от приведенного мной выше определения через призму рассматриваемой проблемы с тест-кейсами, можно заключить, что тест-кейсы, по своей сути направленные на проверку требований, должны писаться исходя из предъявляемых к продукту требований и никак иначе. Что же делают наиболее изобретательные тестировщики? При написании тест-кейсов они пытаются заручиться поддержкой программистов, а если еще точнее, то они пытаются как можно быстрей получить готовую реализацию продукта и писать все тест-кейсы, опираясь на реализованный продукт, т.к. это по их мнению объективно проще и понятней. Это крайне неправильно! В этом случае получается, что в процессе тестирования проверяется соответствие разработанного продукта разработанному продукту (вот такой каламбурчик). Сами можете представить себе, что из этого получается. Поэтому, резюмирую все описанное выше - базисом для подготовки тест-кейсов должны быть требования (в том или ином виде), а ни в коем случае не готовый продукт. 3. Тест-кейсы должны не повторять требования, а проверять ихЛень... Она является как источником великих прорывов и открытий, так и причиной, которая делает бессмысленной проделанную работу, проведенного впустую времени. Осмысленность любому начинанию, любой работе придает результат (желательно, конечно, положительный), ради которого эта работа задумывалась и выполнялась. Тоже самое можно сказать и о тест-кейсах. Смыслом написания/выполнения тест-кейсов является проверка того, насколько тестируемое приложение удовлетворяет предъявляемому к нему требованию. Результатом выполнения тест-кейса должны стать его прохождение или провал, что подтвердит соответствие реализации требованию или нет (кстати, для тестировщика любой исход является положительным, правда, в случае провала тест-кейса - более приятным :)). Что я имею в виду, когда пишу, что тесты должны не повторять требования, а проверять их? Поясню на простых (естественно, выдуманных, чтобы читатели не краснели, при виде своих собственных творений) примерах. Есть одно из функциональных требований к системе, для которого необходимо написать тест-кейсы: Значение в поле "Сумма" должно рассчитываться как сумма значений из полей "A" и "B". Тест-кейс, написанный ленивым тестировщиком: ... Действия: Ввести значения в поля "A" и "B". Ожидаемый результат: Значение в поле "Сумма" должно рассчитываться как сумма значений из полей "А" и "B". (Иногда еще также в графе с ожидаемым результатом встречаются такие "шедевры" как: См. в ТЗ, в соответствии с ТЗ, наблюдаем ожидаемые значения и т.п.). ... Тест-кейс, написанный неленивым тестировщиком: ... Действия: 1. В поле "А" ввести значение 2 2. В поле "B" ввести значение 3 3. Нажать на кнопку "Рассчитать" Ожидаемый результат: В поле "Сумма" отобразилось значение 5 ... Чем второй тест-кейс лучше первого? Первый тест-кейс является всего лишь повторением написанного требования. Во-первых, он не направлен на проверку этого требования, а во-вторых, зачем еще раз дублировать то, что уже написано, - тратить время впустую. Далее, если речь идет о приемочных тест-кейсах, которые должны обязательно выполнить разработчики перед тем, чтобы передать версию на тестирование, то здесь в случае с первым тест-кейсом вообще все плохо. Т.е. реакция разработчика на такой тест-кейс такова (сужу по своему собственному опыту): "Я же и так все делал по требованиям, поэтому должно все работать, как я и сделал. Тем более я когда-то проверял, что 2 + 2 = 4". И разработчик со спокойной совестью ставит Pass и переходит к следующему тест-кейсу (который наверняка будет таким же неоднозначным :)). Приведенный пример с суммированием, конечно же, очень примитивен для простоты понимания, но на практике часто приходится сталкиваться с тем, что менее очевидные вещи, чем A + B, описываются в тест-кейсах аналогичным образом и не приносят ожидаемого результата, т.е. проверки какого - либо требования. И в силу этого, после выкладки тестовой версии кажущиеся на первый взгляд очевидными (позитивные) тесты проваливаются. Здесь суть еще заключается в том, что кроме того, что тест-кейсы должны проверять требования, а не повторять их, очень важным является следующий момент: тест-кейсы должны быть однозначными, т.е. должны быть составлены и сформулированы таким образом, чтобы они не допускали двусмысленного толкования, а однозначно понимались всеми участниками. 4. Написание приемочных тест-кейсов (по определенным правилам)В предыдущих заметках я уже упоминал о приемочных тестах, которые подготавливают тестировщики для принятия на тестирование очередной тестовой версии приложения. Проясню немного ситуацию. На проекте сложилась классическая ситуация, описанная еще когда-то господином Канером, когда с появлением выделенного тестирования разработчики расслабляются и абсолютно перестают тестировать свои бесценные творения. Доходит даже до того, что написав что-то (или исправив очередную ошибку в коде) они даже не удосуживаются посмотреть, что же в результате их писательства получилось, а с легкой руки передают на тестирование. Спасибо, что хоть привычка компилировать еще сохранилась! Для пресечения такой ситуации было перепробовано множество различных способов и методов, начиная с дружеского разъяснения, проведения обучающих семинаров, написания чек-листов и памяток для разработчиков и заканчивая различными степенями наказания (насколько позволяет корпоративная культура), но ничего не помогало. Поэтому было решено подготавливать некоторые наборы приемочных тест-кейсов для разработчиков, которые они в обязательном порядке должны прогонять на системе для разработке перед выкладкой тестовой версии. Обязательным условием выкладки тестовой версии является 100% Pass приемочных тест-кейсов. После выкладки тестовой версии тестировщики начинают свою работу с повторного прогона того же самого приемочного набора для проверки того, что разработчики действительно выполнили все тест-кейсы (а не просто проставили отметки). Я здесь не вдаюсь в технические детали всей этой процедуры. По результатам такой проверки тестировщиками происходит разбор полетов, после которого кто-то получает прянички, а кто-то кнуты. Результат улучшился - разработчики стали в некоторой степени контролировать свои деяния, но сами понимаете, появились другие проблемы, о которых я и хотел здесь написать, - как написать приемочные тест-кейсы, чтобы они были понятны разработчикам, и чтобы они смогли прогнать их на своей системе для разработки, данные на которой, как правило сильно отличаются от тестовых. Парочку таких правил я уже написал в предыдущем пункте: тест-кейсы (в том числе и приемочные) должны проверять требования, а не повторять их и тест-кейсы должны быть однозначными, т.е. максимально одинаково пониматься как тестировщиками, так и разработчиками. Здесь о другом. 1. Первое и, на мой взгляд, самое главное - при написании тест-кейсов (а особенно приемочных) тестировщик должен осознать, что данные тест-кейсы предназначены не для него самого, а для другого человека. И писать их, соответственно, необходимо максимально подробно и максимально понятно даже не для посвященного в бизнес-логику приложения человека. 2. Существует два варианта подготовки приемочных тест-кейсов: первый - после подготовки набора тест-кейсов для полного тестирования выбрать из него тест-кейсы для приемочного тестирования, которые покрывают основной (положительный) путь работы приложения; второй - специально подготовить набор только приемочных тест-кейсов. Однозначно сказать, какой вариант предпочтительней, не возможно. Все очень сильно зависит от ситуации и от тестируемой функциональности. Одно могу сказать совершенно точно (это и есть следующее правило) - тест-кейсы должны быть составлены таким образом, чтобы они не зависели от тех данных, от тех ситуаций, объектов и т.п., которыми тестировщик оперирует на тестовой системе. Т.е. все необходимые данные, объекты и т.д., необходимые для прогона приемочного тест-кейса, должны быть подготовлены самими разработчиками. Как этого добиться? Написать вспомогательные тест-кейсы (либо же написать вспомогательные действия в том же самом приемочном тест-кейсе), которые позволят сделать все предварительные приготовления для основного тест-кейса. В приемочных тестах для разработчиков нельзя ссылаться на какие-то объекты с тестовой системы. Сами понимаете, разработчик просто может не найти их и, в лучшем случае, постарается разобраться в ситуации, а в худшем - напишет комментарий к этому тест-кейсу и поставит Blocked. 3. Еще один очень важный момент, который приводит в замешательство разработчиков, которые прогоняют приемочные тест-кейсы, и не способствует их качественному выполнению. Кстати, этот пунктик относится не только к приемочным тест-кейсам, а к правилам написания тест-кейсов вообще. Сокращенно звучит он так - один тест-кейс - одна проверка. Как реагировать на следующий тест-кейс? ... Steps 1. Действие 1 2. Действие 2 3. Действие 3 4. Действие 4 Expected Results 1. Результат 1 2. Результат 2 3. Результат 3 4. Результат 4 ... Каждому номеру действия необходимо сопоставлять соответствующий номер ожидаемого результата? Или же после выполнения полностью всех действий мы получим результат, состоящий из четырех пунктов? А может быть как - то еще? Здесь же встает еще и другой вопрос - какой статус выставлять для тест-кейса, если либо часть действий выполнилась, а часть нет, либо в результате успешного выполнения всех действий часть ожидаемых результатов появилась, а часть нет? И это не голая теория, а реальные вопросы, которые мне задают разработчики, которые выполняют таким образом составленные тест-кейсы. Поэтому, чтобы избежать таких ситуаций, необходимо писать тест-кейсы таким образом, чтобы они содержали только одну проверку. Не путать с требованиями. Т.к. чтобы проверить одно требование, может понадобиться несколько проверок, а, следовательно, несколько тест-кейсов. 5. Своевременность отметок о прохождении/сбое тест-кейсовЕсли все (или почти все) мировое сообщество тестировщиков использует в своих тест-кейсах отметку о прохождении/сбое этих самых тест-кейсов, то, как минимум, необходимо задуматься о том, что они проставляются не просто так, а с какой-то определенной целью (цель, естественно, у каждого своя). В нашем случае цель проста - в любой момент времени отслеживать текущую ситуацию по процессу выполнения тест-кейсов:
Чтобы получать объективную информацию, необходимо, чтобы в каждый момент времени данные о выполнении тест-кейсов были актуальными. Для этого необходимо, чтобы сразу же после прогона тест-кейса тестировщик проставлял соответствующую отметку. Чаще всего тестировщики не проставляют отметки сразу же, откладывая на потом, когда полностью закончат тестирование. Какие я вижу минусы в этом подходе: Нет оперативной информации о том, на каком этапе в данный момент находится тестирование и, следовательно, совершенно не понятно укладывается тестирование в отведенные сроки или необходимы корректирующие действия. Выполнив 125 тест-кейсов тестировщик вряд ли точно вспомнит, какие тест-кейсы прошли успешно, а какие нет. Тестировщику придется потратить дополнительное время для того, чтобы восстановить в памяти, что было некоторое время назад и, самое главное, чтобы проставить все эти статусы (а если тест-кейсов будет несколько тысяч, а процесс тестирования будет занимать несколько месяцев, сколько же времени понадобиться на приведение статусов к актуальному виду?). И даже если тестировщику это удастся, то данная информация к тому времени утратит свою ценность. Поэтому давайте делать все в свое время! Как говорится: "Дорога ложка к обеду".Ссылки по теме
|
|