Ретроспективные уроки автоматизации: мастерство работы с данными |
19.03.2021 16:54 |
Автор: Виктор Славчев (Viktor Slavchev) К статьям вроде "Принцип трех А" я часто получаю комментарии вроде таких: "у нас проблемы с пересечением пользовательских данных в тестах", или "как бы вы управились с Х тестами, каждому из которых нужно наполнение данными". В свое время я обнаружил, что способ настройки данных, выбранный для автоматизированных проверок, может сильно влиять на их производительность, надежность, поддерживаемость и устойчивость, и эта тема заслуживает отдельной статьи. У меня даже есть небольшое задание, которое я выдаю на собеседованиях автоматизаторов: "Представьте, что у вас есть мобильный интрнет-магазин, для которого нужно написать автоматизированные проверки. Нужно создать проверки для функциональности чекаута. Чтобы это сделать, нужно, чтобы пользователь авторизовался, но для самого чекаута также нужно три набора данных – личные данные (имя, фамилия, и т. п.), адрес (куда доставлять товары), и данные о платеже (кредитная карта, токен PayPal, данные банковского счета, и т. д.). Вопрос: как вы настроите данные для проверок, чтобы успешно автоматизировать чекаут? Почему вы выбрали именно такой подход? Если так будет легче, можете представить три набора данных как три таблицы в базе данных, которые нужно заполнить валидными данными". Я буду пользоваться этим заданием как примером, рассказывая о разных подходах и их достоинствах и недостатках. Немного контекста задачи Я считаю это классическим сценарием для автоматизированных проверок. Задавая этот вопрос, я в первую очередь хочу увидеть, есть ли у человека практический опыт автоматизации. Если он есть, то не будет проблемы предоставить как минимум два рабочих решения; если решений не найдено, то человек или слишком взволнован или напуган, или неправильно подходит к задаче. Худший способ подхода к данным Для контраста и для развлечения начну с наихудшего из возможных подхода. Допустим, приложение установлено и запущено, и нам нужно только создать пользователя и авторизовать его. Наихудший способ – это регистрироваться через интерфейс для каждого прогоняемого теста или набора тестов. Достоинства:
Недостатки:
Немного модифицированный наихудший возможный способ Думаю, еще один плохой подход – это создание данных вне теста. К примеру, в моем тест-окружении есть пользователь Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript . Я знаю, что у него есть все нужные данные, и просто всегда авторизуюсь с Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript . Достоинства:
Недостатки:
Сложность в обращении с данными Надеюсь, вы понимаете, что тут нет единого правильного ответа – только менее неправильные. На самом деле все зависит от различных факторов. Факторы, которые надо учитывать, прежде чем начать создавать данные для автоматизированных проверокВот факторы, с которыми я столкнулся на личном опыте:
Начнем с конца: с состоянийПрежде чем я перечислю подходы, начнем с конца. Вам нужно раз и навсегда определиться (для своего контекста) – будете ли вы сбрасывать уже имеющиеся тестовые данные до определенного состояния, или удалять их полностью. Зачем вам вообще их сбрасывать? Причина проста: состояние ваших данных для автоматизированных проверок – жизненно важная для надежности проверок вещь. Если они не всегда стартуют с фиксированного определенного состояния, вы внедряете в тесты нестабильность – на самом деле это очень, очень халтурный тест-дизайн и плохое управление данными. Зачем сбрасывать тестовые данные? Просто чтобы иметь хорошее, известное вам состояние, с которого стартуют тесты. Это может быть снимок базы данных, скрипт, или что-то иное. Зачем удалять тестовые данные? Возможно, затем, что ваши тесты создают свои собственные данные, и вам все равно, сохранятся другие данные или нет. В любом случае, для этого существуют специфические причины. Позже мы обсудим это подробнее. Важный момент Удаление или сброс данных после каждого тест-прогона может занимать время, в зависимости от размера вашей базы данных (и, возможно, скорости инфраструктуры). Поэтому ранее я сказал, что с этим надо сразу определиться. Некоторые компании и тестировщики сообщают, что выиграли 20-30% в скорости тестов, просто убрав этот шаг, поэтому будьте осторожны, это может дорого стоить. Несколько различных подходов к созданию данных из моего опыта.Я перечислю несколько подходов, которыми сам пользовался, а также потенциальные проблемы, которые происходили или могут произойти при их использовании. Самый тривиальный – SQL-скрипты. Нравится вам это или нет, это, возможно, первое, что придет тестировщику в голову – как я уже сказал, это, в конце концов, три таблицы – можно просто написать несколько файлов с INSERT-запросами. Это просто и быстро: вы будете создавать данные при каждой необходимости. Проблемы:
Использование фикстур данных Использование фикстур данных немного превосходит прямые SQL-скрипты, но между этими подходами много общего. Этот подход решает проблему зависимости от конкретно базы данных, так как фикстурами данных можно управлять на уровне выше – например, на уровне диспетчера сущностей. Если коротко, фикстуры данных будут представлять сущности или объекты, которые создаются на определенном уровне (на уровне теста, набора тестов, перед прогоном, и т. д.), и в них будет встроен некий механизм очистки. Проблемы:
Подход "каждый за себя" Этому подходу я, наверное, симпатизирую больше всего (возможно, и скорее всего, я пристрастен). Он базируется на изоляции тестов, принципе герметичности – он гласит, что каждый тест или набор должен самостоятельно отвечать за требуемые данные – к примеру, тест А создает данные, нужные ему для прогона, тест Б создает свои собственные данные, и так далее. Создание данных может происходить через некий внешний инструмент, вызов фикстуры, или неким аналогичным способом. В этом случае создание данных остается на совести тест-класса, который отвечает нашему (как минимум моему) обсессивно-компульсивному стремлению к единичной ответственности. Конечно, это не серебряная пуля – у этого подхода тоже есть проблемы. Проблемы:
Спагетти-подход Все вышеописанные подходы предполагают, что вы собираетесь запускать проверки в случайном порядке. Возможно, вы делаете это, чтобы убедиться, что между проверками нет тонких невидимых ниточек. Такие ниточки будут означать, что в тестах есть неявные зависимости, о которых вы забыли. В любом случае, в некоторых упомянутых мной ситуациях вы намеренно будете запускать тесты в определенном порядке. Это может показаться неразумным, но как я уже говорил, платформы не ограничены вебом, и не каждая конфигурация позволяет быстрое восстановление состояния. Примером могут быть мобильные приложения, где запуск эмулятора или состояния устройства может занимать много времени, или десктоп. Проблемы:
Комбинированный подход Возможно, вы уже заметили, что универсального подхода не существует, и несмотря на личные предпочтения какого-то конкретного способа, их надо адаптировать к ситуации и контексту. Следовательно, может помочь комбинация способов. Например:
Вообще не подход к созданию данных Об этом подходе я только слышал, но сам никогда не видел и не использовал, поэтому подходите к нему со всем возможным скепсисом. Можно вообще разделить проверки и создание данных, если разместить их в двух разных приложениях. Одно будет синхронизировать данные с БД прода, чтобы получить 20-50 свежих и точных клиентских записей. Оно также займется обрезкой или заменой персональных данных, защищенных законом или другими требованиями. В этом случае ваши тесты просто будут выбирать одного из пользователей случайным образом и выполнять проверку с ним. Думаю, что это будет наиболее реалистичный тест в плане близости к реальным данным. Я также полагаю, что это будет полезно компаниям с большой инфраструктурой, которую сложно привести к определенному состоянию. Проблемы: Я никогда этим не пользовался, поэтому перечислю только гипотетические проблемы:
Плюсы и минусы из моего опыта:Заключение Надеюсь, что эта длинная статья поможет вам понять, что создание данных – проблема непростая, как и тестирование – непростая штука. Оно зависит от множества переменных, и выбор подхода должен учитывать все эти факторы. Удачи! |