Какого размера должен быть автотест?
Назад

Какого размера должен быть автотест?

Какого размера должен быть автотест?

В наше время в мире многие ИТ-отделы крупных компаний внедряют автотесты. Пытаются это делать и небольшие компании. Увы, не у всех получается прийти к заветной цели – чтобы автотесты именно минимизировали ошибки, а не множили проблемы. К сожалению, пока нигде не описан простой и понятный рецепт «Как внедрить автотесты на предприятии без проблем», поэтому большинству приходится учиться на собственном опыте.

Начинается эта история у большинства стандартно: сейчас научим несколько сотрудников писать тесты на Vaness’е, потом напишем фичи (от «feature» – расширение сценариев автотестов) вообще на все процессы – как на собственные, так и на типовые - и наступит на предприятии счастье: все функциональные блоки будут автоматически проверяться, ошибки в рабочую базу отныне не попадут и т.д.

Но на практике многих ожидают сюрпризы:

  • оказывается, что тем сотрудникам, которых мы обучили писать автотесты, надо еще и в процессах разбираться, либо наладить связь с аналитиками или бизнесом, поскольку они покрывают тестами только то, что им понятно, но толку от таких автотестов мало;
  • вроде бы уже написали 30 сценариев (которые было удобнее написать), а ошибки в рабочую базу как попадали, так и попадают. Что мы делаем не так?
  • наши тесты перестают работать чаще, чем код, который мы проверяем. Их постоянно приходится актуализировать. Нам не хватает людей для поддержки текущих сценариев, а мы ведь еще и 20% функционала тестами не покрыли;
  • у нас половина объема сценариев прибирают возникший мусор в данных после прогонов теста, и этот код тоже надо поддерживать, ведь он тоже падает, неужели без этого никак?
  • тесты выполняются уже полдня, а написана только их часть, что же будет дальше?
Примечание: сценарные автотесты могут быть написаны не только с использованием Vaness’ы, но и с помощью «:Сценарное тестирование 3.0».

Бывает и так, что после двухлетней разработки 150 тестов компания понимает, что от их «внедрения» проблем стало больше, чем было. И вот только теперь команда поняла, какая должна была быть правильная структура автотестов, и теперь требуется всё переписать заново.

А можно ли заранее учесть чужой опыт и пойти сразу верным путем?

На текущий момент нет стандартов написания автотестов и заведения для них тестовых данных, описанных где-нибудь на ИТС. К тому же всё индивидуально от клиента к клиенту: разная специфика проверяемых бизнес-процессов, заведения тестовых данных, особенностей процесса разработки т.д. Но тем не менее выделить общие «грабли», на которые наступают довольно многие, можно.

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

Для ответа на данный вопрос выделим два типа автотестов:

Независимые автотесты

Такие сценарии подготавливают все необходимое (НСИ, остатки и т.д.) сами для себя. Случается, что после выполнения они даже приводят тестовую базу в исходное состояние, избавляясь от «мусора». Такие тесты запускаются произвольное количество раз подряд на любой копии базы без предварительной подготовки. Но при этом:

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

Зависимые от данных автотесты

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

  1. придется вести и актуализировать эталонные базы – небольшие легковесные базы, в которых есть минимально необходимый набор данных для ровно одного прогона сценариев;
  2. придется более вдумчиво анализировать тестируемые процессы – чтобы переложить их с реальных данных на «эталонные»;
  3. наверное, придется что-то почитать про devops – ведь разворачивать эталонные базы каждый раз вручную не очень сподручно.

Какие выбирать?

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

Для чего нужны автотесты?

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

Цели внедрения автотестов

Цели минимум

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

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

Цели максимум

1. Проверка большого числа сценариев: как собственных, так и типовых (мы их тоже могли поломать при доработках конфигурации вендора), в которых потенциально могут возникнуть ошибки.

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

3. Быстрое исправление ошибок при тестировании чернового релиза при обновлении от вендора (при должном уровне используемых инструментов devops):
  • запускается многопоточный автоматизированный прогон всех автотестов;
  • автотесты спроектированы таким образом, что аллюр с ошибками максимально информативный;
  • разработчик видит описание ошибок, по кнопке из devops-окружения разворачивает те базы, на которых выполнялись тесты и случились ошибки;
  • выполняет анализ и исправление проблем с того шага, на котором упали тесты. Таким образом уже через несколько минут после падения тестов                           разработчик  получает возможность расследовать ошибку без необходимости ее эмулировать в тестовой среде.
4. Для настройки тестовых баз. Если используются эталонные базы, на которых выполняются автотесты, в них заведен минимальный набор тестовых данных – разработчик может начинать разработку по новой задаче с них. В этом случае в автоматическом режиме могут запускаться автотесты, которые подготавливают тестовые базы для начала разработки: например, автотесты могут настроить интеграцию на свежем тестовом контуре между несколькими базами.

5. Если сценарии автотестов олицетворяют реальные процессы предприятия в эталонном виде – с их помощью могут формироваться и автоматически актуализироваться видеоинструкции для пользователей.

Варианты запуска автотестов

Варианты использования минимум

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

Варианты использования максимум

1. Автоматизированный прогон тестов. Из-за их большого количества прогон может осуществляться в несколько потоков. Способы управления потоками могут быть разные:

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

2. Прогон автотестов на различных вариантах тестовых баз (на эталонной базе, на файловой базе разработчика, на копии серверной базы и т.д.) с автоматизированным накатом проверяемой функциональности (из ветки GIT, по указанному пути к конфигурациям/расширениям, с извлечением конфигураций из указанных баз, где выполнялась разработка и т.д.).

Сравнение типов автотестов по размеру и способу подготовки данных

Для сравнения двух типов автотестов давайте обозначим тестируемый сценарий. Пусть наш автотест будет проверять оформление продажи простого товара «Мяч» за 1500 руб. (без особых сложностей в учете типа маркировки и т.д.)

Независимые автотесты 

Под независимыми автотестами подразумеваем самодостаточные автотресты, которые сами подготавливают для себя все необходимые данные и вследствие этого могут запускаться произвольное количество раз на любой копии базы. Здесь не нужно думать о том, как вычистить «мусор» из базы после прогона теста, практически не нужно заботиться о том, какие данные в базе уже заведены. Зачастую такие тесты даже сами для себя устанавливают необходимые значения констант. Фиксируем главный жирный плюс – это универсальные тесты, которые можно запускать произвольное количество раз на любых копиях баз.

Какие шаги должен выполнить независимый автотест?

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

1. Подготовительные шаги:

  • создать номенклатуру;
  • оформить закупку – сформировать и провести «Приобретение товаров и услуг» (далее «ПТУ»);
  • оформить «Заказ» клиента.

2. Основные шаги:

a. оформить продажу:

  • сформировать и провести «Реализацию товаров и услуг» (далее «РТУ») на основании «Заказа» клиента, убедиться в отсутствии ошибок заполнения и проведения;
  • проверить движения РТУ: наличие движений по регистру накопления «Выручка и себестоимость продаж» – должна присутствовать одна запись по товару с заранее определенной суммой. Примечание: вариантов как проверить корректность осуществления продажи много, в нашем случае это не так важно.

На практике подготовительных действий для осуществления продажи может понадобиться намного больше ввиду длинной цепочки закупки или производства, наличия маркировки, взаимодействия с ЕГАИС, необходимости создания характеристик и серий, согласования заказа и т.д. В данном случае мы сознательно упрощаем этот процесс, поскольку детали в нашем случае не так важны. В реальных же процессах подготовительных шагов может быть 20, а шагов непосредственно сценария, который требуется протестировать всего два. Таким образом, подготовительные действия в независимых автотестах вполне могут занимать 70–90% от общего объема сценария.

Какие ошибки могут возникать в процессе работы независимого автотеста?

1. Создание номенклатуры:

  • может возникнуть ошибка при заполнении номенклатуры. Например, если поменялся состав реквизитов/элементов формы;
  • может возникнуть ошибка при записи номенклатуры. Например, если разработчик допустил ошибку в коде событий записи объекта.
.2. Оформление закупки:

  • может возникнуть ошибка заполнения ПТУ. Например, в связи с некоторыми изменениями (или из-за ошибки в коде) данный товар не удается подобрать в документ из-за несоответствия предопределенному отбор;
  • может возникнуть ошибка проведения ПТУ. Например, из-за только что привнесенной ошибки в код проведения документа.

3. Оформление Заказа клиента:

  • может возникнуть ошибка заполнения заказа. Например, в связи с некоторыми изменениями (или из-за ошибки в коде) по товару не удается выбрать действие «Отгрузить»;
  • может возникнуть ошибка проведения Заказа. Например, из-за какой-то новой проблемы с кодом проведения закупки. Например, не хватает остатка по одному из регистров накопления, связанных с запасами и резервами.

4. Оформление и проверка продажи (основная часть сценария):

  • может возникнуть ошибка заполнения РТУ. Например, при заполнении РТУ на основании Заказа клиента не подобрался нужный товар (проблема с остатками по регистру накопления «Заказы клиентов»), или подобрался в недостаточном количестве, или подобрался с неверной ценой (в соответствии с выбранным для клиента соглашением);
  • может возникнуть проблема проведения РТУ. Например, у нас есть доработка, согласно которой при проведении РТУ формируется запись в некий служебный регистр, консолидирующий продажи менеджеров в разрезе разных метрик, а в событие «Перед записью» набора записей этого регистра был добавлен ошибочный код, который породил ошибку;
  • может возникнуть проблема проверки суммы продажи. Например, у нас есть доработка, которая в некоторых случаях влияет на формирование движений РТУ в регистр накопления «Выручка и себестоимость продаж», и она не запланировано повлияла не некорректное изменения суммы продажи.

Конечно же, это лишь часть примеров тех ошибок, которые могут возникнуть по проверяемому процессу на реальных данных, на практике их может быть намного больше. Совершенно безобидные изменения в одном функциональном блоке зачастую приводят к неожиданным ошибкам в других блоках. Но из приведенного примера следует важный промежуточный вывод: ввиду того, что подготовительные действия в тестовом сценарии занимают 75% от общего объема сценария, то шанс , что наш автотест «упадет» на подготовительных действиях, а не на самой продаже, которую требовалось проверить, в 3 раза выше.

Какие проблемы таит «независимость» такого типа автотеста?

Автотесты падают не там, где ожидалось

Может показаться, что это даже и хорошо, что автотест по проверке продажи дополнительно проверяет еще и формирование номенклатуры, закупки и заказа. Больше спектр выявляемых ошибок – меньше шансы «пронести» ошибку в рабочую базу, не так ли? Но далеко не всегда требуется просто «не пропустить ошибку», зачастую нужно распределить большое число ошибок по функциональным блокам, чтобы понять общий масштаб проблем тестируемой конфигурации. И не обязательно выполнять проверку формирования номенклатуры, закупки и заказа именно в составе автотеста по продаже. Это можно сделать отдельными сценариями, и ошибка все равно не попадет в прод. 

Рассмотрим пример: есть 50 основательных независимых автотестов, которые для разных типов товаров/контрагентов проверяют работу основных функциональных блоков предприятия: склад, закупка, производство, продажа, казначейство. И все они выполняют шаги от А до Я, как рассмотренный выше автотест по продаже, т.е. сами для себя готовят НСИ, остатки и прочее и только потом выполняют основное проверяемое действие.

Допустим, мы собираемся перейти на новый LTS релиз от вендора, понимаем, что ошибок будет много. Команда подготовила черновую конфигурацию нового релиза: перенесли и адаптировали все доработки, победили ошибки основных и отложенных обработчиков обновления. Теперь нужно выявить неочевидные ошибки в самых важных для предприятия процессах, чтобы на самые «проблемные» блоки выделить больше ресурсов разработчиков и тестировщиков для исправления. Обновление серьезное, разнообразных ошибок, предположим, будет никак не меньше 100. Как же хорошо, что на все функциональные блоки есть такие крутые автотесты. Сейчас запустим на любой копии с загруженной конфигурацией чернового релиза и раскидаем ресурсы команды по функциональным блокам для исправления! Звучит хорошо.

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

  • все 50 автотестов упали на одинаковой ошибке при создании номенклатуры. Мы поняли какие функциональные блоки проблемные? Нет. Имея такой разнообразный реестр сложнейших сценариев автотестов, мы выявили… только одну ошибку из 100. Вся команда сидит и ждет, пока ошибка по номенклатуре будет исправлена и все автотесты смогут продвинуться дальше;
  • быстро исправили ошибку, снова запустили автотесты. Опять все 50 упали на… другой ошибке по номенклатуре. Похоже, надо вдумчиво вручную протестировать все варианты заполнения и записи номенклатуры, чтобы зря не гонять все автотесты, не исправляя одну за другой ошибки… Тестируем и исправляем вручную, остальная команда продолжает находиться на низком старте. А бизнес, ну и бухгалтерия, конечно же, ждет обновление как можно скорее!
  • потратили много времени, вручную нашли и исправили все ошибки по номенклатуре. Запускаем автотесты. Так, теперь они упали где-то на других начальных этапах: складских операциях по вводу остатков, предварительных закупках и т.д. Да, конечно, эти ошибки тоже надо было найти, но мы ведь ожидали увидеть полный спектр ошибок сразу после запуска автотестов!
  • через неделю исправлений и ручного тестирования складских операций и прочих начальных заведений товаров получили проблемы оформления заказов… исправляем, мы уже близко…
  • еще через неделю исправлений и ручного тестирования всех оставшихся операций по некоторым блокам некоторые автотесты, наконец, смогли «упасть» там, где они и должны были упасть при ошибке, но еще не все… исправляем и перезапускаем дальше, скоро мы дойдем до конца! Правда его пока не видно…

В результате цель «быстро увидеть все типы ошибок и распределить ресурсы на их исправление по функциональным блокам» не достигается, потому что независимые автотесты слишком восприимчивы к любым ошибкам и чаще всего «падают» не там, где ожидалось. Исправление превращается в длинную череду итераций: исправили очередную ошибку и снова запустили все тесты (которые выполняются не за 10 минут). А затем продвинулись к следующей «общей» ошибке.

Как же избежать такой проблемы? Если проанализировать лишь общую ошибку создания номенклатуры, то ее можно было бы решить созданием отдельного автотеста, который проверяет именно создание номенклатуры по всем возможным вариантам. А остальные автотесты могут не создавать себе каждый раз новую номенклатуру, а находить и использовать уже имеющуюся в базе. В этом случае упал бы именно этот тест, который проверяет создание номенклатуры, и это было бы информативно, потому что как раз этот момент и проверялся. Ну и таким же образом все «общие» действия могут быть вынесены в отдельные сценарии, чтобы каждый сценарий падал именно там, где его падение и ожидалось. Конечно, здесь появляется много различных проблем с подготовкой данных и перезапуском тестов, об их решении поговорим при обзоре второго типа автотестов – зависимых от данных.

Сложно писать

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

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

Зачастую в компаниях нет отдельных сотрудников, которые занимаются исключительно разработкой автотестов. Сценарии могут писать «по совместительству» консультанты или программисты. И это даже порой удобно: консультанты хорошо понимают предметную область, а программисты – применимость автотестов к проверке разрабатываемой функциональности и процессу разработки. Но такие специалисты обычно не очень глубоко погружены в нюансы работы Vaness’ы, им сложно выделять достаточно времени на написание длинных и сложных автотестов. Вот внести несложные правки в простые уже написанные тесты – это они смогут.

Сложно актуализировать

Ну а если специалисты по автотестам и имеются, то сколько их в штате: достаточно ли для того, чтобы непрерывно поддерживать эти длинные и сложные автотесты? Если 75% от объема автотестов, это подготовительные действия, то:
  1. такие автотесты будут ломаться в 4 раза чаще после любых изменений в функциональности. Значит, и актуализировать их придется в 4 раза чаще;
  2. для актуализации таких автотестов понадобится в 4 раза больше времени, поскольку они длинные и сложные;
  3. привлекать к актуализации таких автотестов «по совместительству» консультантов или программистов не получится, тут нужны специально обученные люди…
Скорее всего на каком-то этапе, в условиях дефицита рабочих рук, определенному числу специалистов по автотестам придется заниматься исключительно поддержкой уже написанных сценариев, либо тесты будут переставать использоваться, ожидая актуализации.

Сложно анализировать аллюр

Аллюр (отчет о выполнении автотеста) – это не только информация о том, пройден автотест или нет. Это еще и способ быстро найти и воспроизвести ошибку, исправить ее. Аллюром могут пользоваться консультанты и программисты, которые с помощью автотестов отлаживают новую функциональность. Если структура автотеста лаконичная и понятная, сценарий отражает шаги процесса и в нем нет ничего лишнего и отвлекающего, все служебные действия вынесены в библиотечные экспортные сценарии, то в таком случае, пройдясь взглядом по аллюру, можно быстро понять, где ошибка и как ее воспроизвести. Может быть даже в той же базе, в которой выполнялся автотест.

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

Долго выполняется

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

Но если у нас разнообразный набор devops-инструментов, который позволяет запускать автотесты в автоматическом режиме на различных базах и конфигурациях, в том числе и для того, чтобы разработчик после очередной разработки смог сам себя проверить, то в этом случае нам хотелось бы, чтобы все тесты были выполнены максимально быстро. На помощь, конечно, придет многопоточность и параллельный запуск автотестов. Сейчас не будем углубляться в данный аспект, поскольку это тема отдельной статьи. Просто представим, что с devops у нас полный порядок, используется «инфраструктура как код» и мы можем опционально настроить запуск всех 50 автотестов в 50 потоках, чтобы как можно быстрее получить результат их выполнения.

В этом случае общая длительность прохождения всех тестов будет равна длительности выполнения самого тяжелого сценария. А если у нас все сценарии тяжелые и 75% их объема относятся к подготовительным этапам, то делаем простой вывод – все наши автотесты будут выполняться в 4 раза дольше из-за того, что они включают в себя подготовительные этапы.

Давайте разовьем тему нанотехнологий и автоматического многопоточного запуска большого числа автотестов в условиях передового devops-окружения. Этим активно  пользуются и разработчики, и консультанты в том числе. Удобно же: если разработал новую функциональность, то зачем тратить время на ручное тестирование? Пусть сначала машина проверит, что не сломалась старая функциональность. Закончил разработку, запустил все автотесты, ушел на обед, посмотрел аллюр-отчет, и отправился со своим кодом либо в релиз, либо на исправление ошибок. И вот если мы до такого эволюционировали – а это по-настоящему удобно и это не фантазии автора, это применяется на практике – то мы столкнемся с финансовой составляющей этого удобства. 

Допустим, при включенной настройке максимально быстрого прохождения автотестов, алгоритм развернет на каждый из 50 сценариев свою отдельную виртуальную машину и запустит на ней ровно один предназначенный для нее сценарий. А в конце просто «соберет» результаты выполнения всех сценариев с каждой виртуальной машины в общий аллюр-отчет. Мы столкнемся с проблемами в том случае, если в команде много специалистов, запускающих полный пакет автотестов (в условиях сжатых сроков разработки) в таком супер-параллельном режиме, когда каждый разработчик запускает все автотесты не один раз в день. В этом случае мы можем заплатить за тысячи часов работы машин, исполняющих автотесты (пусть даже и не виртуальных, при наличии большого парка физических машин).  Это стоит денег. А теперь вспомним, что у нас 75% от общего объема сценариев занимает подготовка данных. Получается, все наши автотесты могли бы работать в 4 раза быстрее, и мы могли бы сократить затраты на железо в 4 раза? Да, получается так. >

Зависимые от данных автотесты

Основные отличия зависимых автотестов

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

Шаги независимого автотеста по проверке продажи

  1. Создать номенклатуру. Результат: создана «Номенклатура №1».
  2. Оформить закупку. «Номенклатура №1» из предыдущего шага добавлена в создаваемый ПТУ. Результат: проведен «ПТУ №1».
  3. Оформить заказ клиента. «Номенклатура №1» из первого шага добавлена в создаваемый заказ, при резервировании используются товарные остатки с предыдущего шага закупки. Результат: проведен «Заказ клиента №1».
  4. Оформить продажу. «Номенклатура №1» из первого шага добавлена в создаваемую РТУ, используются товарные остатки с шага закупки, используется потребности заказа клиента с предыдущего шага. Результат: проведена «РТУ №1».

Таким образом мы фактически проверили не только продажу, которую изначально собирались тестировать, но целых 4 процесса: создание номенклатуры, закупку, оформление заказа, продажу. Каждый последующий шаг использует результат работы предыдущих шагов. А можно ли разбить этот автотест на четыре атомарных сценария без потери общего качества?

Шаги зависимого автотеста по проверке продажи

А теперь у нас есть четыре атомарных сценария, никак не связанных друг с другом с точки зрения данных, но они выполняют те же самые проверки в совокупности:
  1. сценарий №1: создать номенклатуру. Результат: создана «Номенклатура №99»;
  2. сценарий №2: оформить закупку. Номенклатура №1, которая заранее создана в эталонной базе (что такое «эталонные базы» и с чем их едят – рассмотрим позднее в блоке зависимых тестов), найдена в сценарии по артикулу или GUID, добавлена в создаваемый ПТУ. Результат: проведен «ПТУ №99»;
  3. сценарий №3: оформить заказ клиента. Номенклатура №2, которая заранее создана в эталонной базе, добавлена в создаваемый заказ, при резервировании используются товарные остатки, которые также заранее подготовлены в базе специально для сценария №3. Результат: проведен «Заказ клиента №99»;
  4. сценарий №4: оформить продажу. Номенклатура №3, которая заранее создана в эталонной базе, добавлена в создаваемую РТУ. Используются товарные остатки и потребности заказа клиента, которые также заранее подготовлены в базе специально для сценария №4. Результат: проведена «РТУ №99».

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

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

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

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

Ложка дегтя - нужно подготавливать специальные базы

Эталонные базы – это специальным образом подготовленные тестовые базы (файловые или серверные – неважно), которые используются для прогона автотестов. В такие базы загружается проверяемая конфигурация, а данные заведены минимально необходимые для прогона автотестов, ничего лишнего. Это могут быть как реальные данные, выгруженные из рабочей базы, так и полностью синтетические, заведенные вручную. Если мы ясно понимаем, что мы тестируем и для чего, представляем как выглядит процесс в отрыве от реальных данных, то нам не составит труда отразить его в «эталонном» виде на «виртуальных» данных.

Поскольку мы рассматриваем крайности, то наши «зависимые» от данных автотесты должны быть максимально облегчены. Не будем их загружать шагами по приборке мусора за собой (удаление созданных элементов НСИ, документов и т.д.). Давайте просто вообще не будем решать эту задачу «повторного запуска автотестов». У нас есть небольшая легковесная эталонная база, которая хранится в виде DT файла, она разворачивается за пару минут на нужную базу, на ней прогоняются автотесты, и… А какая нам дальше разница что там тест оставил после себя? Если требуется разобрать ошибки по аллюр-отчету – мы её сохраним и изучим, а если ошибок нет – мы же просто можем перезалить в эту же базу DT заново и снова запустить автотесты! Эталонные базы – это легковесные базы, которые быстро разворачиваются и нужны только для однократного прогона автотестов; для повторного прогона сценариев они перезаливаются.

Какие шаги должен выполнить зависимый автотест?

Только необходимые: чем проще и короче сценарий – тем лучше.

Представим, что совместно с продажей нам не надо проверять предшествующие ей создание номенклатуры, оформление закупки и заказа. Почему? Ну, допустим, потому что в определенной компании эти блоки полностью типовые и с ними проблем не бывает, а вот блок продаж «перепилен» вдоль и поперек, и там проблем хоть отбавляй. В этом случае с любого ракурса будет намного проще один раз в эталонной базе создать номенклатуру, закупку и заказ, а сценарий автотеста будет состоять из примитивнейших действий: найти конкретный «Заказ клиента №456», создать на основании РТУ, провести, проверить движения. Просто, быстро, эффективно. При использовании эталонных баз всегда проще проектировать автотесты таким образом, чтобы они по максимуму использовали заранее подготовленные для них данные, не выполняя лишних действий в сценарии.

При этом лучше всего, если для каждого сценария будут подготовлены «личные» данные: НСИ, остатки и т.д. Потому что гарантированно возникнет ситуация, когда бизнес-процесс поменялся, и для адаптации определенного сценария автотеста нам придется изменить в эталонной базе реквизиты номенклатуры, заказа или чего-то еще. И при этом другие сценарии не должны пострадать.

А если нам все-таки надо проверять и создание номенклатуры, и закупку, и оформление заказа? В этом случае это просто должны быть отдельные сценарии. И чтобы ни сейчас, ни в будущем нам не решать задачу последовательности их выполнения – каждый сценарий должен быть независим друг от друга: свои НСИ, свои остатки и т.д. В таком случае эти сценарии можно запускать хоть последовательно, хоть параллельно, хоть одновременно в одной тестовой базе, хоть «поднять» под каждый сценарий свою базу – неважно, результат будет одинаковым. Поэтому чем более они обособленные,  тем с меньшим количеством проблем мы столкнемся в будущем.

Если какой-то сценарий можно разбить на подчиненные сценарии, потому что там могут быть свои особенности и ошибки – надо этим пользоваться. Например, проверяемая продажа. Должен ли сценарий создавать РТУ на основании Заказа клиента и проводить? Казалось бы, действие не сложное. Но давайте подумаем, какие тут могут быть вложенные сценарии:

  • допустим, у нас «особый» алгоритм заполнения РТУ на основании Заказа клиента, который должен при создании заполнить массу всяких разных дополнительных реквизитов товаров. Будет удобно, если будет написан отдельный автотест, который проверяет именно это – корректность заполнения РТУ на основании Заказа клиента. На вход такой автотест может получать заранее заведенный в эталонной базе Заказ клиента, создавать на его основании РТУ и проверять заполненные реквизиты, сравнивая их с эталонными данными, описанными в сценарии автотеста;
  • если мы торгуем разными типами товаров, по которым отличаются процессы (например, мы можем продавать и газировку, и водку – для которой всё в разы сложнее) – сценарий проверки заполнения РТУ может быть свой на каждый тип товаров;
  • представим, что у нас в зависимости от типа товаров есть различные варианты проведения РТУ: особые движения и т.д. Нужен ли отдельный сценарий на каждый тип товара? Конечно, будет намного информативнее, если по результату прохождения всех автотестов мы будем видеть, что у нас не просто «сломалась продажа», а «сломалась продажа не маркируемого алкоголя», при этом все остальные 7 вариантов продажи – работают корректно. В данном случае, если мы тестируем именно проведение РТУ, а ее заполнение тестирует отдельный сценарий, насколько уместно создавать РТУ заново в данном автотесте? Это избыточно. Намного дешевле для автотеста найти заранее подготовленную не проведенную в эталонной базе РТУ и только провести, после чего проверить сформированные движения или отчет. В этом случае сценарий будет максимально простым: найти и провести, но не менее эффективным.

В чем выигрывают зависимые атомарные автотесты?

Падает там, где ожидалось

Давайте еще раз вернемся к рассмотренному выше примеру:: мы выполняем большое обновление на новый релиз вендора, готов черновой релиз, ожидаем увидеть 100+ ошибок, имеем 50 написанных автотестов по всем важным функциональным блокам, хотим быстро понять «масштаб бедствия». Отличие на этот раз в том, что все 50 автотестов атомарные, выполняющие строго минимальные набор действий: что проверяем – то и делаем, не больше. Все НСИ, остатки товаров, взаиморасчетов и т.д. – всё заранее заготовлено в эталонной базе, мы на нее накатили черновой релиз, прошли основные и отложенные обработчики обновления, все заранее заготовленные тестовые данные в базе обновились естественным и типовым образом.

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

И в этот раз итоговый аллюр, в котором сценарии разбиты по функциональным блокам,  будет информативным. Допустим, из общего числа тестов у нас 10 по блоку продаж, из которых упало 8, а по другим блокам упало либо по одному тесту, либо не упало вовсе – и теперь мы сможем сразу же большую часть команды отправить на ручное тестирование/исправление блока продаж. Почему? Потому что, если у нас упал самый базовый автотест создания номенклатуры, то это будет отдельно упавший один сценарий, все остальные сценарии используют уже созданную для них в эталонной базе номенклатуру. Таким образом, автотесты становятся максимально устойчивыми к влиянию на них ошибок в смежных функциональных блоках, в подавляющем большинстве случаев падают в тех местах, которые они и призваны были проверить. Общий аллюр становится максимально информативным.

Легко писать

Очевидно, что сложность и объем автотеста прямо пропорциональны количеству выполняемых им действий в режиме предприятия. У нас сокращается потребность в сценарии «держать в уме» созданные на предыдущих шагах подготовительные данные, но появляется другая – искать эталонные данные, что куда проще технически: есть артикулы, коды, наименования, GUIDы наконец.

Легко актуализировать

Итак, чем проще и меньше автотест:
  • тем меньше нужно потратить сил на его адаптацию; 
  • тем меньше мы имеем вероятность, что произошедшие в конфигурации изменения заставят нас актуализировать сценарий автотеста в принципе, ведь он выполняет минимум действий;
  • тем ниже требования к специалистам, которым придется этот тест адаптировать. Вероятно, с адаптацией сценария простого автотеста при изменении бизнес-процесса в этом случае справятся даже и консультант с программистом – ведь структура сценария написана, нужно буквально подправить одну-две строчки в тексте. А может быть и того проще – нужно будет изменить кое-какие данные в эталонной базе, а в режиме предприятия вся команда работать умеет, а не только специально-обученные писатели автотестов;
  • при обновлениях от вендора тестовые данные в эталонных базах модернизируются автоматически в процессе выполнения обработчиков обновления, т. е. не потребуется адаптировать шаги сценария, которые подготавливают данные.

Легко анализировать аллюр

Когда автотест выполняет минимум действий, его способен понять даже пользователь. Ну что тут сложного: и я ищу РТУ с номером 956 в списке РТУ, и я открываю найденный документ, и я нажимаю кнопку «провести и закрыть» - и вот тут у нас ошибка при проведении. В этом случае аллюр становится удобным инструментом, позволяющим быстро понять на каком шаге автотеста у нас ошибка.

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

Быстро выполняется

Чем меньше шагов проходит автотест, тем быстрее он выполняется по времени. Как следствие:
  • мы быстрее будем получать результат выполнения автотестов, команда чаще и в различных ситуациях будет автотестами пользоваться в принципе;
  • при большом количестве сценариев и частоте запуска  сэкономим на железе.

Какие есть проблемы?

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

Но все-таки кое-какие ограничения и обязательства использование эталонных баз на нас накладывает:
  • на любой базе автотесты мы уже не запустим. Только эталонные базы, где есть заранее подготовленные данные, которые используют сценарии;
  • DT эталонной базы (могут быть разные варианты хранения) пользователям придется вручную накатывать на тестовую базу перед запуском автотестов, если этот процесс еще не автоматизирован;
  • а если автоматизирован, то нам придется где-то в общедоступном и желательно быстром (s3) месте хранить этот DT, чтобы различные devops-алгоритмы его оттуда забирали и накатывали на тестовые базы;
  • нам придется решить вопрос с тем, кто и из какого места имеет возможность вносить изменения в эталонные базы. Если у нас в процессе разработки всё жестко и без зеленого аллюра новая функциональность не имеет права попасть в релиз, то ошибка, допущенная при редактировании данных в эталонной базе, может парализовать работу отдела. Поэтому желательно ограничить доступ к редактированию эталонных баз для определенного круга ответственных лиц, лучше даже организовать исключительно монопольный доступ. Для обеспечения стабильной работы отдела разработки лучше в обязательном порядке прогонять автотесты после любого изменения эталонных баз, версионировать их. А в s3 (откуда devops-алгоритмы забирают эталонные DT для прогона автотестов) новый измененный DT должен попадать только после того, как измененная эталонная база прошла все старые сценарии.

Дополнительные плюшки

Если мы пишем автотесты, которые не просто что-то там проверяют, а именно являются отражением реальных эталонных процессов предприятия, то эталонная база в таком случае может являться не только базой для прогона автотестов – на ней можно начинать разработку новых задач программистам, ведь в ней есть все необходимые заведенные НСИ и остатки. Кроме того, она лёгкая и быстро разворачивается. Если разрабатывается совсем новая функциональность, то консультант может сначала добавить нужные данные в эталонную базу, а затем программист начнет работу над задачей.

И тут уже можно автоматизировать кто во что горазд:
  • разработчики больше не ждут админов сутками, чтобы получить свежую копию рабочей базы для начала разработки. Взял DT эталонной базы, накатил продуктивные CF/CFE и вперед. Ну или нажал кнопку в devops-окружении «создать базу для разработки», а алгоритм за 15 минут развернул для разработчика новую базу, накатив туда эталонный DT и свежий CF из репозитория. А если надо начать разработку не из рабочей конфигурации, а на основании кода из определенной веткиGIT – мы это тоже можем запросить опционально.
  • есть сценарии, которые позволяют настраивать интеграции между несколькими эталонными базами? Тогда разработчик может «заказать» для себя в пару кликов комплект эталонных баз и парочку сценариев автотестов сверху, которые настроят ему стартовое окружение за 15 минут так, как если бы он сам это делал полдня.

Выводы

Мы рассмотрели две крайности:

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

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

Попытаемся все-таки вывести какой-то субъективный рецепт: если вы по каким-то причинам не можете себе позволить вести эталонные базы или вам важно выполнять тестирование каждого процесса от А до Я – видимо, придется все же работать с длинными независимыми автотестами. В подавляющем же большинстве случаев короткие атомарные автотесты в связке с эталонными базами позволяют эффективно и без лишней головной боли использовать сценарные автотесты.




Назад