какое деление по сезонам принято в спортмастере ответ на тест
Unit-тесты в СУБД — как мы делаем это в Спортмастере, часть третья
Пару лет назад было решено поделиться историей про автоматизированное тестирование СУБД и наш опыт применения в Спортмастере. С результатами можно ознакомиться здесь и здесь.
И сейчас, спустя значительное время, хочется подвести итоги и порефлексировать о системе. Да и даже просто ответить на вопрос: «Как там ваши автотесты?»
Спойлер
Краткое описание предыдущих частей
Есть система лояльности Спортмастера:
огромная, сложная и высоконагруженная система 24/7
важный функционал для бизнеса
есть сложные вычислительные алгоритмы
система преимущественно содержит серверную логику на Oracle
Хотелось повысить качество выпускаемого продукта и сократить время на тестирование, поэтому внедрили систему автоматизированного тестирования на PL/SQL:
ядро системы – это open source библиотека utPLSQL v 2.3 от Стивена Фейерштейна
вокруг utPLSQL развёрнуты самописные модули, которые облегчают работу с автотестами:
модуль запуска автотестов
модуль генерации тестовых данных
модуль управления метаданными
сформирован каталог автотестов с определением ключевых настроек
автоматизированы запуск автотестов, отчётность и накат изменений
А что же сейчас?
Самое важное, что стоит сказать про систему автоматизированного тестирования – она успешно работает, приносит пользу и постоянно развивается. А каждая ошибка, найденная автотестом, приводит примерно к такому состоянию:
Но это всё демагогия, поэтому перейдём к качественным показателям:
Количество автотестов: ≈2400
Время работы полного запуска: ≈40 секунд
Показатель Code Coverage: ≈55%
Скорость работы
Одним из ключевых параметров системы автоматизированного тестирования является время работы автотестов. В каких-то системах всегда запускаются все тесты, а в каких-то выделяется определённая группа тестов и принимается решение, что такого запуска достаточно для уверенности в работоспособности. Но так или иначе со скоростью работы сталкиваются все, а уж всем автоматизаторам веба и тем более древних приложений я совсем не завидую (отдельный привет TestComplete!).
Автоматизация тестирования на уровне СУБД позволяет избежать большого числа проблем, связанных со внешней средой, но для быстрой работы тестов всё равно необходимо немного пошаманить.
Изначально, наши автотесты работали порядка 30 минут. Небольшое погружение в сторону параллельного запуска позволило сократить общее время работы до 5 минут, но и на этом мы не остановились. Для достижения текущего эталонного результата в 40 секунд было сделано:
Разбиение всех автотестов на логические функциональные блоки
Обеспечение изолированности тестовых данных под каждый функциональный блок автотестов
Каждый функциональный блок должен работать с персональными тестовыми данными. По окончанию теста система возвращается в исходное состояние.
Иногда возврат системы в исходное состояние невозможен или слишком трудоёмок. В этом случае автотест должен работать на данных, которые не мешают работе остальной системе и не блокируют следующий запуск автотеста или параллельную работу автотестов. Например, в уникальные ключи тестовых объектов можно зашивать код автотеста и текущую дату и время.
Запуск каждого функционального блока в отдельном потоке
Формирование сводной отчётности по полному запуску автотестов
Code Coverage
Я всегда с большой улыбкой относился к метрикам покрытия кода, потому что они, конечно, что-то говорят про вашу систему и автотесты, но вот что именно – не очень понятно. При этом идеал в 100%-ное покрытие практически недостижим. А даже если и достижим, то никак не гарантирует, что в системе ошибок нет.
А при тестировании серверной части всё становится ещё более непонятно. Ведь работа системы зависит от данных в таблицах. Есть sql-запросы, которые в принципе не поддаются анализу по покрытию. И разве хоть какая-то метрика может дать адекватную оценку состоянию автотестов?
Но так как вопросы про покрытие задаются слишком часто, пришлось внедрять в систему автоматического тестирования code coverage, благо что Oracle, начиная с версии 12.2, подобный функционал предоставляет.
Это оказалось совсем несложным:
перед запуском автотестов вызвать: dbms_plsql_code_coverage.start_coverage
выключить функционал по окончанию всех работ: dbms_plsql_code_coverage.stop_coverage
написать запрос, который считает покрытие
А мы, получив приятную цифру в 50% покрытие, пошли заниматься более интересными вещами.
Автоматическая генерация кода
Наращивание количества автотестов – это простая и понятная задача. Были бы ресурсы, а автотесты всегда появятся. Но, конечно же, хочется сократить издержки на выпуск автотестов. А самый быстрый способ написания кода – не писать код совсем!
В какой-то момент стало понятно, что большинство автотестов крайне похожи друг на друга, и мы начали думать в сторону автоматической генерации кода. Требовалось указывать конкретный метод системы, подлежащий покрытию автотестом, а на выходе получать полностью валидный код, отформатированный согласно стандартам отдела разработки.
Автоматически сгенерённый код должен содержать:
Инициализацию всех входных и выходных переменных простых типов
Инициализацию всех входных и выходных коллекций
Процедуры для сравнения двух коллекций одного типа
Вызов тестируемого метода
Базовые проверки выходных значений
Хотелось бы конечно, чтобы автотесты начали разрабатываться полностью сами, но с чего-то начинать надо? Реализовав описанное решение, мы стали экономить лишние 10-15 минут при создании каждого автотеста. Дополнительно, автоматическая генерация кода оказалась очень полезной в процессе адаптации новых сотрудников на проекте.
utPLSQL v3
Так почему же у нас в проекте используется более старая версия фреймворка? К сожалению, utPLSQL v 3 не поддерживает несколько важных для нас фич. Что-то разработчикам кажется концептуально неправильным, до чего-то не доходят руки. Все проблемы решаемы, благо что код библиотеки так и остался открытым и может быть самостоятельно изменён. Соответствующая задача в техническом долге заведена, но она не является наиболее приоритетной в нашей дорожной карте развития автотестов.
Заключение
На проекте лояльности Спортмастера уже несколько лет успешно работает система автоматизированного тестирования на PL/SQL. Основные показатели системы и некоторые технические решения освещены в данной статье. Но мы не останавливаемся в развитии и помимо планового расширения покрытия постоянно находим новые вызовы.
Было бы очень интересно узнать, с какими проблемами вы сталкивались при реализации автотестирования и какие решения находите.
Промокоды для Спортмастер на октябрь 2021
Промокод активен до 08.11.2021
Совершите покупку на сумму от 1000 рублей в период проведения акции и получите в подарок 2000 бонусов на счет, а также ещё 1000 бонусов в мобильном приложении (18 ноября 2021 года). Полученными бонусами можно оплатить до 30% следующего заказа с 18 ноября по 6 декабря 2021 года. Подробная информация представлена в разделе акции.
Промокод активен до 06.11.2021
Скидки распространяются на широкий ассортимент товаров, участвующих в распродаже. Цены указаны с учетом скидок. Предложение доступно в интернет-магазине и в розничных магазинах сети.
Промокод активен до 03.01.2022
Скидка предоставляется по промокоду, который указан в мобильном приложении в личном кабинете в разделе «Мои промокоды». Подробная информация представлена в разделе акции.
Промокод активен до 06.11.2021
Скидка предоставляется по промокоду, который можно получить в мобильном приложении. Скидка по данному промокоду распространяется на товары из категории «Теннис», «Настольный теннис» и «Треккинговая обувь» по 31 января 2025 года включительно, на товары из категории «Командные виды спорта», «Роликовые коньки и защита» и «Туризм» по 31 августа 2021 года включительно. Оплату бонусами применять нельзя. Данное предложение не суммируется с другими акциями (например «1+1=3!») и не действует на товары с маркировкой «Лучшая цена».
Промокод активен до 11.12.2021
Если вы нашли более низкую цену на товар в другом магазине, «Спортмастер» снизит цену. Подробная информация, а так же список магазинов для сравнения цен представлены на странице акции.
Промокод активен до 08.01.2022
В разделе акции представлены все скидки, подарки и другие специальные предложения магазина. Переходите и выбирайте самые выгодные.
Промокод активен до 31.10.2021
Скидки распространяются на товары, представленные в разделе акции. Цены указаны с учетом скидок.
Промокод активен до 06.11.2021
Скидки распространяются на товары, представленные в разделе акции. Цены указаны с учетом скидок.
Промокод активен до 20.12.2021
Кэшбэк предоставляется при оплате любой покупки картой «Мир» на сайте и в мобильном приложении «Спортмастер» в период проведения акции.
Промокод активен до 11.12.2021
Скидки распространяются на кроссовки, представленные разделе акции. Цены указаны с учетом скидок.
Промокод активен до 06.11.2021
Скидки распространяются на товары, представленные в разделе акции. Цены указаны с учетом скидок.
Промокод активен до 31.12.2021
В рамках акции за каждые полные 1000 рублей покупки в одном чеке на Клубную карту начисляется в два раза больше бонусов (в зависимости от уровня участия в Клубной программе). Данное предложение доступно только для участников Бонусной Программы. Подробная информация представлена в разделе акции.
Промокод активен до 15.12.2021
Предложение действует при заказе на сайте или через мобильное приложение магазина.
Промокод активен до 06.11.2021
Скидка предоставляется на все услуги сервисного центра. Дополнительно можно списать накопленные бонусы, но не более 30% от стоимости услуги.
Промокод активен до 31.12.2021
Совершите покупку от 1000 рублей в розничном магазине сети используя виртуальную клубную карту и получите в подарок 300 бонусов на счет.
Промокод активен до 06.11.2021
Для того, чтобы получить подарочные бонусы на счет, необходимо зарегистрироваться в Клубной программе СПОРТМАСТЕР и подписаться на рассылку магазина.
Промокод активен до 06.11.2021
При заказе товаров на сумму от 1000 рублей доставка в Москве, Санкт-Петербурге и некоторых других городах осуществляется бесплатно. Для того, чтобы узнать сумму заказа для предоставления бесплатной доставки в другом городе, необходимо выбрать нужный регион в разделе «Доставка и оплата».
Промокод активен до 06.11.2021
Для того, чтобы получить 300 бонусов, необходимо оформить на сайте заказ на сумму от 1000 рублей и выбрать любой удобный для получения заказа магазин Спортмастер. После получения заказа подарочные бонусы поступят на личный бонусный счет.
Промокод активен до 31.12.2021
Скидка предоставляется при покупке пяти и более комплектов одежды.
Старые купоны Sportmaster.ru
Промокод активен до 22.06.2019
Скидка предоставляется по промокоду и действует только на первый заказ. Данная скидка не суммируется с оплатой бонусами, картой сотрудника и другими действующими скидками.
Промокод активен до 20.06.2020
Скидка предоставляется по промокоду и действует только на товары по полной стоимости. Дополнительно можно использовать бонусы для оплаты до 30% суммы заказа.
Промокод активен до 13.01.2021
Воспользуйтесь промокодом и получите 500 рублей скидки (но не более 30% от суммы заказа) при заказе через мобильное приложение. Действует на ограниченный ассортимент товаров. Данная скидка не суммируется с другими акциями и не применяется при покупке товаров с маркировкой «Лучшая цена» и «Финальная цена».
Об интернет-магазине «Спортмастер»
«Спортмастер» – это интернет-магазин одежды, обуви, инвентаря и других товаров, предназначенных для спортивных тренировок и активного отдыха всей семьи. Богатый ассортимент онлайн-каталога насчитывает более 100 мировых брендов, с некоторыми из которых магазин работает напрямую, чтобы предложить для своих клиентов снаряжение и оборудование высокого качества по доступным ценам.
Ассортимент магазина «Спортмастер»
Интернет-магазин «Спортмастер» предлагает удобную классификацию товаров по категориям для осуществления быстрого поиска необходимой продукции, а именно:
Одежда – майки, футболки, шорты, куртки и другая одежда, предназначенная для спорта и активного отдыха всей семьи. Имеются большие размеры.
Обувь– кроссовки, кеды, ботинки, сапоги и другая обувь, предназначенная для спорта и активного отдыха всей семьи. Также имеются большие размеры.
Тренажеры – оборудование для тренировок различного направления, включая инвентарь для фитнеса.
Туристическое оборудование – в разделе представлен богатый выбор походного снаряжения, санок и снегокатов.
Катание на льду – оборудование для игры в хоккей, мужские и женские коньки, сопутствующие аксессуары.
Лыжи – эти разделы предлагают клиентам несколько видов беговых и горных лыж, а также дополнительные аксессуары.
Сноубординг – товары, предназначенные для катания на сноуборде, и их комплектующие.
Единоборства – широкий ассортимент бойцовских перчаток, защиты, специальной одежды и снаряжений.
Командные игры – товары для игры в футбол, регби, волейбол и другие групповые игры.
Летний спорт – в этом разделе находятся товары для велосипедной езды, плавания, тенниса, бега и катания на роликах.
Велоспорт – велосипеды и их комплектующие, а также специальная одежда для велопрогулок.
Аксессуары – необходимые дополнения к вашим занятиям и поездкам: головные уборы, рюкзаки, сумки и т.д.
Кроме этого, в интернет-магазине «Спортмастер» имеются отдельные разделы с уцененной продукцией и исключительно детскими товарами.
Как получить скидку в интернет-магазине «Спортмастер»?
Чтобы выгодно совершать покупки в интернет-магазине «Спортмастер» и сэкономить на приобретении высококачественных брендовых товаров, можно использовать:
акции – на главной странице сайта магазина размещен блок с акционными предложениями;
распродажи – в соответствующем разделе интернет-магазина «Спортмастер» можно найти уцененные товары прошлых сезонов;
промокоды – специальный код, который вводится в отдельное поле при совершении онлайн-покупки и предоставляющий скидку на товары.
Купоны в магазине «Спортмастер»
Чтобы с выгодой покупать товары для спортивных тренировок и активного отдыха в интернет-магазине «Спортмастер», используйте промокод или ссылку на действующую акцию, указанные на этой странице выше. Получить скидку можно в несколько шагов:
выбрать на данной странице акцию;
нажать на нее и перейти по ссылке на сайт интернет-магазина «Спортмастер»;
выбрать товар, участвующий в акции, и оформить заказ.
Или же использовать промокод:
скопировать промокод, который расположен на данной странице выше;
перейти на сайт интернет-магазина «Спортмастер»;
вставить промокод в специальное поле в процессе оформления заказа;
завершить оформление заказа.
Если вы следовали условиям акции, то в результате получите скидку на приобретаемый товар, начисление бонусов на счет или бесплатную доставку в зависимости от того или иного предложения.
Сейчас такие купоны очень актуальны, потому что этот способ значительно сэкономит на заказе качественной продукции из интернет-магазина «Спортмастер».
Как купить товар в интернет-магазине «Спортмастер»?
Зайти в личный кабинет, или зарегистрироваться на сайте, чтобы в дальнейшем получать бонусы по программе лояльности, или выбрать пункт «совершить покупку без регистрации».
Выбрать необходимый товар и перейти к Корзине.
Использовать бонусы при их наличии для покупки продукции интернет-магазина «Спортмастер».
Ввести необходимые данные в пустые поля формы заказа.
Нажать кнопку «Оформить».
Получение товаров из интернет-магазина «Спортмастер» осуществляется посредством курьерской доставки или самовывоза из ближайшего магазина этой сети. Пункт выдачи продукции вы выбираете самостоятельно при оформлении заказа на сайте.
Способ оплаты:
Наличными – доступно при выборе доставки курьером (для физических лиц) или самовывозе;
Банковской картой – при самовывозе.
Надлежащего качества товар можно вернуть в течение 14 дней с момента его приобретения в ближайшем магазине «Спортмастер» или курьерской службой. Возврат денежных средств доступен наличными при возврате товара в розничный магазин сети, а также на лицевой счет заказчика, если возврат товара был осуществлен посредством курьерской службы. В данном случае нужно указать номер счета, на который должен быть осуществлен возврат денежных средств, в прилагаемом заявлении.
Навязчивость продавцов в Спортмастере.
Сегодня у меня знатно полыхнуло в Спортмастере. До сих пор взрывная волна катается вокруг меня.
Пришел я, значит, покупать в вышеозначенный магазин лыжи+боты+палки+крепления. Решил, так сказать, вспомнить молодость, а заодно и поддержать физические кондиции. Рекордов скорости ставить не собираюсь. Так, в свое удовольствие покататься вокруг дачи. У нас там лошади выгуливаются. Как раз в слалом вокруг их какашек потренироваться.
Заранее уже знал что конкретно буду покупать, из нижнего ценового сегмента. Пришел в магазин, тыкаю пальцем поочередно: «вот именно эти лыжи, эти ботинки, эти палки ну и крепления такие-то. Плюс пробка для растирания мази. Длина лыж такая-то, палок такая-то, обувь такой-то размер».
Продавец убежал собирать все в кучку. Прибежал, протягивает бумажку с номером, с которым на кассу идешь и стал спрашивать про всякие допы: чехлы, держалки, тряпочки-щеточки и т.д..
Вежливо прервал его фразой что я его услышал, мне больше ничего не нужно и прошу его помочь донести весь товар до кассы.
Подхожу к кассе. Деваха начинает спрашивать про бонусную карту. Отвечаю, мол, нету такой. Тогда она начинает буквально силой впихивать ее. Типа, даром. Соглашаюсь, чтобы отстала. И она протягивает анкету, где первым делом требуется указать номер телефона.
Короче, написал я там в анкете имя Иван (а я не Иван), без указания телефона. Да и адрес левый дал.
На просьбы вписать телефон отвечаю, что у меня его нету вообще, потому как он не обязан быть.
В глазах кассирши был явно виден разрыв шаблона.
Стою и думаю, что буквально вот-вот через несколько секунд мне дадут чек, заберут деньги и я пойду с покупкой на выход.
На этом я молча засунул бумажник в карман, развернулся и вышел из магазина. Сдается мне, они даже не поняли ничего.
Поехал в другой магазин, но тоже спормастер.
На сей раз продавец оказался таким же тупым целеустремленным, что перечислил все допы, которые он должен впарить, не смотря на мои явные протесты.
И это было не просто перечисление списком, а в форме диалога:
— а не хотите ли еще чехольчик?
— а вот веревочки еще?
всего там были озвучены веревочки, держалочки, чехольчики, носочки, шапочки, парафинчики, утюжки для парафинчиков, рукавички, какие-то щеточки и баночки с мазью.
Дождался когда он закончит, взял у него из рук номерок и пошел на кассу весь такой довольный что отвязался от продавца и больше мне никто ничего впаривать не будет. Если бы я тогда знал насколько сильно я ошибался.
На кассе девушку с надписью Аня на бейджике я сходу почти матом предупредил, что я в курсе всех их допов со слов продавца и ничего не хочу покупать, кроме того, что указано в накладной. Вроде поняла. НО!
-Зря не хотите веревочки купить. Как лыжи-то понесете?
Стоит с круглыми глазами, ресницами хлопает.
Спросила про бонусную карту. Тут я имел неосторожность отказаться от этой самой бонусной карты.
-да вы что!! такая карта, возьмите!
-девушка, не нужна она мне. я не ваш клиент. у меня другие интересы.
-а может все-таки друзьям подарите?
-ну знакомые хотя бы у вас есть?! им подарите.
Кое-как пробили чек. Сгреб в кучу лыжи и вышел. Спускаюсь на эскалаторе вниз, а за мной так полыхает, что как будто весь эскалатор в огне. Так я и шел до машины с факелом сзади (образно).
Нет, я понимаю, что они обязаны это делать и их за это дрючат. Но, блин. не до такой же степени навязчивости, когда им прямо в глаза прямым текстом говоришь о своем нежелании что-либо покупать лишнего, получать в дар и т.д. и.т.д, а они все равно талдычат о своем.
Товарищи управляющие местным спортмастером! Не надо заставлять одного и того же клиента купить всякую хрень двумя-тремя продавцами по 3-4 раза подряд каждый!
Научите продавцов и кассиров слушать покупателя и подстраивать разговор под изменившиеся условия.
Я, например, в следующий раз очень подумаю, посещать ли ваш магазин.
Вот, такое мне нравится. Поэтому и хожу в тот магазин. Причем, только в тот.
Скажите, это со мной что-то не так или некоторые продавцы берега перестали чуять?
Фух, написАл. Факел вроде уменьшился. Имена настоящие.
Unit-тесты в СУБД — как мы делаем это в Спортмастере, часть первая
Меня зовут Максим Пономаренко и я — разработчик в Спортмастере. Имею 10-летний опыт работы в IT-сфере. Начинал карьеру в в области ручного тестирования, затем переключился на разработку баз данных. Последние 4 года, аккумулируя знания, полученные в тестировании и разработке, занимаюсь автоматизацией тестирования на уровне СУБД.
В команде Спортмастера я состою чуть более года и на одном из крупных проектов занимаюсь разработкой автоматизированного тестирования. В апреле мы с ребятами из Sportmaster Lab выступали на конференции в Краснодаре, мой доклад назывался «Unit-тесты в СУБД», и сейчас хочу поделиться им с вами. Текста будет много, поэтому я решил разбить доклад на два поста. В первом мы поговорим об автотестах и тестировании в общем, а во втором я подробнее остановлюсь на нашей системе unit-тестирования и результатах ее применения.
Вначале немного скучной теории. Что такое автоматическое тестирование? Это тестирование, которое проводится программными средствами, и в современном IT оно все чаще и чаще используется при разработке ПО. Связано это с тем, что компании растут, растут их информационные системы и соответственно растет и количество функционала, которое надо тестировать. Проводить ручное тестирование становится всё накладнее и накладнее.
Я работал в одной крупной компании, релизы которой выходят раз в два месяца. При этом целый месяц тратился на то, чтобы десяток тестировщиков руками проверяли функционал. Благодаря внедрению автоматизации небольшой командой разработчиков нам удалось за полтора года сократить время тестирования до 2 недель. Мы не только увеличили скорость тестирования, но и повысили его качество. Автоматические тесты запускаются регулярно и они всегда выполняют весь курс заложенных в них проверок, то есть мы исключаем человеческий фактор.
Для современного IT характерен тот факт, что от разработчика может требоваться не только писать код продукта, но писать unit-тесты, которые данный код проверяют.
Но что делать, если ваша система основывается преимущественно на серверной логике? Какого-то универсального решения и best practices на рынке не существует. Как правило, компании решают эту проблему за счет создания собственной самописной системы тестирования. Вот такая собственная самописная система автоматизированного тестирования была создана на нашем проекте и о ней я расскажу в своем докладе.
Тестируем лояльность
Для начала поговорим о проекте, где мы развернули систему автоматизированного тестирования. Наш проект — это система лояльности Спортмастера (кстати, мы уже писали про нее в этом посте).
Если ваша компания достаточно крупна, то ваша система лояльности будет обладать тремя стандартными свойствами:
Одновременно в Спортмастере работает более сотни разных акций. Акции самые разные: есть товарные, есть приуроченные ко дню недели, есть привязанные к конкретному магазину, есть акции на сумму чека, есть на количество товаров. В общем, неслабо. У клиентов есть бонусы, есть промокоды, которые используются при покупках. Все это приводит к тому, что обсчет любого заказа — это весьма нетривиальная задача.
Алгоритм, реализующий обработку заказа, воистину ужасен и сложен. И любое внесение изменений в этот алгоритм — довольно рискованная штука. Казалось был самые внешне незначительные изменения, могут приводить к достаточно непредсказуемым эффектам. А ведь именно такие сложные вычислительные процессы, тем более реализующие критичный функционал — лучший кандидат на автоматизацию. Проверять руками десятки однотипных кейсов очень накладно по времени. А так как точка входа в процесс неизменна, то один раз описав её, можно достаточно быстро наштамповать автоматические тесты и быть уверенным в работе функционала.
Так как нашей системой активно пользуются, то бизнес будет хотеть от вас чего-то нового, жить в ногу со временем и быть клиентоориентированным. В нашей системе лояльности релизы выходят раз в два месяца. Значит, каждые два месяца нам нужно проводить полный регресс всей системы. При этом, естественно, как и в любом современном IT, разработка не попадает сразу от разработчика на продакшн. Она зарождается на контуре разработчика, затем последовательно минует тестовый стенд, релизный, приемочный и только потом оказывается на продакшене. Как минимум на тестовом и на релизном контурах нам нужно проводить полный регресс всей системы.
Описанные свойства являются стандартными для практически любой системы лояльности. Давайте поговорим об особенностях нашего проекта.
Технологически на 90% логика нашей системы лояльности серверная и реализована на Oracle. Есть выставленный клиент на Delphi, который выполняет функцию АРМ-администратора. Есть выставленные веб-сервисы для внешних приложений (например веб-сайт). Поэтому весьма логично, что если мы будем разворачивать систему автоматизированного тестирования, то будем делать это на Oracle.
Система лояльности в Спортмастере существует более 7 лет и создавалась единичными разработчиками… Среднее количество разработчиков на нашем проекте в течение этих 7 лет составляло 3-4 человека. Но за последний год наша команда сильно увеличилась, и теперь над проектом трудятся 10 человек. То есть в проект приходят люди, которые не знакомы с типовыми задачами, процессами, архитектурой. И есть повышенный риск того, что мы будем пропускать ошибки.
Для проекта характерно отсутствие выделенных тестировщиков как штатных единиц. Тестирование, безусловно, есть, но тестированием занимаются аналитики, помимо своих прочих основных обязанностей: по общению с бизнес-заказчиками, пользователями, проработкой требований к системе и т.д. и т.п… Несмотря на то, что тестирование проводится очень качественно (особенно это уместно упомянуть, так как кому-то из аналитиков может попасться на глаза этот доклад), эффективность специализации и концентрации на чем-то одном никто не отменял.
Учитывая всё вышесказанное, для повышения качества выдаваемого продукта и уменьшения сроков разработки, идея автоматизации тестирования на проекте кажется весьма логичной. И на разных этапах существования системы лояльности отдельные разработчики предпринимали усилия, чтобы покрыть свой код юнит-тестами. Это в целом был достаточно разрозненный процесс, где каждый использовал свою архитектуру и методы. Общими для юнит-тестов были итоговое результаты: тесты разрабатывались, какое-то время использовались, складывались в версионное хранилище файлов, но в какой-то момент переставали запускаться и забывались. В первую очередь это происходило по тому, что тесты были привязаны больше к конкретному исполнителю, а не проекту.
На помощь приходит utPLSQL
Знаете что-нибудь про Стивена Фейерштейна?
Это умный дядька, который длительную часть своей карьеры посвятил работе с Oracle и с PL/SQL, написал на эту тему достаточно большое количество трудов. Одна известная его книга так и называется: «Oracle PL/SQL. Для профессионалов». Именно Стивену принадлежит разработка решения utPLSQL, или, как оно расшифровывается, Unit Testing framework for Oracle PL/SQL. Решение utPLSQL было создано в 2016 году, но над ним продолжают активно работать и выпускать новые версии. На момент доклада последняя версия датируется 24 мартом 2019 года.
Что же это такое. Это отдельный опенсорный проект. Весит пару мегабайт с учётом примеров и документации. Физически представляет собой отдельную схему в базе данных ORACLE с набором пакетов и таблиц для организации юнит-тестирования. Установка занимает несколько секунд. Отличительной особенностью utPLSQL является простота эксплуатации.
Глобально, utPLSQL представляет собой механизм для запуска юнит-тестов, где под юнит-тестом понимаются обычные оракловые пакетные процедуры, организация которых соответствует некоторым правилам. Помимо запуска в utPLSQL хранится лог всех ваших тестовых запусков, а также есть внутренняя система отчётности.
Давайте посмотрим на примере, как выглядит код unit-теста, реализованный по данной методике.
Итак, на экране представлен код типовой спецификации пакета с unit-тестами. Какие есть обязательные требования? Пакет должен иметь префикс «utp_». Точно такой же префикс должны иметь все процедуры с тестами. В пакете в обязательном порядке должны присутствовать две стандартные процедуры: «utp_setup» и «utp_teardown». Первая процедура вызывается перезапуском каждого unit-теста, вторая — после запуска.
«utp_setup», как правило, подготавливает нашу систему к запуску unit-теста, например, создает тестовые данные. «utp_teardown» — наоборот, все возвращает к исходным настройкам и сбрасывает результаты запуска.
Вот пример самого простого unit-теста, который проверяет нормализацию введенного номера телефона клиента к стандартному для нашей системы лояльности виду. Каких-то обязательных стандартов, как писать процедуры с unit-тестами, нет. Как правило, осуществляется вызов какого-либо метода тестируемой системы, и результат, возвращенный данным методом, сравнивается с эталонным. Важно, чтобы сравнение эталонного результата и полученным происходило через стандартные utPLSQL-ные методы.
В юнит-тесте может быть любое количество проверок. Как видно из примера, мы делаем четыре последовательных вызова тестируемого метода по нормализации номера телефона и после каждого вызова оцениваем результат. При разработке юнит-теста надо учитывать, что существуют проверки, которые никак на систему не влияют, а после некоторых надо откатываться к исходному состоянию системы.
Например, в представленном юнит-тесте мы просто форматируем входной номер телефона, что никак на систему лояльности не влияет.
А если мы пишем юнит-тесты по методу создания нового клиента, то после каждой проверки в системе будет создан новый клиент, что может влиять на последующий запуск теста.
Вот так unit-тесты запускаются. Допустимо два варианта запуска: запуск всех юнит-тестов из конкретного пакета или запуск конкретного юнит-теста в конкретном пакете.
Вот так выглядит пример внутренней системы отчетности. По результатам работы юнит-теста utPLSQL строит маленький отчёт. В нём мы видим результат по каждой конкретной проверке и общий результат выполнения юнит-теста.
6 правил автотестов
Перед тем как приступать к созданию новой системы автоматизированного тестирования системы лояльности, совместно с руководством мы определили принципы, которым наши будущие автотесты должны соответствовать.
А во втором посте через пару дней я расскажу, что мы сделали и каких результатов добились.