Mvvm И Mbt В Контексте Автоматизации Пользовательского Интерфейса

Реактивные интерфейсы уже более 5 лет являются отраслевым стандартом в мире Frontend-разработки.

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



Проблемы

Возможно, самая простая вещь в задачах автоматизации тестирования — это сама автоматизация тестирования.

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

  1. Унификация тестового дизайна
  2. Автоматизация проверки
  3. Поддержка автоматизации
Давайте рассмотрим каждый из них более подробно.



Унификация тестового дизайна

Как правило, тест-кейсы пишутся на естественном языке аналитиками или QA-инженерами, без каких-либо формальных правил и обозначений.

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

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

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

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

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

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

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

Автоматизация проверки

Автоматизация начинает приносить реальную пользу только тогда, когда она сделана очень хорошо.

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

Приведу пример: представьте себе таблицу со списком строк, последний столбец которой содержит кнопку «удалить».

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

«Простой» вариант автоматизации в этом случае — получить количество строк до и после удаления, а затем сравнить, уменьшилось ли количество на одну строку.

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

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

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



Поддержка автоматизации

Поддержка и сопровождение автотестов — одна из самых болезненных тем в этой сфере.

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

Автотесты отстают и не успевают адаптироваться к изменениям.

На практике это выглядит так: запускается регрессия, запускаются автотесты, некоторые из которых проваливаются, их начинают анализировать/редактировать/перезапускать.

И этот процесс требует больше ресурсов, чем запуск всей регрессии вручную.

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

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

Все проблемы с селекторами (в UI-тестах) и атомарными функциями должны отображаться на этапе Smoke тестов.

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



Модельно-ориентированное тестирование (MBT)

MBT — это декларативный подход к проектированию тестов.

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

Методика, при которой тесты генерируются, а не создаются вручную, называется ДДТ.

ДДТ (Data Driven Testing) – техника тестовый дизайн, когда один метод действует как параметризованный шаблон.

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

MBT является расширением DDT: при DDT тестовые данные описываются вручную, а при MBT они генерируются на основе модели.



MBT для тестов Rest API

Вполне можно взять за образец для тестов Rest API Объекты DTO запросы, добавляя в их поля некоторую метаинформацию о семантике этих полей, например:
  • Поле обязательное
  • Список допустимых значений (для перечислений)
  • Максимальное/минимальное значение (для чисел)
  • Максимальная длина строки
Помимо описания значений атрибутов объекта DTO, для успешной работы необходимо реализовать отображение объекта запроса на объект ответа.

После чего можно реализовать алгоритм генерации положительных и отрицательных тестов.

В этой статье мы не будем подробно рассматривать вопросы, связанные с тестами API. Давайте сосредоточимся на UI-тестах.



ОБТ для UI-тестов

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

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

МВВМ (Model View — View Model) или Reactive UI — это подход к реализации пользовательского интерфейса, при котором изменения модели автоматически применяются к Вид .

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

Итак, модель для UI-тестов удобно описывать в двух обозначениях в зависимости от функционала.

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

Когда пользовательский ввод осуществляется через MVVM.

Графики и навигация

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

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

   

interface PathBuilder { fun findPath(from: Page, to: Page): Collection<NavEdge> } interface Navigator { val pages: MutableList<Page> val pathBuilder: PathBuilder fun register(page: Page) = pages.add(page) val current: Page get() = pages.firstOrNull { it.isPresent }

Теги: #Тестирование веб-сервисов #Тестирование ИТ-систем #автоматизация тестирования #mvvm #проектирование на основе моделей #mbt
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.