Автотесты, ночные сборки, экстремальный Agile. Как мы тестируем наши продукты

dd4748cd82f7e350669f11af26663c07.jpg


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

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

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

Разработчики, собирают пачку кода в отдельную версию. И пишут описание:»Новый интернет-магазин в облаке. Изменения такие-то. Добавили кучу новых страниц». И обязательно прикладывают огромный changelog с несколькими сотнями коммитов.

Всё это поступает к тестировщикам. Этот процесс я называю «экстремальным Agile» — мы работаем по чётким итерациям. Отклоняться от этих правил тестирования нельзя.

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

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

Раньше мы делали так. Составляли подробные описания прецедентов:»Нажимаем сюда. В поле ввода пароля должны появиться кружочки. Если они не появляются, что-то не так».

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

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

Пример — список кейсов по работе с задачами в «Битрикс24».

— Сохранение задачи работает? Отлично, идём дальше.
— Комментарии к задаче добавляются? Прекрасно, следующий пункт.

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

Дальше мы за несколько этапов проверяем, как выполняются системные действия.

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


11b67c2ac3c33de644d475caf5f59805.png

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

Параллельно с прогоном автотестов мы делаем:

1 этап


— Изучаем описание изменений от разработчиков.

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

Удобен ли рабочий сценарий? Всё сделано «по-человечески»? Параллельно проводим ещё и usability-тестирование.

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

Мы автоматизировали огромную часть рутины. И постоянно думаем что можно «докрутить».

Вопросы к разработчикам мы обсуждаем в отдельных чатах под каждое обновление. У нас нет «сломанного телефона» — в чате присутствуют все сотрудники, причастные к выпуску.

2 этап


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

— На этом этапе мы «отлавливаем» большинство ошибок. Разработчик может что-то упустить в «обычном» описании, но changelog покажет все ошибки.

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

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

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

3 этап


Затем начинается третий этап — анализ обращений клиентов по ошибкам в продукте:

Обращения регистрируются в нашей системе трекинга ошибок Mantis. Почему мы её используем? Это историческое наследие, Mantis «трудится» у нас уже лет 15.

Я несколько раз предлагал коллегам найти что-то другое. Начинали анализировать и каждый раз оказывалось, что в Mantis есть все что нам нужно. Мы отлично интегрировали её в работу: связали с «открытыми линиями» и техподдержкой.

Весь журнал обращений клиентов по поводу ошибок мы берем в Mantis.

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

Разработчик утверждает, что ошибка исправлена — мы проверяем. Если ошибка не исправлена, возвращаем тикет в работу.

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

4 этап


После верификации переходим к четвертому этапу — повторному прогону тестового плана.

Ситуация на рынке может поменяться. Если вчера условия были одни, то завтра они могут измениться. У нас нет жесткой привязки к ТЗ, которое мы разработали полгода назад. Поэтому мы прогоняем тестовый план еще раз.

5 этап


Пятый этап — сборка пакета обновлений и выгрузка в эталонную среду тестирования: Она находится в облаке Amazon и представляет собой отдельный портал «Битрикс24».

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

6 этап


На шестом этапе мы организуем группы закрытого тестирования.

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

К этому этапу почти все ошибки уже выловлены. Пользователи рассказывают, насколько им удобно работать по разным сценариям. Можно назвать это дополнительyым usаbility-тестированием.

7 этап


Потом наступает очередь седьмой этап — полузакрытое тестирование:

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

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

Здесь мы тоже оцениваем удобство работы с продуктом, удобство сценариев.

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

Этот этап может занимать 2–3 недели. Мы постоянно вносим изменения по фидбэкам клиентов.

После тестирования на стейдже обновление выкатывается в production. А мы радостно пишем обучающие статьи и снимаем видео.

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

Cloud first


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

Выпуск коробочного обновления — более сложный процесс. Если вы знакомы с обкаткой сырого продукта, то знаете, что такое тестовая среда. В облаке у нас уже есть готовая инфраструктура с заданными версиями PHP и MySQL со своей кодировкой. Там всё настроено и работает — можно ставить продукт и спокойно тестировать.

С «коробкой» все по-другому. Вариативность «сред» у клиентов огромна. Мы стараемся стимулировать пользователей к переходу на более высокие версии PHP, но многие делают это неохотно.

По факту, немалая доля клиентов начинают менять версию PHP, только когда их заставляют хостеры. Добавьте к этому разнообразие версий MySQL и кодировок.

Вотпочему тестирование «коробки» намного сложнее и дольше по времени.

Автотестирование


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

Созданием автотестов у нас занимается специальный отдел.

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

Поэтому мы разбили большие сценарные автотесты на более мелкие независимые сценарии, кейсы.

Для работы с автотестами у нас есть самописный фреймворк на .NET и отдельный фреймворк для работы с базой.

Почему у нас продукт на PHP, а фреймворк для автотестов на .NET?

По моему многолетнему опыту работы, для автотестирования UI подойдёт любой фреймворк, который будет работать. Мы используем .NET, потому что он отлично подключается к UI и прекрасно работает с Selenium, ну и мне он просто нравится.

Как проходит среднестатистический автотест?

  • Подготавливаем тестовую установку для проверки сценария, через API, минуя интерфейс
  • Робот проверяет заданный кейс. Например, задачи.


То же самое с очисткой данных. Проверили сценарий. Если всё хорошо, то задачу удаляем не через интерфейс, а через API — вызываем метод удаления задачи. Робот быстро очищает данные за собой.

Раньше мы тестировали только через интерфейс.

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

Smoke-тесты и ночные автотесты


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

Обычно мы используем их для финальной проверки.

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

Сейчас наш полный цикл ночных автотестов наконец-то стал укладываться в ночное время. Раньше он занимал около 32 часов. Ускорить автотесты удалось с помощью виртуальных машин и постоянных оптимизаций фреймворка и самих тестов.

А вот чего в нашем процессе тестирования нет, так это постоянной интеграции. Она нам не подходит, потому что есть накопленное «историческое наследие».

Мы не можем отказаться от какой-то части инфраструктуры, которая очень велика и сложна. Так что мы пока робко пробуем внедрить небольшие элементы классической continuous integration.

Ночные сборки


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

Как это происходит?

Самописная система обращается к сборщику обновлений и автоматически ставит все возможные обновления. Смотрит, что упало на этапе установки.

Затем машина собирает все имеющиеся дистрибутивы — у нас их 8 редакций — и ночью развёртывает локальные установки.

Ночные билды мы не выкладываем в открытый доступ. Система опять фиксирует, всё ли установилось. Если всё в порядке, запускаются все автотесты.

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

Модульные-тесты


Большая часть наших тестов — UI, а не Unit. Модульные тесты мы используем только для важных компонентов: главный модуль, CRM, интернет-магазин.

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

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

Для прогона модульных тестов используем стандартный инструмент PHP unit. Просто вызываем метод. Смотрим, как он работает с параметрами, которые даются на вход. И смотрим ответ.

URL checker


Это моя давняя идея. Возможно, кому-то она будет полезна.

Робот на вход:

  • Получает корневой URL сайта,
  • Собирает URL всех страниц,
  • Переходит по ним и смотрит, не вылезут ли где ошибки.


У нас есть готовый список возможных ошибок: ошибка 404, fatal error, ошибки базы, JS-ошибки, невалидные символы, битая картинка, ошибка 500.

Всё, что можно найти и вытащить из кода страницы, робот складывает в лог со скриншотами.

Написать такого робота крайне просто, но он может сэкономить много времени.

Component checker


Наш component checker работает так:

  • Компонент помещается на страницу
  • Она сохраняется, обновляется
  • Мы смотрим, что выдаётся в текстовом виде и в коде


Эффективный и простой тест для веб-разработки.

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

Визуальный эксперимент


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

На них сразу видно, какие элементы продукта с чем связаны: на что влияет сохранение заказов, или что влияет на само сохранение? Что и как может повлиять на схему складского учета?

Так тестировщик может быстро оценить — на какие элементы повлияют изменения в том или ином компоненте.

Качество тестирования


Мы отказались от избыточного тестирования. Я сторонник принципа достаточности.

Сейчас мы очень мало тестируем на «защиту от дурака». Например, в поле ввода денежной суммы, скорее всего, не будем вводить буквы.

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

Но для нас этот подход перестал работать — в наших реалиях хватает «достаточного» тестирования.

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

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

* * *
Мне интересно ваше мнение о прочитанном. Как проводится тестирование в вашей компании?

© Habrahabr.ru