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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




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

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

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 работает так:

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

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

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

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


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

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

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

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


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

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

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

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

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

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

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

Комментарии (14)


  1. crazylh
    09.07.2018 19:03
    +1

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

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

    Разве это не задача Feature Owner/Product Owner/Analytic описывать сценарии по человечески, до того как они попадут к разработчикам? Не он ли должен описывать совместно с QA что и как тестировать?


    Почему у вас QA определяют то как выглядит продукт?


    1. 1cbitrix Автор
      09.07.2018 23:49

      QA дают рекомендации с точки зрения удобства использования. Они, конечно, могут ошибаться. Конечное решение принимает Product Owner.


  1. staticY
    09.07.2018 21:33

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

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


    По-моему, что-то не так…


    1. 1cbitrix Автор
      09.07.2018 21:34

      Нет, наш процесс описан верно.


    1. 1cbitrix Автор
      09.07.2018 23:47

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


  1. FrankySin
    10.07.2018 00:07

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

    Выглядит скорее как "экстремальный Waterfall". Возможно, я неправильно понял, но сначала разрабы собирают релиз, а только потом QA тестируют? Даже если вы работаете итерациями, это все равно выглядит как waterfall


    1. 1cbitrix Автор
      10.07.2018 00:08

      Здесь описана одна итерация, без подробностей.

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


  1. qwez
    10.07.2018 09:25

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

    Ночные сборки с запуском тестов это и есть CI, на сколько могу судить.

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

    Смок тест 32 часа? Да даже есть 8 (ночь) все равно как-то не тянет. Или какие тесты вы запускаете ночью? На картинке с видами тестирования у вас регресс в колонке с ручным. Наверное, только полный регресс может столько времени занимать


    1. 1cbitrix Автор
      10.07.2018 11:44

      Ночные сборки с запуском тестов это и есть CI, на сколько могу судить.

      И да, и нет. «Красивый» классический CI он же как: разработчик коммитит код или банч исправлений, сразу же стартует сборщик. А там и автотесты стартуют, а потом, в случае ошибки, разработчик уведомляется об этом. А потом итерация повторяется.

      У нас, в силу некоторых особенностей, есть элементы CI, представленные как раз в ночных сборках.

      Смок тест 32 часа? Да даже есть 8 (ночь) все равно как-то не тянет. Или какие тесты вы запускаете ночью? На картинке с видами тестирования у вас регресс в колонке с ручным. Наверное, только полный регресс может столько времени занимать

      Нет-нет, смок тесты по крупным модулям, например CRM, идут максимум 1,5-2 часа. Это, пожалуй, самый большой модуль с множеством важных бизнес-кейсов. Средний смок тест идет 15 минут.

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


  1. nook
    11.07.2018 18:09

    Как проходит среднестатистический автотест?
    • Подготавливаем тестовую установку для проверки сценария, через API, минуя интерфейс

    Можно ли поподробнее об этом API?


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


    1. 1cbitrix Автор
      12.07.2018 12:42

      Конечно. Мы реализовали так.

      Есть php-файл с набором методов для работы с сущностями продукта: создание задач с предустановленными параметрами, создание лида, удаление поста в ЖЛ и т.д. На каждый тестируемый модуль. Необходимые параметры создания сущности мы передаем через гет-параметры (что делаем, с какой сущностью, какие параметры у сущности или действия). Далее процесс автотестирования прецедента, например, удаления задачи выглядит так:

      1. Робот дергает через урл наш php-файл, передав туда метод очистки старых демо-данных. Имена сущностей у нас предопределены, поэтому всегда знаем, что относится к тестовым данным, которые необходимо очистить

      2. Робот дергает через урл наш php-файл, передав через гет необходимый набор параметров: создаем задачу, с крайним сроком, с id ответственного номер такой-то, и т.д.

      3. Робот через UI идет по сценарию: переходит в список задач. У созданной выше задачи кликает на пункт меню «Удалить». Проверяет, что задачи в списке нет


      1. nook
        12.07.2018 14:53

        Еще до перечисленных действий должна быть как-то подготовлена сама установка Б24 или БУС. Это автоматизировано?

        Кроме Мастера установки других способов развертывания продукта не предлагается. Для своих задач писали обертку над установщиком: без участия пользователя скачивает и распаковывает дистрибутив, проходит все шаги мастера с заранее заданными настройками (без интерфейса, selenium, phantomjs или других зависимостей).


  1. Wolonter
    12.07.2018 10:52

    Почему вы решили, что применяете гибкие методологии разработки?

    У вас:

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


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

    Разработчик сам не способен, ему нужен секретарь?


    1. 1cbitrix Автор
      12.07.2018 12:44

      Почему вы решили, что применяете гибкие методологии разработки?

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

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

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

      4-й ваш пункт я не понял. Автоматизацией занимается у нас отдел автоматизированного тестирования. Они же делают чек логов прогона тестов.

      Разработчик сам не способен, ему нужен секретарь?

      Согласен с вами, хочу со временем передать эту часть разработчикам =). Пока, как историческое наследие, это делают ребята из отдела автоматизации.