TestOps: писать автотесты недостаточно |
14.05.2021 00:00 |
Автор: Руслан Ахметзянов, Qameta Software Совсем недавно я услышал замечательную историю о проекте внутри крупной российской IT-компании, ищущей руководителя в отдел тестирования. Задача была простая: есть отдел из 20 человек, которые за последние несколько лет наколбасили несколько тысяч автотестов и спроектировали пачку тестов ручных. В целом все работало, но СТО на собеседовании сказал примерно следующее: “Ваша задача — выкинуть все это к чертям собачьим и сделать нормально. А то когда предыдущий QA Lead ушел, мы поняли, что вся эта инфраструктура у нас нигде не используется.” Ситуация невообразимая. Так не бывает. У нас точно не так. У нас же не так? Проблемы “works on my machine” и “ответственность за нерабочий код лежит на том, кто его деплоит”, ровно о том же. И пока разработчикам рассказывали про спасительный DevOps, тестировщики и QA-специалисты как-то со стороны смотрели на это “не шаля, никого не трогая, примус починяя”. Ну что, пришло время набросить и на этот вентилятор. В этой статье мы с Артемом Ерошенко из Qameta Software попробуем разобраться, что такое “делать тестирование нормально” в новых проектах. Что делают тестировщики? А что должны делать? Конечно, тестировщики-автоматизаторы пишут и поддерживают тесты. Это первое, что приходит в голову. А когда они написаны, их нужно использовать. Это тоже кажется очевидным? Чтобы понять, что это так, ответьте для себя на 4 вопроса про ваши тесты:
Если ответ хотя бы на один вопрос вызывает у вас сомнения, продолжайте читать. Так что же у нас есть в автоматизации?
Итак, высокоуровневые грабли разобрали, давайте посмотрим, что можно сделать, чтобы их избежать! Пишем автотесты Выбирайте подходящие инструменты. Обратите внимание, что подходящий инструмент и “правильный” — это не всегда одно и то же:
Внедряйте новое постепенно Представьте новый проект, в котором, помимо Web- или API-тестов, появляются экспериментальные штуки типа А/B-тестов или тестов на скриншотах с хранением в новой БД, а что-то параллельно пишут на только что занесенном Kotlin. И это в проекте из 200-300 тестов. Каждый новый инструмент по отдельности хорош, но вместе они делают процесс тестирования максимально непрозрачным.
Делайте код-ревью.
Запускаем автотесты Первый совет как для автоматизаторов, так и для ручных тестировщиков — научитесь работать с Docker. Это не очень сложно, но очень полезно в ситуациях, когда хочется проверить какие-то специфичные кейсы вроде “нужен вот такой-то плагин на Jenkins” или “хочу сравнить стабильность Selenoid и Selenium Grid, как бы их потестить”. Понятное дело, что сразу в продакшене вам такие эксперименты проводить не разрешат (или это все будет очень сложно и долго). Посмотреть немного про Докер можно в Ошибке Выжившего. Запускайте тесты на пулл-реквесты. Новый код может ломать проект, и это нормально для молодых проектов, поскольку структура может часто меняться в условиях появления новой функциональности или глубокого рефакторинга старой. А вот отвалившийся прод — это не нормально ни для кого. Давайте посмотрим, что можно сделать, чтобы все было хорошо:
Запускайте тесты часто. У вас всегда будут плавающие проблемы, которые могут быть вызваны разными факторами:
Чтобы свести количество таких факторов к минимуму, старайтесь гонять тесты на прогретой машине. Запускайте тесты по максимуму: в разных окружениях, в разных ветках, в разное время, — пока у вас нет сотен и тысяч тестов, которые будут часами выполняться на агенте, скорее всего, машина все равно будет простаивать. Найдите потребителя результатов ваших тестов. Помните, что тесты вы пишете не для себя, поэтому результаты тестирования должны быть удобными.
Разбор результатов Перезапускайте ваши тесты. Тесты могут падать из-за миллиона разных факторов, начинающихся от проблем с сетью, заканчивая Луной в доме Сатурна. Отследить и исправить такие факторы можно не всегда, но если тесты проходят нестабильно, гоняйте их до позеленения. На самом деле, конечно, двух-трех прогонов будет достаточно, чтобы отсеять странности от проблем. Для этого в Gradle есть официальный Test Retry Gradle plugin, а в Maven — Rerun Failing Tests. На ранних этапах flaky тесты и их причины будут вашему заказчику неинтересны, ему будет интересно общее состояние продукта. Однако, чтобы не было ощущения, что мы “замыливаем” проблемы с красными тестами, делая несколько прогонов, можно запускать два инстанса с перезапуском (для заказчиков/стейкхолдеров) и без него (для себя, чтобы была возможность увидеть каждое непонятное падение, пострадать и посыпать голову пеплом). Настройте категории тестов. Как только вы начнете постоянно гонять тесты в разных бранчах, в разное время, в разных окружениях, определение причин падения теста и категоризация проблем станет актуальной задачей. Просто представьте, что 5% ваших тестов падают, при этом всего у вас 100 тестов — разбор пяти падений не займет много времени. Но если за день запустить тот же самый тест-суит 10 раз, то придется разбирать и в 10 раз больше падений, жертвуя своим драгоценным временем (которое мы пытаемся сделать более продуктивным). В Allure Report эта задача решается тем, что у тестов есть четыре основных статуса: skipped, broken, failed, passed, — а также есть простой JSON-реестр категорий, который по Regex-сообщениям распределяет свалившиеся тесты. В результате получается понятный список категорий, по которым разложены тесты, и вам надо разбирать только 3-5-7 причин падения 5% из 1000 свалившихся тестов. Для команд побольше, в Allure TestOps есть возможность создавать дефекты и работать с категориями прямо из web-интерфейса, так что если сейчас прям кольнуло в сердце — попробуйте взглянуть на разбор результатов по-новому. Не копите технический долг Этот пункт сильно пересекается с созданием зоопарка инструментов, о котором я писал ранее, с одним дополнением. Каждый раз, когда вы обнаруживаете непонятное поведение инструмента, теста или инфраструктуры, заводите задачки на их исправление, а не оставайтесь пленниками костыльных обходных способов эти баги проигнорировать. На самом деле, если вы справитесь с тем, чтобы автоматизировать рутину по запускам тестов, разбором результатов или обновлением документации, у вас появится время на работу с техническим долгом. Чаще всего в техническом долге оказываются довольно интересные задачи: допилить инструменты, разобраться с инфраструктурой, — такие штуки обычно позволяют разобраться с проблемами, на которые многие забивают, хотя они сделают из вас более ценного специалиста, а в долгосрочной перспективе будут приносить выгоду компании. Показываем отчеты Отчеты нужны не вам. Помните об этом. Вам для понимания происходящего будет достаточно почитать стектрейс. Но большинству ваших коллег этого достаточно не будет.
Поймите, кому будут полезны отчеты о ходе и результатах тестирования и организуйте постоянную и стабильную инфраструктуру для их генерации. Итоги Давайте посмотрим, что у нас получается в итоге:
А теперь давайте посмотрим на определение TestOps в Википедии: TestOps is often considered a subset of DevOps, focusing on accelerating the practice of software testing within agile development methodologies. It includes the operations of test planning, managing test data, controlling changes to tests, organizing tests, managing test status, and gaining insights from testing activities to inform status and process improvements. Вы поймете, что все это звенья единой системы, которая и называется TestOps. В апреле я постараюсь подготовить более "фундаментальную" статью о TestOps, в которой постараюсь рассказать об этом подходе не столько со стороны практик и тулинга, сколько со стороны ее места в мире разработки, принципах и месте в DevOps. P.S. Важно понимать, что Ops в контексте TestOps значит operations в тестировании, а не operations на стороне клиента. |