Тестовая модель тестовые сценарии

Картинка с unsplash.com Обеспечение качества, оно же Quality Assurance, оно же QA, включает в себя много разных активностей, позволяющих делать продукт лучше.

Тестирование на основе моделей


Картинка с unsplash.com

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

Принято считать, что тестирование следует после разработки ПО. В каком-то смысле это правда: нельзя проверить работающий продукт, пока он не готов. Однако в эпоху гибких методологий только ленивый не слышал про так называемый принцип «смещения влево», или shift left — включение специалиста по тестированию в процесс разработки продукта как можно раньше.
Как это возможно?

Пара слов обо мне: меня зовут Настя Заречнева, и я обеспечиваю качество рекламы ВКонтакте. Раньше я работала в аутсорсе на самых разных проектах, выполняя роли от тест-аналитика до руководителя команды QA, поэтому не понаслышке знаю, что начинать тестирование заранее — классный способ сэкономить себе время и нервы в будущем.

Содержание

  • Предисловие
  • Что такое тестовые модели
  • Какое отношение к математике имеют тестовые модели
  • Плюсы и минусы тестовых моделей
  • Как начать использовать тестовые модели
  • Пример тестовой модели
  • Полезности для самостоятельного изучения

Предисловие

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

Как тестировщик может помочь в этом случае? В ситуации, когда есть макеты или спецификация, все становится проще: можно использовать готовый нарисованный интерфейс для составления тестовой документации и продумывания неочевидных, но реальных кейсов.

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

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

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

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

Тестирование на основе моделей (Model-Based Testing, далее MBT) — одна из техник тестирования черного ящика. В непрерывной разработке (и, как правило, частых поставках) большого продукта ошибка может стоить дорого, и именно потому, что MBT — один из проверенных и эффективных способов предотвратить ее как можно раньше, мне захотелось собрать и представить вам информацию о нем.

Что такое тестовые модели

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

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

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

Какое отношение к математике имеют тестовые модели

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

мы получим грубую и пока не исчерпывающую, но уже достаточно понятную тестовую модель, — например, с вариантами пополнения баланса в рекламном кабинете ВКонтакте.

Кроме того, в проектировании тестов активно используются математические дисциплины: теория графов, комбинаторика, различные минимальные и максимальные значения. Если немного вспомнить курс матанализа в университете, можно понять, что тестовые модели — лишь одно из применений всего того, что вы уже умеете.

Плюсы и минусы тестовых моделей

Как и любой подход, MBT имеет преимущества и недостатки. Давайте рассмотрим их по порядку.

Плюсы MBT:

  • Использование тестовых моделей развивает аналитическое мышление за счет постоянного анализа (сюрприз!) тестируемой системы. Лучший способ развить этот тип мышления — применять его для решения задач, например, для создания абстрактной схемы продукта или его компонента.
  • Моделирование улучшает понимание системы как у того, кто модель создает, так и у команды, которая ревьюит и использует ее. Приятный бонус: спустя некоторое время благодаря модели можно научиться предугадывать поведение системы в тех или иных обстоятельствах.
  • Тестовую модель поддерживать легче, чем много тест-кейсов (за счет абстрактности и того, что кейсов много, а модель одна).
  • MBT позволяет взглянуть на систему (или ее часть) в целом и увидеть неочевидные зависимости.
  • Создание и поддержание тестовой модели способствует синхронизации понимания работы системы внутри команды. Это очень полезно для избегания неоднозначных ситуаций и решения спорных вопросов «на берегу» до начала разработки.
  • Благодаря математической подоплеке наличие модели позволяет автоматизировать нахождение оптимального пути, пути с задействованием всех состояний и т.д. Кроме того, тестовую модель можно использовать как основу для проектирования автотестов.
  • Несомненно, модель делает процесс адаптации новичка в проект более эффективным. «Лучше один раз увидеть, чем сто раз услышать» тут как раз работает. Кроме того, у нового члена команды могут возникнуть вопросы, которые не пришли в голову команде, или другие участники процесса разработки могут вспомнить что-то важное, презентуя модель новичку.
  • Тестирование на основе моделей прекрасно подходит для долгосрочных проектов, где большое число тест-кейсов затруднит понимание принципов работы системы, а простая и наглядная схема, наоборот, упростит его.

Минусы MBT:

  • Если в модели есть ошибка, это может привести к фундаментальному недопониманию внутри команды. Именно поэтому важен следующий пункт.
  • Желательно, чтобы в моделировании (или ревью модели) участвовала вся команда. Во-первых, это позволяет исключить недопонимания, во-вторых, активирует силу коллективного разума.
  • Как и в случае с тестовой документацией, надо не лениться, поддерживать и регулярно обновлять модель. Если на это нет времени и/или недостаточно знаний, стоит поставить под сомнение целесообразность использования тестовых моделей в проекте.
  • Иногда создание модели занимает больше времени, чем написание простого чек-листа. Особенно это актуально для больших и многокомпонентных систем: если модель начинают создавать после того, как внутри системы уже существует куча не до конца понятных зависимостей, это может стать довольно долгим (но, скорее всего, того стоящим!) процессом.
  • Использование тестовых моделей требует определенных навыков абстрактного мышления вкупе с внимательностью к мелочам. Скорее всего, если вы успешно работаете в тестировании, у вас есть все эти навыки, но нужно быть осторожными и никогда не отключать критическое мышление даже по отношению к собственным трудам.

Как начать использовать тестовые модели

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

  1. Определить наиболее удобный для восприятия (собой, командой или бизнес-оунерами) вид схемы (таблица, диаграмма, граф… ). Важно, чтобы те, для кого делается модель, легко «читали» ее — это наша основная задача;
  2. Декомпозировать систему, которую собираемся описать, на модули (руководствуясь приоритетами, функциональностью, логикой или другими критериями). Скорее всего, ваша система многокомпонентна. Не стоит пытаться описать все и сразу: начните с малого.
  3. Определить для отдельно взятого модуля возможные состояния системы, действия пользователя, переходы между состояниями, а также начальные и конечные точки взаимодействия (т.н. точку входа и точку выхода).
  4. Схематично нарисовать «золотой путь», то есть идеальный вариант взаимодействия пользователя и системы.
  5. Расширить этот путь для модуля так, чтобы помимо идеальных случаев модель включала и иные варианты: подумайте, что может пойти не так на каждом шаге.
  6. Не забудьте о влиянии каждого состояния и перехода на другие части системы. Это особенно актуально, если вы создаете не первую модель для тестируемого продукта.
  7. Решить, будете ли вы объединять модули в одну схему или хранить их по отдельности.
  8. Поделиться полученной моделью с командой. Можно презентовать, отдать на ревью или пригласить коллег на ограниченную по времени сессию мозгового штурма, чтобы дополнить то, что вы могли забыть или упустить.
  9. Поддерживать! Не забывать актуализировать и обновлять модель, — особенно когда добавляете новые компоненты, связи или даже новые модели.

Пример тестовой модели

Давайте немного отойдем от теории и рассмотрим на практике пример из книги Ли Коупленда «A Practitioner’s Guide to Software Test Design», а именно диаграмму переходов состояний как иллюстрацию рабочей тестовой модели.
Тестировать будем покупку билета — например, на концерт.

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

Иллюстрация из книги Ли Коупленда «A Practitioner’s Guide to Software Test Design»

Что мы будем делать после этого? В идеальном случае оплатим билет, а затем распечатаем и предъявим его на входе. Отразим эти действия в нашей модели.

Иллюстрация из книги Ли Коупленда «A Practitioner’s Guide to Software Test Design»

После распечатывания и предъявления на входе у билета есть точка невозврата — мы использовали его на прошедшем мероприятии. Дальше билет недействителен и не может быть как-то использован, — значит, примерно здесь наш «золотой путь» и заканчивается: обозначим конец на нашей диаграмме.

Иллюстрация из книги Ли Коупленда «A Practitioner’s Guide to Software Test Design»

Как тестировщики, мы прекрасно понимаем, что все не так просто и на каждом этапе что-то может пойти не по плану. Что будет, если пользователь отменил оплату? А если просто забыл про нее, и таймер оплаты истек, тем самым завершив сессию? Это будут 2 разных типа отмены. Добавим указанные ситуации в модель.

Иллюстрация из книги Ли Коупленда «A Practitioner’s Guide to Software Test Design»

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

Иллюстрация из книги Ли Коупленда «A Practitioner’s Guide to Software Test Design»

Та-дааааам! Наша небольшая, но

гордая

работоспособная модель готова. Двигаясь по вершинам-состояниям путем ребер-переходов, мы составляем сценарии, которые будем проверять при тестировании:

Иллюстрация из книги Ли Коупленда «A Practitioner’s Guide to Software Test Design»

Мы получили 5 рабочих кейсов и бонусом наглядное представление процесса. Совсем не трудно, правда? :)

Полезности для самостоятельного изучения

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

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

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

  • Силлабус сертификации ISTQB по направлению Model-Based Tester;
  • Lee Copeland «A Practitioner’s Guide to Software Test Design», Глава 7: State-Transition Testing — глава, описывающая одну из наиболее «дружащих» с тестовыми моделями технику тест-дизайна;
  • подборка записей про MBT в блоге;
  • исчерпывающая статья про MBT;
  • Rikard Edgren «The Little Black Book On Test Design», Using Many Models;
  • «Model-based testing essentials», Anne Kramer, Bruno Legeard, 2016;
  • Torbjrn Ryber «Essential Software Test Design», Chapter 9 «Models»;
  • удобный мейкер для диаграмм переходов состояний;
  • блог-пост про State-Transition Testing;
  • видео про Тестирование на основе моделей;
  • блог-пост про тестирование на основе моделей

Оригинальная публикация


Картинка с unsplash.com

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

Принято считать, что тестирование следует после разработки ПО. В каком-то смысле это правда: нельзя проверить работающий продукт, пока он не готов. Однако в эпоху гибких методологий только ленивый не слышал про так называемый принцип «смещения влево», или shift left — включение специалиста по тестированию в процесс разработки продукта как можно раньше.
Как это возможно?

Пара слов обо мне: меня зовут Настя Заречнева, и я обеспечиваю качество рекламы ВКонтакте. Раньше я работала в аутсорсе на самых разных проектах, выполняя роли от тест-аналитика до руководителя команды QA, поэтому не понаслышке знаю, что начинать тестирование заранее — классный способ сэкономить себе время и нервы в будущем.

Содержание

  • Предисловие
  • Что такое тестовые модели
  • Какое отношение к математике имеют тестовые модели
  • Плюсы и минусы тестовых моделей
  • Как начать использовать тестовые модели
  • Пример тестовой модели
  • Полезности для самостоятельного изучения

Предисловие

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

Как тестировщик может помочь в этом случае? В ситуации, когда есть макеты или спецификация, все становится проще: можно использовать готовый нарисованный интерфейс для составления тестовой документации и продумывания неочевидных, но реальных кейсов.

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

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

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

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

Тестирование на основе моделей (Model-Based Testing, далее MBT) — одна из техник тестирования черного ящика. В непрерывной разработке (и, как правило, частых поставках) большого продукта ошибка может стоить дорого, и именно потому, что MBT — один из проверенных и эффективных способов предотвратить ее как можно раньше, мне захотелось собрать и представить вам информацию о нем.

Что такое тестовые модели

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

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

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

Какое отношение к математике имеют тестовые модели

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

мы получим грубую и пока не исчерпывающую, но уже достаточно понятную тестовую модель, — например, с вариантами пополнения баланса в рекламном кабинете ВКонтакте.

Кроме того, в проектировании тестов активно используются математические дисциплины: теория графов, комбинаторика, различные минимальные и максимальные значения. Если немного вспомнить курс матанализа в университете, можно понять, что тестовые модели — лишь одно из применений всего того, что вы уже умеете.

Плюсы и минусы тестовых моделей

Как и любой подход, MBT имеет преимущества и недостатки. Давайте рассмотрим их по порядку.

Плюсы MBT:

  • Использование тестовых моделей развивает аналитическое мышление за счет постоянного анализа (сюрприз!) тестируемой системы. Лучший способ развить этот тип мышления — применять его для решения задач, например, для создания абстрактной схемы продукта или его компонента.
  • Моделирование улучшает понимание системы как у того, кто модель создает, так и у команды, которая ревьюит и использует ее. Приятный бонус: спустя некоторое время благодаря модели можно научиться предугадывать поведение системы в тех или иных обстоятельствах.
  • Тестовую модель поддерживать легче, чем много тест-кейсов (за счет абстрактности и того, что кейсов много, а модель одна).
  • MBT позволяет взглянуть на систему (или ее часть) в целом и увидеть неочевидные зависимости.
  • Создание и поддержание тестовой модели способствует синхронизации понимания работы системы внутри команды. Это очень полезно для избегания неоднозначных ситуаций и решения спорных вопросов «на берегу» до начала разработки.
  • Благодаря математической подоплеке наличие модели позволяет автоматизировать нахождение оптимального пути, пути с задействованием всех состояний и т.д. Кроме того, тестовую модель можно использовать как основу для проектирования автотестов.
  • Несомненно, модель делает процесс адаптации новичка в проект более эффективным. «Лучше один раз увидеть, чем сто раз услышать» тут как раз работает. Кроме того, у нового члена команды могут возникнуть вопросы, которые не пришли в голову команде, или другие участники процесса разработки могут вспомнить что-то важное, презентуя модель новичку.
  • Тестирование на основе моделей прекрасно подходит для долгосрочных проектов, где большое число тест-кейсов затруднит понимание принципов работы системы, а простая и наглядная схема, наоборот, упростит его.

Минусы MBT:

  • Если в модели есть ошибка, это может привести к фундаментальному недопониманию внутри команды. Именно поэтому важен следующий пункт.
  • Желательно, чтобы в моделировании (или ревью модели) участвовала вся команда. Во-первых, это позволяет исключить недопонимания, во-вторых, активирует силу коллективного разума.
  • Как и в случае с тестовой документацией, надо не лениться, поддерживать и регулярно обновлять модель. Если на это нет времени и/или недостаточно знаний, стоит поставить под сомнение целесообразность использования тестовых моделей в проекте.
  • Иногда создание модели занимает больше времени, чем написание простого чек-листа. Особенно это актуально для больших и многокомпонентных систем: если модель начинают создавать после того, как внутри системы уже существует куча не до конца понятных зависимостей, это может стать довольно долгим (но, скорее всего, того стоящим!) процессом.
  • Использование тестовых моделей требует определенных навыков абстрактного мышления вкупе с внимательностью к мелочам. Скорее всего, если вы успешно работаете в тестировании, у вас есть все эти навыки, но нужно быть осторожными и никогда не отключать критическое мышление даже по отношению к собственным трудам.

Как начать использовать тестовые модели

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

  1. Определить наиболее удобный для восприятия (собой, командой или бизнес-оунерами) вид схемы (таблица, диаграмма, граф… ). Важно, чтобы те, для кого делается модель, легко «читали» ее — это наша основная задача;
  2. Декомпозировать систему, которую собираемся описать, на модули (руководствуясь приоритетами, функциональностью, логикой или другими критериями). Скорее всего, ваша система многокомпонентна. Не стоит пытаться описать все и сразу: начните с малого.
  3. Определить для отдельно взятого модуля возможные состояния системы, действия пользователя, переходы между состояниями, а также начальные и конечные точки взаимодействия (т.н. точку входа и точку выхода).
  4. Схематично нарисовать «золотой путь», то есть идеальный вариант взаимодействия пользователя и системы.
  5. Расширить этот путь для модуля так, чтобы помимо идеальных случаев модель включала и иные варианты: подумайте, что может пойти не так на каждом шаге.
  6. Не забудьте о влиянии каждого состояния и перехода на другие части системы. Это особенно актуально, если вы создаете не первую модель для тестируемого продукта.
  7. Решить, будете ли вы объединять модули в одну схему или хранить их по отдельности.
  8. Поделиться полученной моделью с командой. Можно презентовать, отдать на ревью или пригласить коллег на ограниченную по времени сессию мозгового штурма, чтобы дополнить то, что вы могли забыть или упустить.
  9. Поддерживать! Не забывать актуализировать и обновлять модель, — особенно когда добавляете новые компоненты, связи или даже новые модели.

Пример тестовой модели

Давайте немного отойдем от теории и рассмотрим на практике пример из книги Ли Коупленда «A Practitioner’s Guide to Software Test Design», а именно диаграмму переходов состояний как иллюстрацию рабочей тестовой модели.
Тестировать будем покупку билета — например, на концерт.

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

Иллюстрация из книги Ли Коупленда «A Practitioner’s Guide to Software Test Design»

Что мы будем делать после этого? В идеальном случае оплатим билет, а затем распечатаем и предъявим его на входе. Отразим эти действия в нашей модели.

Иллюстрация из книги Ли Коупленда «A Practitioner’s Guide to Software Test Design»

После распечатывания и предъявления на входе у билета есть точка невозврата — мы использовали его на прошедшем мероприятии. Дальше билет недействителен и не может быть как-то использован, — значит, примерно здесь наш «золотой путь» и заканчивается: обозначим конец на нашей диаграмме.

Иллюстрация из книги Ли Коупленда «A Practitioner’s Guide to Software Test Design»

Как тестировщики, мы прекрасно понимаем, что все не так просто и на каждом этапе что-то может пойти не по плану. Что будет, если пользователь отменил оплату? А если просто забыл про нее, и таймер оплаты истек, тем самым завершив сессию? Это будут 2 разных типа отмены. Добавим указанные ситуации в модель.

Иллюстрация из книги Ли Коупленда «A Practitioner’s Guide to Software Test Design»

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

Иллюстрация из книги Ли Коупленда «A Practitioner’s Guide to Software Test Design»

Та-дааааам! Наша небольшая, но

гордая

работоспособная модель готова. Двигаясь по вершинам-состояниям путем ребер-переходов, мы составляем сценарии, которые будем проверять при тестировании:

Иллюстрация из книги Ли Коупленда «A Practitioner’s Guide to Software Test Design»

Мы получили 5 рабочих кейсов и бонусом наглядное представление процесса. Совсем не трудно, правда? :)

Полезности для самостоятельного изучения

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

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

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

  • Силлабус сертификации ISTQB по направлению Model-Based Tester;
  • Lee Copeland «A Practitioner’s Guide to Software Test Design», Глава 7: State-Transition Testing — глава, описывающая одну из наиболее «дружащих» с тестовыми моделями технику тест-дизайна;
  • подборка записей про MBT в блоге;
  • исчерпывающая статья про MBT;
  • Rikard Edgren «The Little Black Book On Test Design», Using Many Models;
  • «Model-based testing essentials», Anne Kramer, Bruno Legeard, 2016;
  • Torbjrn Ryber «Essential Software Test Design», Chapter 9 «Models»;
  • удобный мейкер для диаграмм переходов состояний;
  • блог-пост про State-Transition Testing;
  • видео про Тестирование на основе моделей;
  • блог-пост про тестирование на основе моделей

Многие знают, как разработать программу; по крайней мере, каждый это делал много раз, но объяснить, как создать программу с высоким качеством, оказывается значительно труднее.

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

Подходы к улучшению качества программ

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

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

В простейшем варианте набор этапов жизненного цикла таков:

  • анализ требований;
  • проектирование (предварительное и детальное);
  • кодирование и отладка («программирование»);
  • тестирование;
  • эксплуатация и сопровождение.

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

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

В конце 80-х годов была предложена так называемая спиральная модель, был развит и проверен на практике метод итеративной и инкрементальной разработки (Iterative and Incremental Development, IID). В спиральной модели были учтены проблемы водопадной модели. Главный упор в спиральной модели делается на итеративности процесса. Описаны опыты использования IID с длиной итерации всего в полдня. Каждая итерация завершается выдачей новой версии программного обеспечения. На каждой версии уточняются (и, возможно, меняются) требования к целевой системе и принимаются меры к тому, чтобы удовлетворить и новые требования. В целом Rational Unified Process (RUP) также следует этой модели. 

Позволило ли это решить проблему качества? Лишь в некоторой степени.

Проблема повышения качества программного обеспечения в целом и повышения качества тестирования привлекает все большее внимание; в университетах вводят специальные дисциплины по тестированию и обеспечению качества, готовят узких специалистов по тестированию и инженеров по обеспечению качества. Однако по-прежнему ошибки обходятся только в США от 20 до 60 млрд. долл. ежегодно. При этом примерно 60% убытков ложится на плечи конечных пользователей. Складывается ситуация, при которой потребители вынуждены покупать заведомо бракованный товар.

Вместе с тем, ситуация не безнадежна. Исследование, проведенное Национальным институтом стандартов и технологии США, показало, что размер убытков, связанных со сбоями в программном обеспечении, можно уменьшить примерно на треть, если вложить дополнительные усилия в инфраструктуру тестирования, в частности, в разработку инструментов тестирования.

Каково же направление главного удара? Что предлагают «наилучшие практики»?

В 80-е и 90-е годы ответ на этот вопрос звучал примерно так. Наиболее дорогие ошибки совершаются на первых фазах жизненного цикла — это ошибки в определении требований, выборе архитектуры, высокоуровневом проектировании. Поэтому надо концентрироваться на поиске ошибок на всех фазах, включая самые ранние, не дожидаясь, пока они обнаружатся при тестировании уже готовой реализации. В целом тезис звучал так: «Сократить время между моментом ?внесения? ошибки и моментом ее обнаружения». Тезис в целом хорош, однако не очень конструктивен, поскольку не дает прямых рекомендаций, как сокращать это время.

В последние годы в связи с появлением методов, которые принято обозначать эпитетом agile («шустрый», «проворный») предлагаются и внедряются новые конструктивные методы раннего обнаружения ошибок. Скажем, современные модели, такие как Microsoft Solutions Framework (MSF) и eXtreme Programming (XP), выделяют следующие рекомендации к разработке тестов:

  • все необходимые тесты должны быть готовы к моменту реализации той или иной части программы; при этом обычно один тест соответствует одному требованию;
  • совокупность ранее созданных тестов должна (при неизменных требованиях) выполняться на любой версии программы;
  • если же в требования вносятся изменения, то тесты должны меняться максимально оперативно.

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

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

В новых моделях жизненного цикла тестирование как бы растворяется в других фазах разработки. Так, MSF не содержит фазы тестирования — тесты пишутся и используются всегда!

Итак, различные работы в процессе производства программ должны быть хорошо интегрированы с работами по тестированию. Соответственно, инструменты тестирования должны быть хорошо интегрированы со многими другими инструментами разработки. Из крупных производителей инструментов разработки программ, первыми это поняли компании Telelogic (набор инструментов для проектирования, моделирования, реализации и тестирования телекоммуникационного ПО, базирующийся на нотациях SDL/MSC/TTCN) и Rational Software (аналогичный набор, преимущественно базирующийся на нотации UML). Следующий шаг сделала компания IBM, начав интеграцию возможностей инструментов от Rational в среду разработки программ Eclipse.

Тезис XP — «Пиши тест перед реализацией» — хорош как лозунг, но в реальности столь же неконструктивен. Для крупных программных комплексов приходится разрабатывать тесты различного назначения: тесты модулей, интеграционные или компонентные тесты, системные тесты.

Три составляющие тестирования — экскурс в теорию

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

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

Распространение компонентных технологий породило термин «компонентное тестирование» как частный случай интеграционного тестирования.

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

Инструменты тестирования — реальная практика

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

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

Обзор инструментов тестирования будем вести в обратном порядке — от системного тестирования к модульному.

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

В данном виде тестирования широко применяются инструменты записи-воспроизведения (record/playback); из наиболее известных продуктов можно назвать Rational Robot (компания IBM/Rational), WinRunner (Mercury Interactive), QARun (Compuware). Наряду с этим существуют инструменты для текстовых терминальных интерфейсов, например, QAHiperstation компании Compuware.

Для системного нагрузочного тестирования Web-приложений и других распределенных систем широко используется инструментарий LoadRunner от Mercury Interactive; он не нацелен на генерацию изощренных сценариев тестирования, зато дает богатый материал для анализа производительности, поиска узких мест, сказывающихся на производительности распределенной системы.

Примерная общая схема использования инструментов записи-воспроизведения такова:

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

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

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

Впрочем, возможности данного вида тестирования ограничены:

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

Следующий класс инструментов — инструменты тестирования компонентов. Примером является Test Architect (IBM/Rational). Такие инструменты помогают организовать тестирование приложений, построенных по одной из компонентных технологий (например, EJB). Предусматривается набор шаблонов для создания различных компонентов тестовой программы, в частности, тестов для модулей, сценариев, заглушек.

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

Последний из рассматриваемых здесь классов инструментов — инструменты тестирования модулей. Примером может служить Test RealTime (IBM/Rational), предназначенный для тестирования модулей на C++. Важной составляющей этого инструмента является механизм проверочных «утверждений» (assertion). При помощи утверждений можно сформулировать требования к входным и выходным данным функций/методов классов в форме логических условий, в аналогичной форме можно задавать инвариантные требования к данным объектов. Это существенный шаг вперед по сравнению с Test Architect. Аппарат утверждений позволяет систематическим образом представлять функциональные требования и на базе этих требований строить критерии тестового покрытия (правда, Test RealTime автоматизированной поддержки анализа покрытия не предоставляет).

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

Решение перечисленных проблем предлагает новое поколение инструментов, которые следуют подходу тестирования на основе модели (model based testing) или на основе спецификаций (specification based testing).

Чем могут помочь модели

В голове разработчика и тестировщика всегда присутствует та или иная «модель» устройства программы, а также «модель» ее желаемого поведения, исходя из которой, в частности, составляются списки проверяемых свойств и создаются соответствующие тестовые примеры. (Заметим, что это разные модели; первые часто называют архитектурными, а вторые — функциональными или поведенческими.) Они зачастую составляются на основе документов или обсуждений в неформальном виде.

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

Новый всплеск интереса к формальным методам произошел в первой половине 90-х. Его вызвали первые результаты, полученные при использовании формальных моделей и формальных спецификаций в тестировании.

Преимущества тестирования на основе моделей виделись в том, что:

  • тесты на основе спецификации функциональных требований более эффективны, так как они в большей степени нацелены на проверку функциональности, чем тесты, построенные только на знании реализации;
  • на основе формальных спецификаций можно создавать самопроверяющие (self-checking) тесты, так как из формальных спецификаций часто можно извлечь критерии проверки результатов целевой системы.

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

Модель — некоторое отражение структуры и поведения системы. Модель может описываться в терминах состояния системы, входных воздействий на нее, конечных состояний, потоков данных и потоков управления, возвращаемых системой результатов и т.д. Для отражения разных аспектов системы применяются и различные наборы терминов. Формальная спецификация представляет собой законченное описание модели системы и требований к ее поведению в терминах того или иного формального метода. Для описания характеристик системы можно воспользоваться несколькими моделями в рамках нескольких формализмов. Обычно, чем более общей является нотация моделирования, тем больше трудностей возникает при автоматизации тестирования программы на основе модели/спецификации, описанной в этой нотации. Одни нотации и языки больше ориентированы на доступность и прозрачность описания, другие — на последующий анализ и трансляцию, в частности, трансляцию спецификации в тест. Предпринимались попытки разработки языка формальных спецификаций, удовлетворяющего требованиям промышленного использования (например, методология RAISE), однако широкого применения они не нашли.

Имеется несколько ставших уже классическими нотаций формальных спецификаций: VDM, Z, B, CCS, LOTOS и др. Некоторые из них, например, VDM, используются преимущественно для быстрого прототипирования. Язык B удобен для анализа, в частности для аналитической верификации моделей. Все эти языки активно используются в рамках университетских программ. В реальной практике для описания архитектурных моделей используется UML, а для построения поведенческих моделей — языки SDL/MSC, исполнимые диаграммы UML и близкие к ним нотации.

Перечисленные языки и нотации для поведенческих моделей, к сожалению, не обладают достаточной общностью. Они хорошо себя зарекомендовали в телекоммуникационных приложениях и практически бесполезны для описания функциональности программных систем «общего вида»: операционных систем, компиляторов, СУБД и т.д.

На роль инструментов разработки тестов для подобных систем претендует новое поколение средств описания моделей/спецификаций и средства генерации тестов на проверку согласованности поведения реализации заданной модели.

Инструменты тестирования на основе моделей

Test Real Time — один из первых представителей этой группы. Более широкие возможности предоставляет Jtest компании Parasoft. Интересен инструментарий компании Comformiq. Семейство инструментов разработки тестов на основе моделей предлагает Институт системного программирования РАН в кооперации с компанией ATS. Поскольку семейство UniTesK авторам знакомо существенно ближе, мы изложим общую схему подхода тестирования на основе моделей на примерах из UniTesK.

Рис. 1. Фазы процесса разработки спецификаций и тестов

Общая схема процесса разработки спецификаций и тестов состоит из четырех фаз (рис. 1).

Первая фаза относительно коротка, но в реальных проектах она важна. Именно здесь закладывается уровень абстрактности модели. Модель должна быть максимально простой: это позволит требовать исчерпывающего набора тестов. В то же время, модель должна быть содержательной, раскрывать специфику тестируемой реализации. Таким образом, задача первой фазы — найти компромисс между абстрактностью и детальностью.

Задача второй фазы — описание требований к поведению системы. Многие подходы (например, SDL) предлагают описывать исполнимые модели, которые можно рассматривать как прототипы будущей реализации. Задание требований в таком случае определяется формулой «реализация должна вести себя так же, как модель». Подход понятен, но, к сожалению, во многих реальных ситуациях он не работает. Допустим, в заголовке некоего сообщения, построенного моделью, указано одно время, а в аналогичном заголовке от реализации — несколько другое. Это ошибка или нет? Еще один пример. Модель системы управления памятью сгенерировала указатель на свободный участок памяти, а реальная система выдала другой указатель: модель и система работают в разных адресных пространствах. Ошибка ли это?

UniTesK — унифицированное решение

UniTesK предлагает использовать так называемые неявные спецификации или спецификации ограничений. Они задаются в виде пред- и постусловий процедур и инвариантных ограничений на типы данных. Этот механизм не позволяет описывать в модели алгоритмы вычисления ожидаемых значений функций, а только их свойства. Скажем, в случае системы управления памятью модель будет задана булевским выражением в постусловии типа «значение указателя принадлежит области свободной памяти». Простой пример постусловия для функции «корень квадратный» приведен на риc. 2; одна и та же спецификация представлена в трех разных нотациях: в стиле языков Cи, Java и C#. Использование спецификационных расширений обычных языков программирования вместо классических языков формальных спецификаций — шаг, на который идут почти все разработчики подобных инструментов. Их различает только выразительная мощность нотаций и возможности анализа и трансляции спецификаций.

Третья фаза — разработка тестового сценария. В простейшем случае сценарий можно написать вручную, но в данной группе инструментов — это плохой тон. Тест, т.е. последовательность вызовов операций целевой системы с соответствующими параметрами, можно сгенерировать, отталкиваясь от некоторого описания программы или структуры данных. Будем называть такое описание сценарием. Компания Conformiq предлагает описать конечный автомат. Различные состояния автомата соответствуют различным значениям переменных целевой системы, переходы — вызовам операций этой системы. Определить автомат — это значит для каждого состояния описать, в какое состояние мы перейдем из данного, если обратимся к любой наперед заданной операции с любыми наперед заданными параметрами. Если такое описание получить легко, больше ничего делать не понадобится: инструмент сгенерирует тест автоматически и представит результаты тестирования, например, в виде MSC-диаграмм. Но легко ли это, скажем, для программы с одной целочисленной переменной и двумя-тремя операциями? Скорее всего, да. Однако в общем случае сделать попросту невозможно.

В UniTesK для генерации тестовых последовательностей конечный автомат не описывается, а генерируется по мере исполнения теста. Все, что требуется от разработчика теста, — это задание способа вычисления состояния модели на основании состояния целевой системы и способа перебора применяемых в текущем состоянии тестовых воздействий. Эти вычисления записываются в тестовых сценариях. Очередное тестовое воздействие выбирается на основании спецификации сценария в зависимости от результатов предыдущих воздействий. Такой подход обладает двумя важными преимуществами. Во-первых, это позволяет строить сложные тестовые последовательности в чрезвычайно компактной и легкой для написания и понимания форме. Во-вторых, тесты приобретают высокую гибкость: они легко могут быть параметризованы в зависимости от текущих потребностей тестирования и даже могут автоматически подстраиваться под незначительные изменения модели. На рис. 3 приведен пример сценарного метода.

Рис. 3. Пример сценарного метода, тестирующего вставку элемента в очередь с приоритетами

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

В UniTesK используется единая архитектура тестов, подходящая для тестирования систем различной сложности, относящихся к разным предметным областям, и обеспечивающая масштабируемость тестов. Компоненты тестов, требующие написания человеком, отделены от библиотечных и генерируемых автоматически (рис. 4).

В реальных системах количество различимых состояний и количество допустимых в каждом из них тестовых воздействий очень велико, что приводит к комбинаторному «взрыву состояний». Для борьбы с этим эффектом разработан механизм факторизации модели: те состояния целевой системы, различие между которыми несущественно с точки зрения задач данного теста, объединяются в одно обобщенное состояние модели; аналогичным образом объединяются в группы и тестовые воздействия. Процесс факторизации предоставляет разработчику свободу творчества, но, вместе с тем, он поддержан строгими исследованиями, определяющими достаточные условия, при соблюдении которых гарантированы корректность результатов и существенное сокращение времени тестирования при сохранении достигаемого тестового покрытия.

Тестирование на основе моделей

Рис. 4. Архитектура тестовой программ

Рис. 5. Использование UniTesK в среде разработки Forte 4.0

Создатели UniTesK, полагая, что не должно быть отдельной среды для разработки тестов, не только наделили его возможностью мимикрии под различные языки программирования, но обеспечили интеграцию составляющих его инструментов в популярные средства разработки программ. На рис. 5 представлен сеанс использования UniTesK в среде разработки Forte 4.0 компании Sun Microsystems.

Новое качество, которое обещают новые инструменты

Как отмечалось выше, создатели инструментов тестирования обычно сталкиваются со следующими проблемами:

  • отсутствие или нечеткость определения критериев тестового покрытия, отсутствие прямой связи с функциональными требованиями;
  • отсутствие поддержки повторного использования тестов;
  • отсутствие автоматической генерации собственно теста (это касается как входных воздействий, так и эталонных результатов или автоматических анализаторов корректности реализации).

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

Критерии тестового покрытия. Основной критерий — проверка всех утверждений, в частности, утверждений, определяющих постусловия процедур или методов. Он легко проверяется и легко связывается с функциональными требованиями к целевой системе. Так, инструменты UniTesK, инструменты для платформ Java и C# предоставляют четыре уровня вложенных критериев.

Повторное использование тестов. Уровень повторного использования существенно выше, чем у традиционных инструментов. Разработчик тестов пишет не тестовый скрипт, а критерии проверки утверждения и тестовый сценарий. И то, и другое лишено многих реализационных деталей, и поэтому их проще переиспользовать для новой версии целевой системы или для адаптации спецификаций и тестов для сходного проекта. Например, статистика UniTesK показывает, что уровень переиспользования для тестирования ядер разных операционных систем превышает 50%.

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

Рассмотренные инструменты опробованы на реальных, масштабных проектах. Конечно, каждый проект несет в себе некоторую специфику, возможно, препятствующую исчерпывающему тестированию. Однако опыт использования данных инструментов показывает, что обычно удается достичь хороших результатов, лучших, чем результаты, полученные в аналогичных проектах при помощи ручного тестирования. Пользователи UniTesK, обычно, за приемлемый уровень качества принимают 70-80% покрытия кода целевой системы; при этом должен быть удовлетворен, как минимум, критерий покрытия всех логических ветвей в постусловиях. Для некоторых сложных программ (в том числе, для блока оптимизации компилятора GCC) был достигнут уровень покрытия 90-95%.

Есть ли принципиальные ограничения в применимости данного подхода? Его практически невозможно применять в случае, когда по той или иной причине никто в цепочке заказчик — разработчик — тестировщик не смог или не захотел четко сформулировать требования к целевой системе. Впрочем, это не только ограничение, но и дополнительный стимул для улучшения процессов разработки, еще один повод объяснить заказчику, что вложения в фазу проектирования с лихвой окупаются сокращением общих сроков разработки и стоимости проекта.

Литература

  1. Уокер Ройс. Управление проектами по созданию программного обеспечения. М.: Лори, 2002.
  2. Г. Майерс. Надежность программного обеспечения. М.: Мир, 1980.
  3. Элфрид Дастин, Джефф Рэшка, Джон Пол. Автоматизированное тестирование программного обеспечения. Внедрение, управление и эксплуатация. М.: Лори, 2003.
  4. Everette R. Keith. Agile Software Development Processes: A Different Approach to Software Design.

Александр Петренко, Елена Бритвина, Сергей Грошев, Александр Монахов, Ольга Петренко  ({petrenko, lena, sgroshev, monakhov, olga}@ispras.ru) — сотрудники Института системного программирования РАН (Москва).


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

Обозначения элементов общей структуры спецификации метода:

S — Сигнатура операции

A — Спецификация доступа

< — Предусловие

B — Определение ветвей функциональности

> — Постусловие

Java:
  Class SqrtSpecification {
S  Specification static double sqrt(double x)
A     reads x, epsilon
   {
<   pre { return x >= 0; }
    post {
>     if(x == 0) {
B       branch «Zero argument»;
>       return sqrt == 0;
>     } else {
B       branch «Positive argument»;
>       return sqrt >= 0 &&
>        Math.abs((sqrt*sqrt-x)/x)     }
    }
   }
  }
Си:
S specification double SQRT(double x)
A    reads (double)x, epsilon
  {
<   pre { return x >= 0.; }
    coverage ZP {
      if(x == 0) {
B        return(ZERO, «Zero argument»);
      } else {
B        return(POS, «Positive argument»);
      }
    }
    post {
>     if(coverage(ZP, ZERO)) {
>       return SQRT == 0.;
>     } else {
>       return SQRT >= 0. &&
>         abs((SQRT*SQRT — x)/x) < epsilon;
>     }
    }
  }
C#:
  namespace Examples {
   specification class SqrtSpecification {
S   specification static double Sqrt(double x)
A        reads x, epsilon
    {
<    pre { return x >= 0; }
     post {
>     if(x == 0) {
B      branch ZERO («Zero argument»);
>      return $this.Result == 0;
>     } else {
B      branch POS («Positive argument»);
>      return $this.Result >= 0 &&
>        Math.Abs( ($this.Result *
 $this.Result — x)/x) < epsilon;
>     }
>    }
>   }
   }
  }

Что такое тестовый сценарий?

Тестовый сценарий определяется как любой функции , которые могут быть проверены. Это также называется условием проверки или возможностью проверки . Как тестер, вы должны поставить себя на место конечного пользователя и выяснить реальные сценарии и варианты использования тестируемого приложения.

Что такое тестирование сценария?

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

Давайте изучим это с помощью видео ниже —

Зачем создавать тестовые сценарии?

Тестовые сценарии создаются по следующим причинам:

  • Создание тестовых сценариев обеспечивает полное покрытие тестами
  • Сценарии тестирования могут быть одобрены различными заинтересованными сторонами, такими как бизнес-аналитик, разработчики, клиенты, для обеспечения тщательного тестирования тестируемого приложения. Это гарантирует, что программное обеспечение работает для наиболее распространенных случаев использования.
  • Они служат быстрым инструментом для определения трудозатрат на тестирование и, соответственно, создают предложение для клиента или организуют рабочую силу.
  • Они помогают определить наиболее важные сквозные транзакции или реальное использование программных приложений.
  • Для изучения сквозного функционирования программы, тестовый сценарий имеет решающее значение.

Когда не создать тестовый сценарий?

Тестовые сценарии не могут быть созданы, когда

  • Тестируемое приложение является сложным, нестабильным, и в проекте есть время.
  • Проекты, которые следуют Agile методологии, такие как Scrum, Kanban, могут не создавать тестовые сценарии.
  • Сценарий тестирования не может быть создан для исправления новой ошибки или регрессионного тестирования . В таких случаях сценарии тестирования должны быть уже задокументированы в предыдущих циклах тестирования. Это особенно верно для проектов технического обслуживания.

Как написать тестовые сценарии

Как тестер, вы можете выполнить следующие пять шагов для создания тестовых сценариев:

  • Шаг 1 : Прочтите документы с требованиями, такие как BRS, SRS, FRS, тестируемой системы (SUT). Вы также можете сослаться на примеры использования, книги, руководства и т. Д. Приложения, подлежащего тестированию.
  • Шаг 2 : Для каждого требования определите возможные действия и цели пользователей. Определить технические аспекты требования. Определите возможные сценарии злоупотребления системой и оцените пользователей с менталитетом хакера.
  • Шаг 3: После прочтения Документа с требованиями и проведения надлежащего анализа перечислите различные сценарии тестирования, которые проверяют каждую функцию программного обеспечения.
  • Шаг 4: После того, как вы перечислили все возможные сценарии тестирования, создается матрица отслеживания, чтобы убедиться, что каждому требованию соответствует соответствующий сценарий тестирования.
  • Шаг 5: Созданные сценарии проверяются вашим руководителем. Позже они также рассматриваются другими заинтересованными сторонами в проекте.

Советы по созданию тестовых сценариев

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

Пример 1. Сценарий тестирования для приложения электронной коммерции

Для приложения электронной коммерции несколько тестовых сценариев

Тестовый сценарий 1: проверка функциональности входа

тестовый сценарий

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

  1. Проверьте поведение системы при вводе действительного адреса электронной почты и пароля.
  2. Проверьте поведение системы при вводе неверного идентификатора электронной почты и действительного пароля.
  3. Проверьте поведение системы при вводе действительного адреса электронной почты и неверного пароля.
  4. Проверьте поведение системы при вводе неверного идентификатора электронной почты и неверного пароля.
  5. Проверьте поведение системы, если адрес электронной почты и пароль оставлены пустыми и введен вход.
  6. Проверить Забыли пароль работает как положено
  7. Проверьте поведение системы при вводе действительного / недействительного номера телефона и пароля.
  8. Проверять поведение системы, когда установлен флажок «Держать меня в подписи»

Как видно, тестовые случаи являются более конкретными.

Тестовый сценарий 2. Проверка функциональности поиска

тестовый сценарий

Тестовый сценарий 3: проверьте страницу описания продукта

тестовый сценарий

Сценарий тестирования 4: Проверьте функциональность платежей

тестовый сценарий

Тестовый сценарий 5: проверка истории заказов

тестовый сценарий

Помимо этих 5 сценариев, здесь приведен список всех других сценариев.

  • Проверьте поведение домашней страницы для постоянных клиентов
  • Проверьте категорию / страницы продукта
  • Проверьте службу поддержки / контактные страницы
  • Проверьте страницы ежедневных предложений

Пример 2: Тестовые сценарии для банковского сайта

Тестовый сценарий 1 : Проверьте функциональность входа и аутентификации

Тестовый сценарий 2 : Проверить перевод денег можно

Тестовый сценарий 3. Проверьте выписку со счета.

Тестовый сценарий 4 : Проверка фиксированного депозита / периодического депозита может быть создана

И так далее…

Шаблон сценария тестирования

Скачать шаблон тестового сценария Excel (.xlsx)

Application testing is a critical activity for any apps. Various approaches
for testing apps have been developed over the last decade to ensure that we are providing high-quality applications that meet all of the customer’s
needs.

Model-based testing (MBT) is a hot issue in the world of test automation
that involves creating test cases from models of the applications being
tested

Various approaches based on model-based testing are now available. We’ll show you two approaches for model-based testing that use genetic algorithms. The use of genetic algorithms for model-based testing is a hot issue, and there are several papers and comparisons of existing techniques.

What is Model-Based Testing, and how does it work?

Model-based testing is a software testing approach in which the run-time
behavior of the product under test is compared to model predictions. A
model is a representation of how a system behaves. Input sequences, actions, conditions, output, and data flow from input to output can all be used to define behavior. It should be comprehensible and reusable; shareable must provide a detailed description of the system under test.

There are a variety of models available that describe various elements of
system behavior.

The following are some examples of the model −

  • Data Flow

  • Control Flow

  • Dependency Graphs

  • Decision Tables

  • State transition machines

Model-Based Testing explains how a system responds to an activity (determined by a model). Provide the action and watch to see if the system replies as expected.

It is a simple formal approach for validating a system. This testing may
be used for both hardware and software.

The basic MBT procedure consists of five key steps −

  • Modeling

  • Test planning

  • Test design

  • Test generation

  • Test execution

Modeling

Modeling is the process of describing the system’s needs. The test generator will be based on this description.

The predicted output of the tested system must also be included in the
model. The Design Model and the Test Model are quite essential at this stage.

Some key criteria should be taken into account while choosing a model: In most situations, the model is converted into a state transition system or a finite state machine system. The finite state machine system is a representation of the system’s potential configurations.

The system is searched for executable paths in order to find test cases. A
plausible execution route will be used to generate the test case. If the model is deterministic or can be converted into a deterministic model, this approach can be utilized.

Test Planning

Test planning includes defining test selection criteria and metrics. This
provides for the formal formulation of test case specifications, as well as
directing the mapping of feasible test suites, among other things.

Test Design

Test Design refers to the formalization of test cases using the preceding
test selection criteria.

Test Generation

This entails creating as many tests as feasible.

OFFLINE

  • Algorithms for searching

  • The format of tests is predetermined.

ONLINE

  • Algorithms for walking or light-seeking

  • Following the execution of the previous step and receipt of the
    output value, the next step is determined.

  • Algorithms must be quick.

Test Execution

Run the tests and look for discrepancies between the current and expected output.

Evolutionary Algorithms

Selection, reproduction, and mutation are all ideas used in evolutionary
algorithms.

We’ll go through three different sorts of evolutionary algorithms here −

  • Genetic algorithms

  • Evolutionary programming

  • Evolutionary strategies

Algorithms Based on Genetic Information (GA)

Evolutionary computation includes genetic algorithms. Artificial intelligence includes evolutionary computation.

Genetic algorithms are based on Darwin’s theory of evolution. The answer to a problem solved by genetic algorithms can also be said to have evolved.

We use four key concepts from natural selection in our genetic algorithms: gene, chromosome (individual), population, and natural selection.

The natural selection consists of the following steps −

  • The population’s fittest people will be chosen.

  • Individuals will have children who will inherit the qualities of their
    parents.

  • The offspring will be included in the upcoming generation.

  • Offspring of fitter parents will outperform their parents and have a
    higher chance of survival.

This is an iterative process that will result in a generation of the fittest
individuals.

The easiest approach to describe Genetic algorithms is to imagine that
we have a problem to solve and that we may examine a collection of solutions to that problem. We will have to use evolution theory and natural selection to discover the optimum answer to the situation.

The following terms are used in Genetic Algorithms −

  • Initial population − The problem begins with a collection of potential solutions (individuals) for the situation at hand. The population is made up of a certain number of people. Each person is a potential solution to the problem we’re trying to address. A collection of parameters shapes an individual (variables). These characteristics are referred to as genes. A Chromosome (solution/individual) is formed by the joining of genes into a string. Binary values (a string of 1s and 0s) are commonly employed to encode genes in chromosomes.

  • Fitness function − Determines an individual’s capacity to compete with other persons. Based on the fitness function, we will compute a fitness score for each person (chromosome/solution). The fitness score determines the likelihood that an individual will be picked for reproduction.

  • Selection − The fittest people will be chosen and their genes will be passed down to the next generation. How does it function? Based on their fitness scores, the algorithm will choose two pairs of individuals (parents). Individuals with high levels of fitness will be chosen for reproduction. There are many selection algorithms.

  • Crossover (Recombination) − This is the most important stage of a genetic algorithm. The crossover comes in a variety of forms. In general, a crossover point is chosen at random from within the genes for each pair of parents to be mated in order to produce new children and insert them into the population. As a result, the two parents will have two children.

  • Mutation − This is a genetic operator that is applied with a low random frequency to a portion of the new offspring produced. This means that the amount of bits in the bit string is frequently swapped.

  • Termination − If the population does not generate children that are considerably different from the previous generation, the algorithm will end. We can now state that the genetic algorithm has generated a set of solutions to our problem.

Model-Based Testing and Genetic Algorithm

Understanding how genetic algorithms may be applied to model-based
testing is the most essential portion of this article. Let’s look at two
model-based testing uses of genetic algorithms.

We are now using all of the terminologies from genetic algorithms and
demonstrating how they are utilized in various model-based testing
applications of GA.

Using GA To Create Test Data From A UML State Diagram Model based testing may generate test cases and executable test scripts from a UML (Unified Modelling Language) model representation of the tested application. Using the Unified Modelling Language (UML) state chart diagram, genetic algorithms may be utilized to produce test data.

Keep the following terms in mind while using the UML state chart
diagram −

  • State diagrams (state chart diagrams) are used to represent any
    complicated feature or to describe the dynamic behavior of a complete system, a subsystem, or even a single item inside a system.

  • Before coding, model-based testing is used to extract test cases from a UML state chart diagram. As a result, we can create a test suit for any program specification. Specifications are frequently presented in the form of UML diagrams or formal language specifications.

  • A trigger, similar to an event, starts a transition from one state to
    another.

  • A guard condition is a Boolean condition that must be met before a
    transition may take place.

  • The action (activity) that occurs when a transition occurs is
    referred to as an impact.

As previously stated, in order to use a genetic algorithm, we must first
establish the original population of people (chromosome). This initial
population will be a collection of solutions to our challenge.

Model-Based Testing Challenges −

  • Deploying MBT in any company obviously necessitates a significant amount of money and work.

  • The learning curve will be longer and the model will be more
    difficult to comprehend.

Benefits of Model Testing −

MBT has the following advantages −

  • Simple test case/suite upkeep

  • Cost savings improved test coverage

  • Can perform various tests on an n number of computers

  • Defect identification at an early stage

  • Increase in the number of defects

  • Savings in time

  • increased work satisfaction among testers

Conclusion

During testing, testers create mental models anyhow. These mental
models can be translated to paper models. This aids readability and reusability for testers.

Model-based testing is a relatively recent method of software testing.
The following diagram depicts the evolution of software testing −

Application testing is a critical activity for any apps. Various approaches
for testing apps have been developed over the last decade to ensure that we are providing high-quality applications that meet all of the customer’s
needs.

Model-based testing (MBT) is a hot issue in the world of test automation
that involves creating test cases from models of the applications being
tested

Various approaches based on model-based testing are now available. We’ll show you two approaches for model-based testing that use genetic algorithms. The use of genetic algorithms for model-based testing is a hot issue, and there are several papers and comparisons of existing techniques.

What is Model-Based Testing, and how does it work?

Model-based testing is a software testing approach in which the run-time
behavior of the product under test is compared to model predictions. A
model is a representation of how a system behaves. Input sequences, actions, conditions, output, and data flow from input to output can all be used to define behavior. It should be comprehensible and reusable; shareable must provide a detailed description of the system under test.

There are a variety of models available that describe various elements of
system behavior.

The following are some examples of the model −

  • Data Flow

  • Control Flow

  • Dependency Graphs

  • Decision Tables

  • State transition machines

Model-Based Testing explains how a system responds to an activity (determined by a model). Provide the action and watch to see if the system replies as expected.

It is a simple formal approach for validating a system. This testing may
be used for both hardware and software.

The basic MBT procedure consists of five key steps −

  • Modeling

  • Test planning

  • Test design

  • Test generation

  • Test execution

Modeling

Modeling is the process of describing the system’s needs. The test generator will be based on this description.

The predicted output of the tested system must also be included in the
model. The Design Model and the Test Model are quite essential at this stage.

Some key criteria should be taken into account while choosing a model: In most situations, the model is converted into a state transition system or a finite state machine system. The finite state machine system is a representation of the system’s potential configurations.

The system is searched for executable paths in order to find test cases. A
plausible execution route will be used to generate the test case. If the model is deterministic or can be converted into a deterministic model, this approach can be utilized.

Test Planning

Test planning includes defining test selection criteria and metrics. This
provides for the formal formulation of test case specifications, as well as
directing the mapping of feasible test suites, among other things.

Test Design

Test Design refers to the formalization of test cases using the preceding
test selection criteria.

Test Generation

This entails creating as many tests as feasible.

OFFLINE

  • Algorithms for searching

  • The format of tests is predetermined.

ONLINE

  • Algorithms for walking or light-seeking

  • Following the execution of the previous step and receipt of the
    output value, the next step is determined.

  • Algorithms must be quick.

Test Execution

Run the tests and look for discrepancies between the current and expected output.

Evolutionary Algorithms

Selection, reproduction, and mutation are all ideas used in evolutionary
algorithms.

We’ll go through three different sorts of evolutionary algorithms here −

  • Genetic algorithms

  • Evolutionary programming

  • Evolutionary strategies

Algorithms Based on Genetic Information (GA)

Evolutionary computation includes genetic algorithms. Artificial intelligence includes evolutionary computation.

Genetic algorithms are based on Darwin’s theory of evolution. The answer to a problem solved by genetic algorithms can also be said to have evolved.

We use four key concepts from natural selection in our genetic algorithms: gene, chromosome (individual), population, and natural selection.

The natural selection consists of the following steps −

  • The population’s fittest people will be chosen.

  • Individuals will have children who will inherit the qualities of their
    parents.

  • The offspring will be included in the upcoming generation.

  • Offspring of fitter parents will outperform their parents and have a
    higher chance of survival.

This is an iterative process that will result in a generation of the fittest
individuals.

The easiest approach to describe Genetic algorithms is to imagine that
we have a problem to solve and that we may examine a collection of solutions to that problem. We will have to use evolution theory and natural selection to discover the optimum answer to the situation.

The following terms are used in Genetic Algorithms −

  • Initial population − The problem begins with a collection of potential solutions (individuals) for the situation at hand. The population is made up of a certain number of people. Each person is a potential solution to the problem we’re trying to address. A collection of parameters shapes an individual (variables). These characteristics are referred to as genes. A Chromosome (solution/individual) is formed by the joining of genes into a string. Binary values (a string of 1s and 0s) are commonly employed to encode genes in chromosomes.

  • Fitness function − Determines an individual’s capacity to compete with other persons. Based on the fitness function, we will compute a fitness score for each person (chromosome/solution). The fitness score determines the likelihood that an individual will be picked for reproduction.

  • Selection − The fittest people will be chosen and their genes will be passed down to the next generation. How does it function? Based on their fitness scores, the algorithm will choose two pairs of individuals (parents). Individuals with high levels of fitness will be chosen for reproduction. There are many selection algorithms.

  • Crossover (Recombination) − This is the most important stage of a genetic algorithm. The crossover comes in a variety of forms. In general, a crossover point is chosen at random from within the genes for each pair of parents to be mated in order to produce new children and insert them into the population. As a result, the two parents will have two children.

  • Mutation − This is a genetic operator that is applied with a low random frequency to a portion of the new offspring produced. This means that the amount of bits in the bit string is frequently swapped.

  • Termination − If the population does not generate children that are considerably different from the previous generation, the algorithm will end. We can now state that the genetic algorithm has generated a set of solutions to our problem.

Model-Based Testing and Genetic Algorithm

Understanding how genetic algorithms may be applied to model-based
testing is the most essential portion of this article. Let’s look at two
model-based testing uses of genetic algorithms.

We are now using all of the terminologies from genetic algorithms and
demonstrating how they are utilized in various model-based testing
applications of GA.

Using GA To Create Test Data From A UML State Diagram Model based testing may generate test cases and executable test scripts from a UML (Unified Modelling Language) model representation of the tested application. Using the Unified Modelling Language (UML) state chart diagram, genetic algorithms may be utilized to produce test data.

Keep the following terms in mind while using the UML state chart
diagram −

  • State diagrams (state chart diagrams) are used to represent any
    complicated feature or to describe the dynamic behavior of a complete system, a subsystem, or even a single item inside a system.

  • Before coding, model-based testing is used to extract test cases from a UML state chart diagram. As a result, we can create a test suit for any program specification. Specifications are frequently presented in the form of UML diagrams or formal language specifications.

  • A trigger, similar to an event, starts a transition from one state to
    another.

  • A guard condition is a Boolean condition that must be met before a
    transition may take place.

  • The action (activity) that occurs when a transition occurs is
    referred to as an impact.

As previously stated, in order to use a genetic algorithm, we must first
establish the original population of people (chromosome). This initial
population will be a collection of solutions to our challenge.

Model-Based Testing Challenges −

  • Deploying MBT in any company obviously necessitates a significant amount of money and work.

  • The learning curve will be longer and the model will be more
    difficult to comprehend.

Benefits of Model Testing −

MBT has the following advantages −

  • Simple test case/suite upkeep

  • Cost savings improved test coverage

  • Can perform various tests on an n number of computers

  • Defect identification at an early stage

  • Increase in the number of defects

  • Savings in time

  • increased work satisfaction among testers

Conclusion

During testing, testers create mental models anyhow. These mental
models can be translated to paper models. This aids readability and reusability for testers.

Model-based testing is a relatively recent method of software testing.
The following diagram depicts the evolution of software testing −


Картинка с unsplash.com

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

Принято считать, что тестирование следует после разработки ПО. В каком-то смысле это правда: нельзя проверить работающий продукт, пока он не готов. Однако в эпоху гибких методологий только ленивый не слышал про так называемый принцип «смещения влево», или shift left — включение специалиста по тестированию в процесс разработки продукта как можно раньше.
Как это возможно?

Пара слов обо мне: меня зовут Настя Заречнева, и я обеспечиваю качество рекламы ВКонтакте. Раньше я работала в аутсорсе на самых разных проектах, выполняя роли от тест-аналитика до руководителя команды QA, поэтому не понаслышке знаю, что начинать тестирование заранее — классный способ сэкономить себе время и нервы в будущем.

Содержание

  • Предисловие
  • Что такое тестовые модели
  • Какое отношение к математике имеют тестовые модели
  • Плюсы и минусы тестовых моделей
  • Как начать использовать тестовые модели
  • Пример тестовой модели
  • Полезности для самостоятельного изучения

Предисловие

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

Как тестировщик может помочь в этом случае? В ситуации, когда есть макеты или спецификация, все становится проще: можно использовать готовый нарисованный интерфейс для составления тестовой документации и продумывания неочевидных, но реальных кейсов.

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

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

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

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

Тестирование на основе моделей (Model-Based Testing, далее MBT) — одна из техник тестирования черного ящика. В непрерывной разработке (и, как правило, частых поставках) большого продукта ошибка может стоить дорого, и именно потому, что MBT — один из проверенных и эффективных способов предотвратить ее как можно раньше, мне захотелось собрать и представить вам информацию о нем.

Что такое тестовые модели

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

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

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

Какое отношение к математике имеют тестовые модели

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

мы получим грубую и пока не исчерпывающую, но уже достаточно понятную тестовую модель, — например, с вариантами пополнения баланса в рекламном кабинете ВКонтакте.

Кроме того, в проектировании тестов активно используются математические дисциплины: теория графов, комбинаторика, различные минимальные и максимальные значения. Если немного вспомнить курс матанализа в университете, можно понять, что тестовые модели — лишь одно из применений всего того, что вы уже умеете.

Плюсы и минусы тестовых моделей

Как и любой подход, MBT имеет преимущества и недостатки. Давайте рассмотрим их по порядку.

Плюсы MBT:

  • Использование тестовых моделей развивает аналитическое мышление за счет постоянного анализа (сюрприз!) тестируемой системы. Лучший способ развить этот тип мышления — применять его для решения задач, например, для создания абстрактной схемы продукта или его компонента.
  • Моделирование улучшает понимание системы как у того, кто модель создает, так и у команды, которая ревьюит и использует ее. Приятный бонус: спустя некоторое время благодаря модели можно научиться предугадывать поведение системы в тех или иных обстоятельствах.
  • Тестовую модель поддерживать легче, чем много тест-кейсов (за счет абстрактности и того, что кейсов много, а модель одна).
  • MBT позволяет взглянуть на систему (или ее часть) в целом и увидеть неочевидные зависимости.
  • Создание и поддержание тестовой модели способствует синхронизации понимания работы системы внутри команды. Это очень полезно для избегания неоднозначных ситуаций и решения спорных вопросов «на берегу» до начала разработки.
  • Благодаря математической подоплеке наличие модели позволяет автоматизировать нахождение оптимального пути, пути с задействованием всех состояний и т.д. Кроме того, тестовую модель можно использовать как основу для проектирования автотестов.
  • Несомненно, модель делает процесс адаптации новичка в проект более эффективным. «Лучше один раз увидеть, чем сто раз услышать» тут как раз работает. Кроме того, у нового члена команды могут возникнуть вопросы, которые не пришли в голову команде, или другие участники процесса разработки могут вспомнить что-то важное, презентуя модель новичку.
  • Тестирование на основе моделей прекрасно подходит для долгосрочных проектов, где большое число тест-кейсов затруднит понимание принципов работы системы, а простая и наглядная схема, наоборот, упростит его.

Минусы MBT:

  • Если в модели есть ошибка, это может привести к фундаментальному недопониманию внутри команды. Именно поэтому важен следующий пункт.
  • Желательно, чтобы в моделировании (или ревью модели) участвовала вся команда. Во-первых, это позволяет исключить недопонимания, во-вторых, активирует силу коллективного разума.
  • Как и в случае с тестовой документацией, надо не лениться, поддерживать и регулярно обновлять модель. Если на это нет времени и/или недостаточно знаний, стоит поставить под сомнение целесообразность использования тестовых моделей в проекте.
  • Иногда создание модели занимает больше времени, чем написание простого чек-листа. Особенно это актуально для больших и многокомпонентных систем: если модель начинают создавать после того, как внутри системы уже существует куча не до конца понятных зависимостей, это может стать довольно долгим (но, скорее всего, того стоящим!) процессом.
  • Использование тестовых моделей требует определенных навыков абстрактного мышления вкупе с внимательностью к мелочам. Скорее всего, если вы успешно работаете в тестировании, у вас есть все эти навыки, но нужно быть осторожными и никогда не отключать критическое мышление даже по отношению к собственным трудам.

Как начать использовать тестовые модели

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

  1. Определить наиболее удобный для восприятия (собой, командой или бизнес-оунерами) вид схемы (таблица, диаграмма, граф… ). Важно, чтобы те, для кого делается модель, легко «читали» ее — это наша основная задача;
  2. Декомпозировать систему, которую собираемся описать, на модули (руководствуясь приоритетами, функциональностью, логикой или другими критериями). Скорее всего, ваша система многокомпонентна. Не стоит пытаться описать все и сразу: начните с малого.
  3. Определить для отдельно взятого модуля возможные состояния системы, действия пользователя, переходы между состояниями, а также начальные и конечные точки взаимодействия (т.н. точку входа и точку выхода).
  4. Схематично нарисовать «золотой путь», то есть идеальный вариант взаимодействия пользователя и системы.
  5. Расширить этот путь для модуля так, чтобы помимо идеальных случаев модель включала и иные варианты: подумайте, что может пойти не так на каждом шаге.
  6. Не забудьте о влиянии каждого состояния и перехода на другие части системы. Это особенно актуально, если вы создаете не первую модель для тестируемого продукта.
  7. Решить, будете ли вы объединять модули в одну схему или хранить их по отдельности.
  8. Поделиться полученной моделью с командой. Можно презентовать, отдать на ревью или пригласить коллег на ограниченную по времени сессию мозгового штурма, чтобы дополнить то, что вы могли забыть или упустить.
  9. Поддерживать! Не забывать актуализировать и обновлять модель, — особенно когда добавляете новые компоненты, связи или даже новые модели.

Пример тестовой модели

Давайте немного отойдем от теории и рассмотрим на практике пример из книги Ли Коупленда «A Practitioner’s Guide to Software Test Design», а именно диаграмму переходов состояний как иллюстрацию рабочей тестовой модели.
Тестировать будем покупку билета — например, на концерт.

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

Иллюстрация из книги Ли Коупленда «A Practitioner’s Guide to Software Test Design»

Что мы будем делать после этого? В идеальном случае оплатим билет, а затем распечатаем и предъявим его на входе. Отразим эти действия в нашей модели.

Иллюстрация из книги Ли Коупленда «A Practitioner’s Guide to Software Test Design»

После распечатывания и предъявления на входе у билета есть точка невозврата — мы использовали его на прошедшем мероприятии. Дальше билет недействителен и не может быть как-то использован, — значит, примерно здесь наш «золотой путь» и заканчивается: обозначим конец на нашей диаграмме.

Иллюстрация из книги Ли Коупленда «A Practitioner’s Guide to Software Test Design»

Как тестировщики, мы прекрасно понимаем, что все не так просто и на каждом этапе что-то может пойти не по плану. Что будет, если пользователь отменил оплату? А если просто забыл про нее, и таймер оплаты истек, тем самым завершив сессию? Это будут 2 разных типа отмены. Добавим указанные ситуации в модель.

Иллюстрация из книги Ли Коупленда «A Practitioner’s Guide to Software Test Design»

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

Иллюстрация из книги Ли Коупленда «A Practitioner’s Guide to Software Test Design»

Та-дааааам! Наша небольшая, но

гордая

работоспособная модель готова. Двигаясь по вершинам-состояниям путем ребер-переходов, мы составляем сценарии, которые будем проверять при тестировании:

Иллюстрация из книги Ли Коупленда «A Practitioner’s Guide to Software Test Design»

Мы получили 5 рабочих кейсов и бонусом наглядное представление процесса. Совсем не трудно, правда? :)

Полезности для самостоятельного изучения

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

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

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

  • Силлабус сертификации ISTQB по направлению Model-Based Tester;
  • Lee Copeland «A Practitioner’s Guide to Software Test Design», Глава 7: State-Transition Testing — глава, описывающая одну из наиболее «дружащих» с тестовыми моделями технику тест-дизайна;
  • подборка записей про MBT в блоге;
  • исчерпывающая статья про MBT;
  • Rikard Edgren «The Little Black Book On Test Design», Using Many Models;
  • «Model-based testing essentials», Anne Kramer, Bruno Legeard, 2016;
  • Torbjrn Ryber «Essential Software Test Design», Chapter 9 «Models»;
  • удобный мейкер для диаграмм переходов состояний;
  • блог-пост про State-Transition Testing;
  • видео про Тестирование на основе моделей;
  • блог-пост про тестирование на основе моделей

2.1 Модели разработки ПО

Тестирование не является изолированным процессом, работы по тестированию связаны с другими работами по разработке ПО. Различные модели разработки ПО требуют различных подходов к тестированию.

2.1.1 V-модель (Последовательная модель разработки)

Хотя разновидностей V- модели существует много, все они используют четыре уровня тестирования, соответствующие четырем уровням разработки.

Четыре уровня, используемые в данном пособии, это:

  • Компонентное (модульное) тестирование
  • Интеграционное тестирование
  • Системное тестирование
  • Приемочное тестирование

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

Артефакты программной разработки (такие как бизнес-сценарии или сценарии использования, технические требования, документы по дизайну и код) создающиеся во время процесса разработки часто используются для одного и более уровней тестирования. Ссылки на оригинальные рабочие артефакты можно найти в «Интегрированной модели зрелости процессов производства ПО» (CMMI) и «Жизненном цикле программного обеспечения» (IEEE/IEC 12207).

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

2.1.2 Итеративно-инкрементные модели разработки

Итеративно-инкрементный процесс разработки – это процесс, основывающийся на требованиях, дизайне, сборке и тестировании системы, созданной в результате серии коротких циклов разработки.

Примеры: прототипирование, быстрая разработка приложений (RAD), Rational Unified Process (RUP) и гибкие (agile) методологии разработки. Система, получаемая в результате итерации, может быть протестирована на нескольких уровнях в процессе разработки каждой итерации. Доработка, добавляемая к разработанному ранее, провоцирует расширение системы, которое также должно быть протестировано. Регрессионное тестирование становится все более и более важным от итерации к итерации.

Верификация и валидация могут выполняться на каждом этапе доработки системы.

2.1.3 Тестирование в модели жизненного цикла ПО

В любой модели ЖЦ ПО имеется несколько характеристик качественного
тестирования:

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

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

Вопросы

Когда имеешь дело с моделями разработки программного обеспечения, что важно сделать?
  • Начать с V-модели, а затем перейти к итеративной либо к инкрементальной модели.
  • Если нужно, адаптировать модели к характеристикам проекта и продукта.
  • Выбрать водопадную модель, потому что это самая проверенная модель.
  • Изменить организацию, чтобы соответствовать модели, но не наоборот
Что из перечисленного ниже является характеристикой хорошего тестирования в любой модели жизненного цикла?
  • Проектирование тестов может начаться только после завершения разработки.
  • Тестировщики должны начинать рецензирование документов, как только будут доступны их черновики.
  • Мероприятий по тестированию должно быть больше, чем мероприятий по разработке.
  • Каждый уровень тестирования имеет одинаковую цель тестирования.
Что из приведенного ниже относится к моделям разработки программного обеспечения?
  • Для любой модели разработки программного обеспечения должно быть не менее четырех уровней тестирования.
  • В V-модели всегда есть четыре тестовых уровня.
  • В гибких моделях разработки количество уровней тестирования для итерации может варьироваться в зависимости от проекта.
  • В проекте c Быстрой Разработкой Приложений (RAD) существует четыре уровня тестирования для каждой итерации.
Какой вариант ЛУЧШЕ всего описывает цели для уровней тестирования в модели жизненного цикла?
  • Цели одинаковы для каждого уровня тестирования
  • Цели должны быть общими для любого уровня тестирования
  • Каждый уровень тестирования имеет цели, специфичные для этого уровня
  • Каждый уровень теста должен иметь разные цели
Что из перечисленного верно для моделей разработки программного обеспечения?

a. Тестирование интеграции компонентов присутствует во всех хороших моделях разработки.
b. Приемочное тестирование может проводиться до начала системного тестирования.
c. Приемочное тестирование должно начаться только после завершения системного тестирования.
d. В V-модели может быть менее четырех тестовых уровней.

  • b, c
  • c, d
  • b, d
  • a, b

2.2 Уровни тестирования

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

Введение

Для каждого уровня тестирования может быть определено: цели, артефакты процесса разработки, на основании которых будут разработаны тестовые сценарии, объекты тестирования, типичные дефекты и отказы, которые могут быть найдены во время тестирования, требования к тестовой обвязке, инструментарий и ответственность участников.
Конфигурационные данные для тестирования системы нужно рассматривать во время планирования тестирования, если такие данные необходимы.

2.2.1 Компонентное тестирование

Базис тестирования:

  • Требования к компонентам
  • Детальный дизайн
  • Код

Типичные объекты тестирования:

  • Компоненты
  • Программы
  • Программы конвертации и миграции данных
  • Модули БД

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

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

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

2.2.2 Интеграционное тестирование

Базис тестирования:

  • Проект системы
  • Архитектура
  • Бизнес-процессы
  • Сценарии использования

Типичные объекты тестирования:

  • БД подсистем
  • Инфраструктура
  • Интерфейсы

Конфигурация системы

  • Конфигурационные данные

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

Интеграционное тестирование может состоять из одного или более уровней и может быть выполнено на тестовых объектах разного размера следующим образом:

  1. Компонентное интеграционное тестирование проверяет взаимодействие между программными компонентами и производится после компонентного тестирования
  2. Системное интеграционное тестирование проверяет взаимодействие между системами или между аппаратным обеспечением и может быть выполнено после системного тестирования. В этом случае, разработчики могут управлять только одной стороной интерфейса. Однако, это может рассматриваться как риск. Бизнес-процессы могут включать последовательность систем; могут быть важны кроссплатформенные различия.

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

Стратегии системного интеграционного тестирования могут основываться на архитектуре системы (такой как нисходящая или восходящая), функциональных задачах, последовательности обработки транзакций или других аспектах системы и ее компонентов. Для того, чтобы упростить процесс изоляции отказа и как можно раньше обнаруживать дефекты, интеграция должна проводиться по возрастающей, а не происходить по сценарию «большого взрыва».

Тестирование специфичных нефункциональных характеристик ( например, производительности), может быть включено в интеграционное тестирование, наравне с функциональным. На каждой стадии интеграции тестировщики концентрируют все внимание именно на интеграции как таковой. Например, если интегрируется модуль А с модулем В, они проверяют взаимодействие модулей, а не функциональность каждого из них, т.к. она должна быть проверена во время компонентного тестирования. Для тестирования могут использоваться как функциональный, так и структурный подходы.

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

2.2.3 Системное тестирование

Базис тестирования:

  • Система и спецификация требований к программному обеспечению
  • Сценарии использования
  • Функциональная спецификация
  • Отчеты об анализе степени риска

Типичные объекты тестирования:

  • Руководство по эксплуатации системы
  • Конфигурация системы

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

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

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

Системное тестирование чаще всего выполняет независимая тестовая команда.

2.2.4 Приемочное тестирование

Базис тестирования:

  • Пользовательские требования
  • Системные требования
  • Сценарии использования
  • Бизнес процессы
  • Отчеты об анализе степени риска

Типичные объекты тестирования:

  • Бизнес-процессы на полностью интегрированной системе
  • Процессы эксплуатации и обслуживания
  • Процедуры использования
  • Формы
  • Отчеты

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

Основная цель приемочного тестирования — проверка работоспособности системы, частей системы или отдельных нефункциональных характеристик системы. Поиск дефектов не является главной целью приемочного тестирования.

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

Приемочное тестирование может проводиться в различные моменты ЖЦ разработки, например:

  • Для коробочного продукта приемочное тестирование можно провести при установке или интеграции
  • Приемочное тестирование удобства использования компонента можно провести во время компонентного тестирования
  • Приемочное тестирование новой функциональности можно проводить до системного тестирования

Типичные виды приемочного тестирования:

Пользовательское приемочное тестирование
Обычно проверяет готовность системы для использования в бизнесе.

Эксплуатационное (приемочное, операциональное) тестирование:
Приемочное тестирование, проводимое системными администраторами, включает:

  • Тестирование резервного копирования восстановления
  • Восстановление после сбоев
  • Управление пользователями
  • Задачи сопровождения
  • Задачи загрузки и миграции данных
  • Периодическая проверка уязвимостей системы

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

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

Вопросы:

Что из следующих характеристик является характеристикой хорошего тестирования и применимо к любой модели жизненного цикла разработки программного обеспечения?
  • Все уровни тестирования планируются и выполняются для каждой разрабатываемой функции.
  • Для каждой активности разработки существует соответствующая тестовая активность.
  • Тестировщики вовлекаются в работу, как только первый кусок кода может быть выполнен.
  • Приемочное тестирование всегда является финальным уровнем тестирования, которое проводится.
Какое из следующих утверждений, сравнивающих компонентное и системное тестирование, ВЕРНО?
  • Компонентное тестирование является ответственностью тестировщиков, в то время как за системное тестирование обычно отвечают пользователи системы.
  • Компонентное тестирование фокусируется только на функциональных характеристиках, в то время как системное тестирование фокусируется на функциональных и нефункциональных характеристиках.
  • Компонентное тестирование проверяет функциональность программных модулей, программных объектов и классов, которые могут быть проверены отдельно, в то время как системное тестирование проверяет интерфейсы между компонентами и взаимодействие между различными частями системы.
  • Тестовые сценарии для компонентного тестирования, как правило, получают на основании спецификации компонентов, спецификаций проектирования или моделей данных, в то время как тестовые сценарии для системного тестирования, как правило, получают на основании спецификации требований, функциональных спецификаций или сценариев использования.
Какое приемочное тестирование обычно выполняется системными администраторами?
  • Контрактное
  • Нормативное
  • Клиентское
  • Операциональное

2.3 Типы тестирования

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

Введение

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

Типы тестирования определяются целями тестирования, которые могут быть следующими:

  • Функция, выполняемая программой
  • Нефункциональная характеристика качества, такая как надежность или удобство использования
  • Структура или архитектура программы или системы

Подтверждение изменений, т.е. подтверждение, что дефект был исправлен (подтверждающее тестирование) и поиск непреднамеренных изменений (регрессионное тестирование)

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

2.3.1 Тестирование функций (Функциональное тестирование)

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

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

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

2.3.2 Тестирование нефункциональных характеристик (Нефункциональное тестирование)

Нефункциональное тестирование включает, но не ограничивается, нагрузочное тестирование, тестирование производительности, стресс-тестирование, тестирование удобства использования, тестирование восстановления, тестирование надежности и тестирование переносимости. Это тестирование того, «как» система работает.

Нефункциональное тестирование может выполняться на всех уровнях тестирования. Термин нефункциональное тестирование описывает тесты, необходимые для оценки характеристик систем и программ, которые могут быть количественно измерены, такие как время отклика при тестировании производительности. Эти тесты могут ссылаться на модели качества, такие как «Разработка программного обеспечения – Качество программного продукта» (ISO 9126).

Нефункциональное тестирование рассматривает внешнее поведение программного обеспечения и в большинстве случаев использует разработку тестов методом черного ящика.

2.3.3 Тестирование структуры/архитектуры программного обеспечения (Структурное тестирование)

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

Покрытие – это часть структуры программы, которая была охвачена тестированием, выраженная в процентах. Если покрытие не равно 100%, то необходимо разрабатывать дополнительные тесты для покрытия пропущенных участков программы. Методики покрытия описаны в модуле 4.

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

Методы структурного тестирования могут быть применены на системном, системном интеграционном и приемочном уровнях (например, применены к бизнес-моделям или структурам меню).

2.3.4 Тестирование изменений: подтверждающее и регрессионное тестирование

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

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

Тесты должны быть повторяемыми, если они должны использоваться для подтверждающего или регрессионного тестирования.

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

Вопросы

Какое из следующих высказываний НАИЛУЧШИМ ОБРАЗОМ описывает нефункциональное тестирование?
  • Нефункциональное тестирование – это тестирование атрибутов системы, таких как практичность, надежность или сопровождаемость.
  • Нефункциональное тестирование – это процесс тестирования для определения соответствия системы стандартам кодирования
  • Нефункциональное тестирование – это тестирование без обращения к внутренней структуре системы
  • Нефункциональное тестирование – это процесс тестирования интегрированной системы с целью убедиться, что она выполняет специфические требования
Какое из высказываний ВЕРНО?

A. Регрессионное тестирование и повторное тестирование – это одно и то же.
B. Регрессионное тестирование показывает, все ли отказы системы были исправлены.
C. Регрессионные тесты – это хорошие кандидаты для автоматизации.
D. Регрессионные тесты используют для того, чтобы найти дефекты, которые появились в результате изменений в программе.
E. Регрессионные тесты не должны проводиться во время интеграционного тестирования.

  • A, C и E истинно
  • B, D, и E истинно
  • C и D истинно
  • A и B истинно
Где может быть проведено функциональное тестирование?
  • Только на системном и приемочном уровнях тестирования
  • На всех уровнях тестирования выше интеграционного
  • Только на уровне приемочного тестирования
  • На всех уровнях тестирования
Какое из следующих утверждений о функциональном тестировании верно?
  • Функциональные тест-кейсы выводятся из спецификации
  • Функциональное тестирование должно быть закончено перед инспекцией
  • Функциональное тестирование гарантирует безошибочное программное обеспечение
  • Функциональные тест-кейсы выводятся из изученного кода

2.4 Тестирование в период сопровождения

Введение

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

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

Модификация включает в себя запланированные изменения ( например, в рамках релиза), корректирующие и срочные изменения, изменения в окружении, такие как запланированные модификации ОС или СУБД, плановые модификации коробочных продуктов, или патчи для исправления недавно выявленных слабых мест в ОС.

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

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

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

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

Вопросы

Что из этого является примером тестирования в период сопровождения?
  • Протестировать исправленные дефекты во время разработки новой системы.
  • Интегрирование функций во время разработки новой системы.
  • Разбор жалоб по системе во время пользовательского приемочного тестирования.
  • Протестировать улучшения существующей действующей системы.
При каких обстоятельствах вы планируете проводить тестирование в период сопровождения?

a. При миграции приложения с одной платформы на другую.
b. При плановом расширении релиза.
c. Когда необходимо обновить тестовые сценарии.
d. При миграции данных, связанных с окончанием службы системы.

  • a, c, d
  • a, b, d
  • b, c, d
  • a, b, c
Какие два из перечисленных ниже атрибутов являются общими для тестирования в период сопровождения?

a. Осуществляется, чтобы гарантировать, что система будет надежна в обслуживании.
b. Включает в себя регрессионное тестирование.
c. Требует использования полностью определенных спецификаций.
d. Может включать тестирование системы после миграции с одной платформы на другую.

  • a, c
  • a, b
  • c, d
  • b, d
Когда в жизненном цикле должно начаться тестирование?
  • После того, как требования были рассмотрены
  • Как можно раньше
  • После того, как код доступен для тестирования
  • После того, как тестовая среда готова

Понравилась статья? Поделить с друзьями:
  • Территория украины кто что подарил
  • Тестировщик игровых сценариев книга отзывы
  • Территория семейных праздников вместе
  • Террария хеллоуинский праздник
  • Тестирование на основе сценариев что это