Всё, что описывается в этом поле, готовится БЕЗ использования тестируемого приложения, и
таким образом, если здесь возникают проблемы, нельзя писать отчёт о дефекте в приложении.
Эта мысль очень и очень важна, потому поясним её простым жизненным примером.
Представьте, что вы дегустируете конфеты. В поле «исходные данные» можно прописать
«купить конфеты таких-то сортов в таком-то количестве». Если таких конфет нет в продаже,
если закрыт магазин, если не хватило денег и т.д. — всё это НЕ проблемы вкуса конфет, и нельзя
писать отчёт о дефекте конфет вида «конфеты невкусные потому, что закрыт магазин».
Шаги тест-кейса (steps) описывают последовательность действий, которые необходимо
реализовать в процессе выполнения тест-кейса. Общие рекомендации по написанию шагов
таковы:
1) начинайте с понятного и очевидного места, не пишите лишних начальных шагов (запуск
приложения, очевидные операции с интерфейсом и т.п.);
2) даже если в тест-кейсе всего один шаг, нумеруйте его (иначе возрастает вероятность в
будущем случайно «приклеить» описание этого шага к новому тексту);
3) если вы пишете на русском языке, используйте безличную форму (например, «открыть»,
«ввести», «добавить» вместо «откройте», «введите», «добавьте»);
4) соотносите степень детализации шагов и их параметров с целью тест-кейса, его
сложностью, уровнем и т.д. — в зависимости от этих и многих других факторов степень
детализации может варьироваться от общих идей до предельно чётко прописанных
значений и указаний;
5) ссылайтесь на предыдущие шаги и их диапазоны для сокращения объёма текста
(например, «повторить шаги 3–5 со значением…»);
6) пишите шаги последовательно, без условных конструкций вида «если… то…».
Категорически запрещено ссылаться на шаги из других тест-кейсов и другие тест-кейсы
целиком: если те, другие тесткейсы будут изменены или удалены, ваш тест-кейс начнёт
ссылаться на неверные данные или в пустоту, а если в процессе выполнения те, другие тест-
кейсы или шаги приведут к возникновению ошибки, вы не сможете закончить выполнение
вашего тест-кейса.
Ожидаемые результаты (expected results) по каждому шагу тест-кейса описывают реакцию
приложения на действия, описанные в поле «шаги тест-кейса». Номер шага соответствует
номеру результата. По написанию ожидаемых результатов можно порекомендовать следующее:
1) описывайте поведение системы так, чтобы исключить субъективное толкование (например,
«приложение работает верно» — плохо, «появляется окно с надписью…» — хорошо);
2) пишите ожидаемый результат по всем шагам без исключения, если у вас есть хоть малейшие
сомнения в том, что результат некоего шага будет совершенно тривиальным и очевидным (если
вы всё же пропускаете ожидаемый результат для какого-то тривиального действия, лучше
оставить в списке ожидаемых результатов пустую строку — это облегчает восприятие);
3) пишите кратко, но не в ущерб информативности;
4) избегайте условных конструкций вида «если… то…».
В ожидаемых результатах ВСЕГДА описывается КОРРЕКТНАЯ работа приложения. Нет и не
может быть ожидаемого результата в виде «приложение вызывает ошибку в операционной
системе и аварийно завершается с потерей всех пользовательских данных».
При этом корректная работа приложения вполне может предполагать отображение сообщений о
неверных действиях пользователя или неких критических ситуациях. Так, сообщение
«Невозможно сохранить файл по указанному пути: на целевом носителе недостаточно
свободного места» — это не ошибка приложения, это его совершенно нормальная и правильная
работа. Ошибкой приложения (в этой же ситуации) было бы отсутствие такого сообщения, и/или
повреждение, или потеря записываемых данных.
Свойства качественного тест-кейса:
Даже правильно оформленный тест-кейс может оказаться некачественным, если в нём
нарушено одно из следующих свойств:
1) Правильный технический язык.
- пишите лаконично, но понятно;
- используйте безличную форму глаголов (например, «открыть» вместо
«откройте»);
- обязательно указывайте точные имена и технически верные названия элементов
приложения;
- не объясняйте базовые принципы работы с компьютером (предполагается, что
ваши коллеги знают, что такое, например, «пункт меню» и как с ним работать).
2) Баланс между специфичностью и общностью. Тест-кейс считается тем более
специфичным, чем более детально в нём расписаны конкретные действия, конкретные
значения и т.д., т.е. чем в нём больше конкретики. Соответственно, тест-кейс считается
тем более общим, чем в нём меньше конкретики.
Рассмотрим поля «шаги» и «ожидаемые результаты» двух тест-кейсов (подумайте, какой
тест-кейс вы бы посчитали хорошим, а какой — плохим и почему):
В этом тест-кейсе есть всё необходимое для понимания и выполнения, но при этом он
стал короче и проще для выполнения, а отсутствие строго указанных значений приводит
к тому, что при многократном выполнении тест-кейса (особенно — разными
тестировщиками) конкретные параметры будут менять свои значения, что увеличивает
вероятность обнаружения ошибки. Ещё раз главная мысль: сами по себе специфичность
или общность тест кейса не являются чем-то плохим, но резкий перекос в ту или иную
сторону снижает качество тест-кейса.
3) Баланс между простотой и сложностью. Здесь не существует академических
определений, но принято считать, что простой тест-кейс оперирует одним объектом (или
в нём явно виден главный объект), а также содержит небольшое количество тривиальных
действий; сложный тест-кейс оперирует несколькими равноправными объектами и
содержит много нетривиальных действий.
Как правило, чек-листы делают в Google-таблице для обеспечения общего доступа всем QA-
специалистам. При прохождении чек-листов тестировщик отмечает статус напротив каждого
тестируемого пункта.
Возможны следующие варианты статусов:
● «Passed» – проверка пройдена успешно, багов не найдено;
● «Failed» – найден один или более багов;
● «Blocked» – невозможно проверить, т.к. один из багов блокирует текущую проверку;
● «In Progress» – текущий пункт, над которым работает тестировщик;
● «Not run» – еще не проверено;
● «Skipped» – проверяться не будет по какой-либо причине. Например, текущий
функционал еще не реализован.
Для большей наглядности, как правило, каждый из статусов имеет свой цвет.
Отметим несколько основных моментов, которые стоит учитывать при работе с чек-листами:
1. По завершении прохождения чек-листа не должно остаться ячеек со статусом «Not run».
2. Все ячейки со статусом «Failed» и «Blocked» обязательно должны иметь примечания со
ссылками на баг-репорты.
3. Статус «Passed» устанавливается только для пунктов, которые проверены и не содержат
ошибок.
Rules for drawing up checklists:
1. One point - one operation. Checklist items are unambiguous atomic and complete operations.
For example, adding an item to a website cart and paying for an order are two different tasks. In
the list of checks, such operations are formalized as separate items: the item was added to the
cart, the payment was sent.
2. Points start with a noun. The purpose of the checklist is to take into account all the actions for
the most complete coverage with software tests, therefore, when compiling points, you should
adhere to a unified form. For a clear and unambiguous presentation, it is better to start
paragraphs with a noun - "Check", "Add", "Submit" or an indefinite verb - "Check", "Add",
"Send".
3. Drawing up a checklist by levels of detail. For the convenience of passing the checklist, it is
best to make a list in a form that will be consistent based on the logic of using the functionality.
Within the section "Registration and Personal Profile": registration on the site, editing the
profile. Section "Feedback form": field validation, letter sending, letter delivery.
Логика проста: тесты ищут ошибки. Но все ошибки найти невозможно. Это означает,
что задача тестировщика - найти максимум ВАЖНЫХ ошибок за доступное время. Под
важными ошибками мы понимаем те, которые приводят к нарушению функций или
свойств продукта, важных для пользователя. Функции и свойства не разделены случайно
- безопасность, производительность, удобство и т. Д. Не являются функциональными, но
играют одинаково важную роль в формировании удовлетворенности клиентов и
конечных пользователей.
Есть довольно простой алгоритм, позволяющий создавать эффективные проверки.
Когда вы начинаете думать о контрольном списке, тестовом примере или сценарии
тестирования, задайте себе следующие вопросы и получите четкие ответы:
1) Что перед тобой? Если вы не понимаете, что собираетесь тестировать, вы не пойдете
дальше бездумных формальных проверок.
2) Кому это нужно и зачем (и насколько это важно)? Ответ на этот вопрос позволит вам
быстро найти некоторые типичные варианты использования того, что вы собираетесь
тестировать.
3) Как это обычно используется?
4) Как он может сломаться, т.е. начать работать неправильно?
К этому алгоритму вы можете добавить небольшой список универсальных
рекомендаций, которые позволят вам лучше проводить тестирование:
- Начните как можно раньше - с момента появления первых требований вы можете
тестировать и улучшать их, вы можете писать контрольные списки и тестовые примеры,
вы можете уточнить план тестирования, подготовить тестовую среду и т. Д.
- Если вам нужно протестировать что-то большое и сложное, разбейте его на модули и
подмодули, подвергните функциональность функциональной декомпозиции, то есть
достигните уровня детализации, на котором вы можете легко запомнить всю
информацию об объекте тестирования.
- Обязательно напишите чек-листы. Если вы думаете, что можете запомнить все идеи, а
затем легко их воспроизвести, вы ошибаетесь. Никаких исключений.
- Когда вы создаете контрольные списки, контрольные примеры и т. Д., Записывайте
возникающие вопросы прямо в текст. Когда у вас будет достаточно вопросов, соберите
их отдельно, уточните формулировки и обратитесь к тому, кто может дать ответы.
- Если используемый вами инструмент позволяет использовать косметическое
оформление текста, используйте его (это улучшит читаемость текста), но старайтесь
следовать общепринятым традициям и не окрашивайте каждое второе слово в свой цвет,
шрифт, размер и т. д.
- Используйте технику быстрого взгляда, чтобы получить обратную связь от коллег и
улучшить создаваемый вами документ.
- Запланируйте время для улучшения тестовых случаев (исправления ошибок, пересмотр
при изменении требований и т. Д.).
- Начните разработку (и выполнение) тестовых примеров с простых проверок наиболее
важных функций. Затем постепенно увеличивайте сложность тестов.
- Помните, что тестирование основано на цели. Если вы не можете быстро и легко
сформулировать цель созданного вами тестового примера, вы создали плохой тестовый
пример.
- Избегайте повторяющихся тестов.
- Если экспоненциальность тестового примера можно увеличить без значительного
изменения его сложности и без отклонения от исходной цели, сделайте это.
- Помните, что многие тестовые примеры требуют отдельной подготовки, которая
должна быть описана в соответствующем поле тестового примера.
- Подумайте, как вы можете оптимизировать созданный вами тестовый пример (набор
тестовых примеров и т. Д.), Чтобы снизить трудозатраты на его выполнение.
- Перед отправкой окончательной версии созданного вами документа перечитайте
написанное (в доброй половине случаев вы обнаружите опечатку или другой
недостаток).
Логические ошибки
- Ссылка на другие тест-кейсы или шаги других тест-кейсов.
- Детализация, не соответствующая уровню функционального тестирования. Например, не
нужно на уровне дымового тестирования проверять работоспособность каждой
отдельной кнопки или прописывать некий крайне сложный, нетривиальный и редкий
сценарий — поведение кнопок и без явного указания будет проверено множеством тест-
кейсов, объективно задействующих эти кнопки, а сложному сценарию место на уровне
тестирования критического пути или даже на уровне расширенного тестирования (в
которых, напротив, недостатком можно считать излишнее обобщение без должной
детализации).
- Расплывчатые двусмысленные описания действий и ожидаемых результатов. Помните,
что тест-кейс с высокой вероятностью будете выполнять не вы (автор тест-кейса), а
другой сотрудник, и он — не телепат. Попробуйте догадаться по этим примерам, что
имел в виду автор: «Установить приложение на диск C». (Т.е. в «C:\»? Прямо в корень?
Или как?) «Нажать на иконку приложения». (Например, если у меня есть ico-файл с
иконкой приложения, и я по нему кликну — это оно? Или нет?) «Окно приложения
запустится». (Куда?) «Работает верно». (Ого! А верно — это, простите, как?) «OK». (И?
Что «OK»?) «Количество найденных файлов совпадает». (С чем?) «Приложение
отказывается выполнять команду». (Что значит «отказывается»? Как это выглядит? Что
должно происходить?)
- Описание действий в качестве наименований модуля/подмодуля. Например, «запуск
приложения» — это НЕ модуль или подмодуль. Модуль или подмодуль — это всегда
некие части приложения, а не его поведение. Сравните: «дыхательная система» — это
модуль человека, но «дыхание» — нет.
- Описание событий или процессов в качестве шагов или ожидаемых результатов.
Например, в качестве шага сказано: «Ввод спецсимволов в поле X». Это было бы
сносным заглавием тест-кейса, но не годится в качестве шага, который должен быть
сформулирован как «Ввести спецсимволы (перечень) в поле X». Куда страшнее, если
подобное встречается в ожидаемых результатах. Например, там написано: «Отображение
скорости чтения в панели X». И что? Оно должно начаться, продолжиться, завершиться,
не начинаться, неким образом измениться (например, измениться должна размерность
данных), как-то на что-то повлиять? Тест-кейс становится полностью бессмысленным,
т.к. такой ожидаемый результат невозможно сравнить с фактическим поведением
приложения.
- «Выдумывание» особенностей поведения приложения. Да, часто в требованиях
отсутствуют самоочевидные (без кавычек, они на самом деле самоочевидные) вещи, но
нередко встречаются и некачественные (например, неполные) требования, которые
нужно улучшать, а не «телепатически компенсировать». Например, в требованиях
сказано, что «приложение должно отображать диалоговое окно сохранения с указанным
по умолчанию каталогом». Если из контекста (соседних требований, иных документов)
ничего не удаётся узнать об этом таинственном «каталоге по умолчанию», нужно задать
вопрос. Нельзя просто записать в ожидаемых результатах «отображается диалоговое
окно сохранения с указанным по умолчанию каталогом» (как мы проверим, что выбран
именно указанный по умолчанию каталог, а не какой-то иной?). И уж тем более нельзя в
ожидаемых результатах писать «отображается диалоговое окно сохранения с выбранным
каталогом “C:/SavedDocuments”» (откуда взялось это «C:/SavedDocuments», — не ясно,
т.е. оно явно выдумано из головы и, скорее всего, выдумано неправильно).
- Отсутствие описания приготовления к выполнению тест-кейса.
- Слишком длинный перечень шагов, не относящихся к сути (цели) тесткейса. Например,
мы хотим проверить корректность одностороннего режима печати из нашего
приложения на дуплексном принтере. Сравните:
Здесь или не указано, что вызов окна «Текущее состояние» происходит гд-ето в другом
приложении, или остаётся загадкой, как вызвать это окно у завершившего работу
приложения. Запустить заново? Возможно, но в тест-кейсе этого не сказано.
- Тест-кейсы, не относящиеся к тестируемому приложению. Например, нам нужно
протестировать фотогалерею на сайте. Соответственно, следующие тест-кейсы никак не
относятся к фотогалерее (они тестируют браузер, операционную систему пользователя,
файловый менеджер и т.д. — но НЕ наше приложение, ни его серверную, ни даже
клиентскую часть):
- Файл с сетевого диска.
- Файл со съёмного носителя.
- Файл, заблокированный другим приложением.
- Файл, открытый другим приложением.
- Файл, к которому у пользователя нет прав доступа.
- Вручную указать путь к файлу.
- Файл из глубоко расположенной поддиректории.
3. Выполним тесты.
1. Внесем предварительную оплату за 30 часов до вылета рейса по расписанию. Проверим,
что в тариф включена скидка 50%.
2. Внесем предварительную оплату за 10 часов до вылета рейса по расписанию. Проверим,
что тариф – общий.
3. Внесем предварительную оплату за 2 часа до вылета рейса по расписанию. Проверим,
что тариф увеличен на 20%.
1. 0, 1, 2
2. 999, 1000, 1001
Пример 2
Допустим, какое-то значение (например, налог) для человека рассчитывается на основании его
пола, возраста и наличия детей – получаем три входных параметра, для каждого из которых для
тестов выбираем любое из возможных значений. Например: пол – мужской или женский; возраст
– до 25, от 25 до 60, более 60; наличие детей – да или нет. Для проверки правильности расчетов
можно, конечно, перебрать все комбинации значений всех параметров:
А можно решить, что не нужно проверять сочетания значений всех параметров со всеми, а
только убедиться, что проверятся все уникальные пары значений параметров. Например, с точки
зрения параметров пола и возраста нужно убедиться, что точно проверим мужчину до 25,
мужчину между 25 и 60, мужчину после 60, а также женщину до 25, женщину между 25 и 60,
также женщину после 60. И точно так же для всех остальных пар параметров. И таким образом,
можем получить гораздо меньше наборов значений (в них есть все пары значений, правда
некоторые дважды):
Пример 3
Есть два браузера Opera и Firefox. Есть две операционные системы Windows и Linux. Тут ничего
не уменьшить, так как из них можно сложить 4 конфигурации:
№ Browser OS
1 Opera Windows
2 Firefox Linux
3 Opera Linux
4 Firefox Windows
Допустим, сайт на двух языках: русский (RU) и английский (EN). Для полного эксперимента,
умножим те 4 конфигурации на 2, т.е. каждую из предыдущих конфигураций проверить с
обоими языками. Но зачем? Вместо этого воспользуемся попарным подходом и вместо 8
конфигураций получим опять 4:
№ Browser OS Language
1 Opera Windows RU
2 Firefox Linux RU
3 Opera Linux EN
4 Firefox Windows EN
Далее, сайт может использовать MySQL, Oracle и MSSQL как базу данных. Просто используя
попарное тестирование получаем 7 конфигураций (а не 12 – предыдущие 4х3, и тем более не
24=2х2х2х3). Но тут опять стоит задуматься, а важно ли проверять каждую базу в сочетании с
другими параметрами. Очевидно – нет. Важно посмотреть, например, как каждая база работает с
каждым языком. Таким образом, введя ограничения, вместо 7 получим 6 конфигураций (3 базы х
2 языка):
Пример 4
Главный принцип попарного тестирования в том, что в подавляющем большинстве случаев не
надо проводить полнофакторный эксперимент (т.е. перебирать все конфигурации, где все
значения всех параметров встречаются друг с другом). Да и невозможно это зачастую из-за
нехватки ресурсов. Поэтому декларируется, что достаточно проверить как работает ПО, когда
каждое значение каждого параметра встретилось с другим значением каждого другого параметра
хотя бы раз. Допустим, необходимо протестировать комбинации настроек параметров окна
«Font» в текстовом процессоре:
Предположим, что возможны баги из-за комбинаций параметров. Как много тестов необходимо
провести, чтобы покрыть все значения? Возьмем для тестирования следующие параметры и их
значения:
Font TT Arial
Strikethrough on off
Superscript on off
Subscript on off
Shadow on off
Outline on off
Emboss on off
Engrave on off
Hidden on off
TestLink
1. Title (заглавие) здесь тоже является обязательным для заполнения.
2. Summary (описание) позволяет добавить любую полезную информацию о тест-кейсе (включая
особенности выполнения, приготовления и т.д.).
3. Steps (шаги выполнения) позволяет описать шаги выполнения.
4. Expected Results (ожидаемые результаты) позволяет описать ожидаемые результаты,
относящиеся к шагам выполнения.
5. Available Keywords (доступные ключевые слова) содержит список ключевых слов, которые
можно проассоциировать с тест-кейсом для упрощения классификации и поиска тест-кейсов.
Это ещё одна вариация идеи «Модулей» и «Подмодулей» (в некоторых системах реализованы
оба механизма).
6. Assigned Keywords (назначенные ключевые слова) содержит список ключевых слов,
проассоциированных с тест-кейсом.
Как видите, инструментальные средства управления тест-кейсами могут быть и достаточно
минималистичными.
TestRail
1. Title (заглавие) здесь тоже является обязательным для заполнения.
2. Section (секция) — очередная вариация на тему «Модуль» и «Подмодуль», позволяющая
создавать иерархию секций, в которых можно размещать тест-кейсы.
3. Type (тип) здесь по умолчанию предлагает выбрать один из вариантов: automated
(автоматизированный), functionality (проверка функциональности), performance
(производительность), regression (регрессионный), usability (удобство использования), other
(прочее).
4. Priority (приоритет) здесь представлен числами, по которым распределены следующие
словесные описания: must test (обязательно выполнять), test if time (выполнять, если будет
время), don’t test (не выполнять).
5. Estimate (оценка) содержит оценку времени, которое необходимо затратить на выполнение
тест-кейса.
6. Milestone (ключевая точка) позволяет указать ключевую точку проекта, к которой данный
тест-кейс должен устойчиво показывать положительный результат (выполняться успешно).
7. References (ссылки) позволяет хранить ссылки на такие артефакты, как требования,
пользовательские истории, отчёты о дефектах и иные документы (требует дополнительной
настройки).
8. Preconditions (приготовления) представляет собой классику описания предварительных
условий и необходимых приготовлений к выполнению тесткейса.
9. Step Description (описание шага) позволяет добавлять описание отдельного шага тест-кейса.
10. Expected Results (ожидаемые результаты) позволяет описать ожидаемый результат по
каждому шагу.