Многие знакомы с методологией Test-Driven Development и, в частности, Behavior-Driven Development. Этот подход к разработке и обеспечению качества ПО набрал большую популярность, поскольку позволяет выстроить четко установленное соответствие между бизнес-требованиями и технической реализацией продукта.
На Russian Python Week 2020 Владислав Мухаматнуров, Senior QA automation на примере проекта голосового ассистента в Tinkoff, разобрал задачи, которые решает BDD. В своем докладе Влад разобрал, что такое BDD и Gherkin, откуда возникает потребность в поведенческом тестировании на проекте и как выглядит имплементация предметно-ориентированного языка для тестирования, базирующейся на диалогах системы. А под катом мы предлагаем вам прочитать расшифровку доклада.
![](https://habrastorage.org/getpro/habr/upload_files/91b/826/b74/91b826b746fc82f4174f5d529dd9a10f.png)
Проект: Голосовой Ассистент «Олег»
Это тот самый голосовой помощник, который помогает людям в чатах мобильных приложений или когда они звонят в банк. Голосовой ассистент Олег от Tinkoff Mobile берет трубку и общается с клиентами.
Давайте подробнее поговорим об этом проекте:
Микросервисная архитектура.
В основе системы лежит:
Классификация и распознавание намерения пользователя;
Генерация действий на входное воздействие;
Сообщения в диалогах классифицируются на основе направленного ациклического графа.
Направленный ациклический граф
Это граф, который имеет начальный и конечный узлы, и из первого во второй можно добраться различными путями, в том числе параллельными. Но при этом нельзя выйти из начального узла и вернуться обратно в начальный узел.
![](https://habrastorage.org/getpro/habr/upload_files/8d5/48f/014/8d548f014f00111197084e8cb7bc2136.png)
Основные сервисы:
диалоговая платформа, которая осуществляет маршрутизацию сообщений клиента по нужным каналам обработки;
классификаторы, позволяющие выделять полезную нагрузку из сообщений пользователя и правильно понимать, как ее нужно обработать;
CRM-система, которая содержит процедуры работы с клиентами;
вспомогательные сервисы.
Тестирование на проекте
Однажды мы задались вопросом, как организовать тестирование на таком сложном проекте? Более того, у нас появились другие вопросы:
что у нас является тест-кейсом?
каким может быть входное воздействие на нашу систему?
каким может быть результат обработки сообщений?
как все это автоматизировать?
Мы начали думать и формулировать, как могут быть выражены бизнес-кейсы использования нашей системы. Для начала нужно было посмотреть на диалоги системы и пользователя:
![](https://habrastorage.org/getpro/habr/upload_files/909/16d/4d5/90916d4d53a30bb813912bb7893dc978.png)
Есть четко регламентированные воздействия на систему со стороны пользователя, а в ответ на эти воздействия система что-то генерирует. Попытаемся классифицировать эти ответы.
Посмотрим на взаимодействие в чате.
Действия пользователя:
напечатать текст;
надиктовать текст голосом;
нажать на подсказку;
нажать на кнопку виджета;
отправить файл.
Действия бота:
ответить текстом;
ответить текстом и голосом;
отправить подсказку;
отправить виджет;
отправить файл.
То есть бот делает то же самое, что пользователь, но в обратную сторону.
Описание бизнес-кейса
На основе этого сформировалось понимание, как может выглядеть бизнес-кейс на бумаге. Например:
![](https://habrastorage.org/getpro/habr/upload_files/590/af5/6dd/590af56dd3dd92fbf92b3829833c77fa.png)
User stories
В примере приведена пользовательская история. Это способ описания требований к разрабатываемой системе, сформулированных при помощи предметно-ориентированного языка.
Особенности user stories:
быстрый способ документировать требования бизнеса к реализации продукта;
минимизация обширных формализованных технических и бизнес спецификаций;
низкая цена поддержки.
На основе этого мы сформулировали требования к нашему процессу обеспечения качества и, в принципе, к улучшению процесса разработки на проекте.
Так, мы хотели связать постановку технических и бизнес-задач на основе историй использования системы, получить фундамент для тест-кейсов на основе бизнес-кейсов, автоматизировать регресс системы на основе пользовательских историй. Кроме того, нам было важно пополнить процесс разработки возможностью описать поведение системы и при помощи этих историй добиваться ее работоспособности согласно сценариям.
Я расскажу о чертах BDD или «разработки на основе поведения».
Behaviour-Driven Development
BDD — это ответвление методологии разработки через тестирование. Суть BDD заключается в том, что у нас есть бизнес-требования к продукту, которые мы описываем на предметно-ориентированном языке и получаем сценарий использования системы. Далее реализуем техническую часть системы и в конечном итоге создаем крутой конкурентноспособный продукт.
![](https://habrastorage.org/getpro/habr/upload_files/be7/59a/26c/be759a26c0b7f13439d68422ede06a85.png)
Классический цикл Behaviour-Driven Development состоит из 5 шагов:
Описываем поведение системы.
Определяем технические требования к системе.
Запускаем тесты или руками проверяем сценарии поведения. А они, естественно, падают, потому что система еще не готова или не реализована.
Дорабатываем нашу систему, то есть создаем, обновляем, дополняем, изменяем.
Добиваемся того, чтобы система проходила наши сценарии использования.
В основе BDD лежат спецификации поведения. Это документы, которые имеют следующую структуру:
заголовок — описание бизнес-цели;
описание — субъект, состав истории, ценность для бизнеса;
сценарии — ситуация поведения субъекта.
Gherkin и детали имплементации BDD
Gherkin — это предметно-ориентированный язык (по сути DSL), который позволяет описать поведение системы при помощи специальных ключевых слов, заранее зафиксированных.
Пример сценария, написанного на Gherkin:
![](https://habrastorage.org/getpro/habr/upload_files/809/fe8/14c/809fe814c718489225db96f417d8618a.png)
В Gherkin употребляются ключевые слова. Их можно объединить по 4 основным группам:
Шаблон:
Background / Предыстория
Scenario / Сценарий
Scenario Outline / Структура сценария
Таблицы:
Examples / Примеры
Язык Gherkin: ключевые слова
Шаги:
Given / Дано
When / Когда
Then / Тогда
Предлоги:
And / И
But / Но
Пройдемся по этим ключевым словам.Ключевое слово: Функция.
Это название спецификации, отражающее определенную бизнес-функцию. Первая строчка в документе, описывающем ее, должна начинаться с ключевого слова «Функция:».
![](https://habrastorage.org/getpro/habr/upload_files/b4b/508/a8d/b4b508a8de0c76d58c9e25decf26d091.png)
Ключевое слово: Сценарий.
Рядом с ключевым словом размещается краткое описание сценария.
![](https://habrastorage.org/getpro/habr/upload_files/8a6/86c/e5c/8a686ce5c7871acab3a2a9c489c291ea.png)
Ключевое слово: Структура сценария.
Структура сценария позволяет избежать повторения конструкций. Когда вы пишете много похожих друг на друга сценариев, их можно шаблонизировать. Для этого и употребляется структура сценария.
![](https://habrastorage.org/getpro/habr/upload_files/e49/b96/80c/e49b9680cb151da590da33dd0d3b4f1e.jpg)
Ключевое слово: Примеры.
Это таблицы с данными для параметризации структуры сценария. Они могут содержать много переменных, быть заданы горизонтально и вертикально, как представлено в примере.
![](https://habrastorage.org/getpro/habr/upload_files/cc2/22e/fc2/cc222efc23e637e2c9dd59ecc90c0074.png)
Ключевое слово: Предыстория.
Предыстории добавляют определенный контекст ко всем Сценариям в пределах Функции. Фактически, Предыстория — это сценарий без имени, состоящий из конечного множества шагов, которые, как правило, специфицируют систему и пользователя перед каждым Сценарием.
![](https://habrastorage.org/getpro/habr/upload_files/c4f/0c0/c49/c4f0c0c49c5d1bde55603a68c9178c00.png)
Ключевое слово: Дано.
Назначение шагов Дано состоит в приведении системы и ее пользователя в определенное состояние. Их можно рассматривать как предусловия сценария.
![](https://habrastorage.org/getpro/habr/upload_files/b6d/48a/e64/b6d48ae64c7cdde979ba316046044258.jpg)
Ключевое слово: Когда.
Основная задача этого ключевого слова состоит в описании ключевого воздействия, совершаемого пользователем на нашу систему.
![](https://habrastorage.org/getpro/habr/upload_files/a3b/6db/628/a3b6db62878f45ac7526c1f5e8f3277d.png)
Ключевое слово: Тогда.
Оно необходимо для наблюдения за результатом выполнения действий. По сути, для проверки вывода системы (отчеты, интерфейс, сообщения). Наблюдения должны быть связаны с описанием Функции и Сценария.
![](https://habrastorage.org/getpro/habr/upload_files/52d/a00/fa2/52da00fa270330d98b795b389718feda.png)
Ключевые слова: И, Но.
Это предлоги. Они необходимы, когда есть несколько последовательных шагов Дано, Когда или Тогда. В данном случае предлог И — это смысловой аналог конъюнкции, а предлог Но — смысловой аналог инверсии.
![](https://habrastorage.org/getpro/habr/upload_files/335/92e/2dc/33592e2dc86dca06c4e14e462608be8a.png)
Пример диалога системы с пользователем
Рассмотрим простейший пример, где пользователь пишет «Привет!», а бот отвечает ему текстом и показывает подсказки:
![](https://habrastorage.org/getpro/habr/upload_files/a3d/d7a/e38/a3dd7ae38d8014266bf43f8f18b1654a.png)
Рассмотрим, как это можно зафиксировать при помощи наших сценариев и спецификаций поведения.
Пример использования Gherkin
![](https://habrastorage.org/getpro/habr/upload_files/5ed/229/6be/5ed2296be0796cf9ca811b1a667fec33.png)
Здесь есть конкретная Функция: Бот умеет приветствовать пользователя. Кроме того, мы видим предысторию, о том, что это за клиент, в какой ОС он сидит и какую версию приложения использует. Ведь в зависимости от разных версий приложения могут быть показаны разные виджеты.И у нас есть сам сценарий, согласно которому в ответ на то, что пользователь пишет: «Привет!», бот отвечает фиксированным текстом и дает фиксированные подсказки.
Пример отчета по сценарию поведения
Это автоматически сгенерированный отчет при помощи нашего внутреннего инструмента автоматизации, который отражает сценарий поведения с результатом Passed:
![](https://habrastorage.org/getpro/habr/upload_files/bb9/759/44a/bb975944a4315939df5c33b46871678d.png)
Пример посложнее: «Поездка за границу»
![](https://habrastorage.org/getpro/habr/upload_files/eb9/ba0/229/eb9ba02293a1ef7f5d20eaf0e0b6b8e4.png)
Тут пользователю необходимо написать о своем намерении уехать за границу. Бот это поймет, предложит добавить поездку, и начнется выбор страны, даты отъезда и т.д. А дальше мы ждем, что пользователь подтвердит факт, что поездка планируется.
![](https://habrastorage.org/getpro/habr/upload_files/0ee/ff3/102/0eeff3102e4ccf7424a0df0a1d038c41.png)
Так может выглядеть этот бизнес-кейс при помощи нашего предметно-ориентированного языка:
![](https://habrastorage.org/getpro/habr/upload_files/a66/e76/41b/a66e7641b5d785a783e65b71968023ff.png)
![](https://habrastorage.org/getpro/habr/upload_files/7d8/c66/be4/7d8c66be4dc8935e43a1351ff99dff0b.png)
![](https://habrastorage.org/getpro/habr/upload_files/a88/efe/0c4/a88efe0c425ba93bb0697799486c01bf.png)
То, что вы видите в приложении и пишите системе, описывается в сценариях поведения. У нас появляется прямое соответствие бизнес-кейсов и тест-кейсов, то есть они, по сути, идентичны.
А при помощи инструмента автоматизации можно собирать входные воздействия и добавлять регресс, автоматизировать, делать аналитику на основе получаемых данных.
Пример отчета по сценарию поведения
![](https://habrastorage.org/getpro/habr/upload_files/229/c43/c8d/229c43c8d4fd7c1aec53dc309dbcf92a.png)
![](https://habrastorage.org/getpro/habr/upload_files/4b0/440/796/4b0440796d6e6ac8968ad5b6295475df.png)
![](https://habrastorage.org/getpro/habr/upload_files/759/9e8/5f2/7599e85f2dc83d4616044b67830ad7da.png)
Интересно рассмотреть, как реализуется Gherkin «под капотом».
У нас есть инструмент автоматизации. К нему прикручивается плагин имплементации конкретно для нашего языка программирования. Далее, на основе этой конструкции, реализуется каркас предметно-ориентированного языка, и затем можно писать спецификации поведения.
![](https://habrastorage.org/getpro/habr/upload_files/933/a20/5f5/933a205f5724d397522cea6322d1e5f4.png)
Задачи, решаемые BDD
Я выделил три важные задачи, которые решает разработка на основе поведения:
объединение бизнеса и разработки;
установление единого восприятия бизнес-кейсов;
удешевление поддержки тест-кейсов.
Рассмотрим классическую ситуацию.
У нас есть продукт, а у него продакт-менеджер. Он хочет очередной бизнес-эпик, описывает его в виде бизнес-требований и передает в команду.
У команды есть технический аналитик, который на основе бизнес-требований формирует технический эпик и техническую спецификацию по данной фиче. На основе технической спецификации команда разработки реализует функциональность. Согласно задачам, эта функциональность поступает в отдел тестирования. И QA при помощи тест-кейсов тестирует фичу, находит баги или подтверждает работоспособность нашей системы.
В конечном итоге у нас сформирована спецификация по тестированию данной фичи.
Итак, у нас есть три основные документа:
Бизнес-требования к продукту.
Техническая спецификация продукта.
Спецификация по тестированию продукта.
И вот он — классический случай, где каждый из документов является новым отображением на основе предыдущего документа. Проблема в том, что у нас нет единого понимания, что такое сценарий использования приложения, и часто размыты понятия поведения системы и пользователя в этих документах. Как следствие, бизнес-кейсы сильно отличаются от тест-кейсов. Разница в формате реализации документов приводит к проблемам в восприятии информации участниками процесса.
Например, продакт-менеджер приходит и задает важный и правильный вопрос про фичу у продукта.
![](https://habrastorage.org/getpro/habr/upload_files/b68/eca/bcd/b68ecabcdbc94ea190ca344417e7d818.png)
Чтобы ответить на него, QA переводит с бизнес-языка на технический: что за пользователь, как реализуются обработка конкретной группы и выполнение условия C в системе?
А потом смотрит, есть ли у нас кейсы на проверку комбинации из заданных технических особенностей при указанном условии. Если кейсы есть, QA сразу дает ответ. А если нет, проверяет руками.
На картинке QA дает ответ на вопрос менеджера продукта, но как будто бы на своем языке. И он тоже прав. Он дал абсолютно корректный, правильный ответ. Но кажется, что этот ответ не совсем коррелирует с заданным вопросом.
BDD — это про объединение бизнеса и разработки. Постановка задач BDD от бизнеса выполняется в виде спецификаций поведения. Такие спецификации уже используются в качестве основы для технических требований, а также являются фундаментом для тест-кейсов.
![](https://habrastorage.org/getpro/habr/upload_files/23f/04f/df1/23f04fdf1119ef56d5be2d3a7b364253.png)
Единое восприятие продукта
Мы начинаем воспринимать продукт одинаково. Когда менеджер в следующий раз задаст свой правильный и важный вопрос, QA ответит на его языке:
![](https://habrastorage.org/getpro/habr/upload_files/a7d/99c/a42/a7d99ca42c62958add05e7eef5d569d6.png)
Он ответит так, потому что у него есть тот самый бизнес-кейс, который уже написан на Gherkin. В нем описывается функция и конкретный сценарий поведения.
![](https://habrastorage.org/getpro/habr/upload_files/d1d/e58/0c8/d1de580c83fe1acb537e2e732acd09d6.png)
У нас появляется единое восприятие бизнес-кейсов. Спецификации поведения (на основе утвержденного шаблона) понятны всем: продуктологам, аналитикам, разработчикам и тестировщикам.
Такие сценарии легко реализуемы. А если их автоматизировать, вы получите эффективный инструмент для сбора аналитики и формирования отчетов. Кроме того, эти сценарии позволят вам итеративно улучшать продукт.
Всё это можно делать непрерывно, ежедневно улучшая продукт. Также BDD позволяет удешевить поддержку тест-кейсов.
Спецификации поведения сами по себе реализуются на основе набора простых конструкций имплементированного предметно-ориентированного языка. По сути такие сценарии почти не зависят от программной реализации вашего инструмента автоматизации «под капотом».
![](https://habrastorage.org/getpro/habr/upload_files/d57/fe1/bb4/d57fe1bb4369ea6f2be371e14dc65b23.png)
То есть можно взять любой инструмент автоматизации, но при этом использовать один предметно-ориентированный язык, те же самые спецификации поведения, и все должно быть идентично. Не нужно переписывать тест-кейсы, если вы меняете фундамент инструмента автоматизации.
Давайте сравним тест-кейсы автоматизации: слева — уже привычный тест на Gherkin, справа — кейс на фреймворке Tavern.
![](https://habrastorage.org/getpro/habr/upload_files/20c/35e/505/20c35e505371a1aad25fe4eaab75a2c3.png)
Справа более технический тест-кейс, а слева, по сути, просто описание бизнес-функции. Но, как правило, всем приятнее видеть именно то, как работает система в тест-кейсах, и какие она генерирует ответы на запросы.
Преимущества интеграции BDD
На собственном опыте мы ощутили преимущества интеграции BDD:
Идеально тестировать диалоги чат-бота и говорящего робота.
Понятная спецификация системы и пользователя, например:
Версии приложения, ОС, часовой пояc.
Тип клиента, продукта, номер телефона.
На основе ограниченного набора шагов мы сделали маппинг. Используем ключевые слова:
Дано — для спецификации пользователя и системы, как это канонически предусмотрено.
Когда — для описания действий пользователя.
Тогда — для описания реакции системы.
Проблемы, не решаемые BDD
Процесс разработки: если он плохо поставлен, интеграция BDD не сделает его быстрее и качественнее.
Регрессионное тестирование: при отсутствии (или серьезной нестабильности) QA-контура или стейджинга не будет возможности обеспечить регресс на основе созданных сценариев поведения, в том числе, автоматизированный.
Релизный процесс: при отсутствии поставленных в командах проекта процессов по контролю качества и релизам, интеграция BDD не позволит гарантировать работоспособность согласно спецификациям поведения.
Если вы делаете BDD, нужно контролировать работоспособность системы до того, как все это выкатится в продакшен. Только тогда BDD принесет классные результаты.
Видео доклада можно увидеть тут.
Профессиональная конференция для Python-разработчиков пройдет 27 и 28 сентября в Москве. Но посмотреть расписание и выбрать самые интересные доклады можно уже сегодня.
Не забудьте купить билеты. Встречаемся в офлайне в конце сентября!