Эта тема претендует на такую же вечную, как софт/хард-скиллы, первично бытие или сознание, что было раньше — курица или яйцо :) Даже среди коллег я встречала мнение, что manual QA не очень-то полезны: «Чё там делать, сиди себе, monkey-testing лепи». А с темпами развития ИИ QA должны были ещё больше испугаться, вот же Copilot от GIT и Microsoft и миллион менее известных, но не менее популярных нейросетей, которые уже пишут код, они что, пачку тестов не сделают, да ещё и автотестами покроют?..
Дисклеймер:
Я работаю тестировщиком уже около восьми лет, сейчас — на проекте Свой Банк. До этого ещё семь лет работала в веб-студии, занимающейся разработкой приложений, связанных с ресторанным бизнесом и доставкой еды. Дальше — моё маленькое философское рассуждение о том, заменит ли нейросеть мою работу, исходя из того, что я вижу в it.
TL;DR: ИИ работает в контексте больших объёмов данных и [ПОКА] не обладает собственным сознанием, критичностью мышления и пониманием, ЗАЧЕМ это всё, а следовательно, не может принять решение о качестве продукта → [ПОКА] не заменит тестировщика.
Что такое качество и нужны ли QA?
Я нечасто слышала этот вопрос на собеседованиях, но он кажется важным. На многих проектах именно тестировщик определяет, нет ли в новой фиче блокер/критикал багов, может ли ветка быть влита в общий код, да и часто обладает властью дёрнуть стоп-кран для деплоя в прод.
Определений и терминологии в тестировании предостаточно. Не касаясь громоздких ISTQB, Куликова с его базовым курсом тестирования ПО, приведу лаконичную цитату из Lee Copeland («A Practitioner's Guide to Software Test Design»):
По своей сути тестирование — это процесс сравнения того ’что есть’ с тем, ’как должно быть.
Да, как правило, это монотонная, занудная, кропотливая работа. Как золотоискатели, QA собирают по крупицам информацию, строя единый образ, модель функционала, приложения, на основе которой проектируется дальнейшая стратегия тестирования, которая, в свою очередь, конкретизируется в тест-плане, декомпозируется на покрытые тест-кейсами домены, acceptance criteria и так далее. По-настоящему хороший QA должен видеть общую картину того, «как должно быть» и как внутри этой машины происходит взаимодействие между компонентами системы, как изменение одной детали повлияет на работоспособность целого компонента или системы в целом.
Таким образом, формируется какой-то контекст. Например, компания разрабатывает приложение с каталогом алкогольных напитков для искушённых сомелье. Мы не можем продавать такие напитки людям моложе 18. Но аудитория приложения живёт в стране, по законодательству которой запрещена продажа алкоголя лицам моложе 21 года. А как мы узнаем возраст пользователя? Можем ли мы это проверить? И если можем, то как? А если знаем как, то какие проверки можем считать достоверными и такими, которые нас устроят, то есть валидными? А самое главное — зачем нам это проверять?
Последний вопрос мне кажется самым важным. Именно он позволяет на каждом этапе тестирования оценить, что вообще и зачем делает тестировщик, видеть системно целостную картину процесса разработки. Видеть контекст — значит понимать, что в заданных условиях QA должен проверить то-то и то-то, соблюсти кучу очевидных и, что куда важнее, неочевидных условий, и сопоставить то, что получается в итоге, с тем, что ожидает заказчик ПО или конечный пользователь. Получается, что качество продукта легко измеряется тем, насколько он соответствует ожиданиям того, кто им пользуется или кто за него платит.
Чем человек отличается от ИИ: продуктивное и репродуктивное мышление
Если говорить упрощённо, то репродуктивное мышление позволяет нам воспроизводить какие-то модели, паттерны. Например, однажды родители научили нас чистить зубы и посещать стоматолога для исключения проблем с зубами. В учёбе мы опытным путём выяснили, что если потратить больше времени на изучение чего-то → шанс получения высокой отметки многократно возрастает. Я упрощаю для наглядности, но в целом схема верна: мы повторяем за кем-то разработанную не нами модель.
А вот продуктивное мышление ещё называют творческим или мышлением на основе творческого воображения. По сути это способность человеческого мозга порождать новые решения, делать новые открытия, рождать новые мысли / идеи, которые не просто повторяют или улучшают ранее сделанные решения, а позволяют найти принципиально новый способ реализации того или иного функционала, реализовать новый подход. Что интересно, новые решения не рождаются из пустоты, а возникают после многократных повторений и исследований, то есть на фундаменте репродуктивного мышления, но это тема для другой статьи :)
Чем отличается ещё: критическое мышление
Тут уместно ещё одно отступление про критическое мышление. Упрощённо, это способность человека делать обоснованные выводы, анализируя, соотнося поступающую информацию с имеющимся набором данных (или опыта, или жизненных убеждений, или факторов внешней среды, или всё вместе). Ещё проще: на вход поступает информация → человек взвешивает её рациональность, разумность, достоверность ещё как-то по миллиардам критериев → и в результате принимает как true либо отвергает как false и строит свою стратегию, исходя из полученного результата. Мы каждый день производим множество таких операций самого мелкого (например, какой чай утром пить) и куда более высокого абстрактного уровня (как тестировать какую-то фичу). Чаще всего они неосознаваемы, но всегда, всегда имеют под собой какие-то критерии анализа и отбора итоговых решений, диаграмму перехода состояний, если хотите.
Нейросеть — «всего лишь» мощнейшая высокоуровневая библиотека
Её решения живут в пределах заданного контекста, а весь контекст находится в такой многовариантной реальности, которая не укладывается ни в один чат, как не укладывается человеческая жизнь в одну книгу. Нейросеть не почувствует угрызений совести, если приложение будет продавать алкоголь вашему 13-летнему сыну-подростку просто потому, что он нажал «Да, мне есть 18 лет», а не загрузил соответствующий документ. Ей всё равно, будет ли много таких детей, а для вас или бизнеса — законодательные последствия. Я сейчас буду говорить как полный дилетант, но она руководствуется только одним критерием — огромнейшим, пусть и исключительно умно и быстро обрабатываемым, массивом данных. Если в массиве данных есть ответ — она его склеит, воспроизведёт, репродуцирует, сгенерирует, но сделает это [без уважения] без учёта миллиона сопутствующих условий и контекста и не придумает принципиально новый подход. Добавите контекст — перегенерирует с учётом нового условия, но перечисление всех нужных условий никогда не уложится в бесконечные онлайн-сессии, а конечная валидация результата всё равно останется за человеком, который анализирует её ответ. У нейросети нет критичности, нет полного контекста, есть только объёмная библиотека данных, из которых она сверхбыстро выдаёт максимально подробный и подходящий, а главное — человекочитаемый ответ.
Приведу пример из личного опыта. Однажды я случайно нашла проблему на промсреде, просто заметив, что в одной из таблиц несколько дней назад перестали появляться записи. Я искала другую информацию, никакие алерты не срабатывали, в логах не сыпались многочисленные errors. Мне просто показалось это странным. Под этим «странно» лежит сотня-другая человекочасов, проведённых за чтением спецификаций, анализа лога и просто тестирования. В результате фикса IT-отдел сэкономил бизнесу какое-то измеримое количество денег. У нейросети нет этого контекста, нет критичности к состоянию каких-то таблиц. Если не задать подобную проверку осознанно, нейросеть не станет её инициировать.
Да, с помощью ИИ мы существенно экономим время на проработку каких-то рутинных сценариев, «скармливая» условному chatGPT массив входных данных и получая развёрнутый, объёмный, покрывающий множество условий код. Мы получаем терабайты тестовых данных и сохраняем кучу времени на всевозможные валидации и отработку действительно повторяющейся, монотонной работы.
Но [пока] в работе с ИИ остаётся невидимый актор — тот, кто вводит все эти условия и задаёт тот самый контекст. Тот, кто решает, что для проверки пользователя на возраст нам нужен документ, удостоверяющий его дату рождения, кто постарается учесть неочевидные нюансы и в конечном итоге примет решение, подходит ли эта проверка и по каким критериям мы поймём, что она пройдена. И вот его — человека с критическим мышлением и способностью к творчеству — ИИ [пока] не превзойдёт.
Две цитаты и один анекдот
Старинный тестерский анекдот: заходит однажды тестировщик в бар. Забегает в бар. Пролезает в бар. Танцуя, проникает в бар. Крадётся в бар. Врывается в бар. Прыгает в бар. Заказывает кружку пива, 2 кружки пива, 0 кружек пива, 999999999 кружек пива, ящерицу в стакане, −1 кружку пива, qwerty кружек пива. Бар работает. Заходит пользователь, спрашивает, где туалет. Бар взрывается.
Эта же мысль, по-моему, более многословно выражена в книге «Искусство тестирования программ» Г. Майерса, Т.Баджета и К.Сандлера:
Мы открыли для себя одну непреложную истину тестирования: программа, на тестирование которой разработчик затратил много часов, может быть легко, в кратчайшие сроки, разрушена неискушённым пользователем, пытающимся решить задачу, для которой пользовательский интерфейс или само программное обеспечение совершенно не предназначены.
Но лично мне нравится, как об этом говорит упомянутый тут Lee Copeland:
If you don’t try strange things, you know the users will.
Мой вольный перевод:
Если вы не будете пытаться делать странные вещи, знайте, что пользователи будут.
Кажется, и этот анекдот, и обе цитаты наглядно подтверждают мои аргументы. Да, возможно, когда-нибудь разработчики ИИ превзойдут сами себя и нейросети станут не просто мегакрутым, максимально человечным и общедоступным революционным инструментом. Но пока… Работаем, коллеги :)