Я хочу рассказать, как я сделала отчет о дифференциальном тестировании (сравнение двух функций на одних данных) через ИИ. Знаю, что многие уже применяют ИИ и в хвост и в гриву, но также много тех, кто пока не умеет этого делать.

Картинка на заставку, конечно же, тоже сделала через ИИ (нанобанано)
Картинка на заставку, конечно же, тоже сделала через ИИ (нанобанано)

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

Содержание

Мой пример

1. Проведение тестирования

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

Поэтому это и называется задачей исследования — мы не сразу заменяем старую функцию новой, а проводим эксперимент:

  1. делаем вторую функцию, 

  2. готовим тестовые данные, 

  3. прогоняем их на старой и новой функции,

  4. анализируем результат — если “да, круто вышло!”, то заменяем одну функцию на другую, если “чет не то”, то думаем дальше.

Вторую функцию сделали, моя задача была — провести шаги 2-3. И частично 4, нужно красиво-понятно отобразить отчет о тестировании, чтобы аналитик его изучил и потом уже принимал решение.

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

Данные собрала, потом написала автотесты. Выглядят они примерно так (для простоты понимания будем сравнивать ФИО):

Опечатка в отчестве;99;Назина;Ольга;Евгеньевна;Назина;Ольга;Еквгеньевна

Что тут есть:

  • Описание теста

  • Коэффициент похожести

  • ФИО первой пары в трех ячейках

  • ФИО второй пары

Обычно в автотестах делают разные файл — что подается на вход, что получаем на выходе. Но у меня выходной параметр всего один (коэффициент), поэтому он записывается сразу внутри теста.

Если автотест упадет, выглядеть это будет так (допустим, вместо коэффициента 99 вернулся 0):

 Expected:  [2/Similarity]:99

     Actual:  [2/Similarity]:0

Input data: 1. Опечатка в отчестве;99;Назина;Ольга;Евгеньевна;Назина;Ольга;Еквгеньевна

Etalon data: 1. Опечатка в отчестве;99;Назина;Ольга;Евгеньевна;Назина;Ольга;Еквгеньевна

Result data: 1. Опечатка в отчестве;0;Назина;Ольга;Евгеньевна;Назина;Ольга;Еквгеньевна

Это стандартный вывод автотестов:

  • Input data — что на входе

  • Etalon data — что я ожидаю

  • Result data — что тест ожидает

Да, в моем случае Input и Etalon совпадают, но зато такое решение работает как для разных входных-выходных файлов, так и для одного.

Итак, автотесты я сделала. Получилось их довольно много, больше 300, так как много разных сценариев нужно было покрыть + на каждый сценарий надо было сделать 2-6 тестов (тест-дизайн и все такое).

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

Прогнала на старой функции — 200 падений (то есть новая работает лучше).  Сохранила результаты прогона в файл old.txt. 

Огонь, осталось оформить!


2. Оформление результата

Я подумала — как я хочу видеть результат? Хорошо бы в виде таблички, чтобы сразу видно “эта функция справилась, эта нет”.

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

Описание

Коэф

ФИО 1

ФИО 2

testOldFunction

testNewFunction

Комментарий

testOldFunction работает, testNewFunction нет

1. Опечатка в отчестве

99

Назина

Ольга

Евгеньевна

Назина

Ольга

Еквгеньевна

Успех

FAIL / ожидает 0

По сути я просто вытащила все колонки из теста и добавила в конец 3 новые для анализа результата:

  • testOldFunction — как справилась старая функция

  • testOldFunction — как справилась новая функция

  • Комментарий — чтобы подсвечивать “тут некритично, а тут обратите внимание!”

Что писать в колонки прогонов:

  • Успех — если в файле прогона функции НЕТ этого теста, значит, он не упал, а прошел успешно. По крайней мере я сохранила в файл именно падения.

  • «FAIL / ожидает такое-то значение», чтобы было видно, что ждем мы (2 колонка) и что выдал тест.

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

  • Старая функция работает, новая нет

  • Новая функция работает, старая нет

  • Обе не работают

И внутри еще сгруппировать (помните ведь, что падений было 200+, да?). Я посмотрела глазками отчеты и выделила некоторые повторяющиеся падения. 

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

  • Сразу увидеть масштаб проблемы — сколько таких сценариев сломалось

  • Понять, что еще сломалось — увидеть все другие падения отдельно, а не так, что через раз будет “снова двойное имя”.

Так, работа понятна! Но делать ее вручную — это ж капец сколько времени! Вытащить из результатов падений что-то одно (например, строку Result data), чтобы открыть в экселе, а не блокноте, чтобы это все скопировать и вставить в таблицу в конфлюенсе.

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

А вот робот с рутиной справляется на ура! Главное, четко сформулировать ему, что именно ты хочешь. И показать, в каком виде тебе это нужно сделать. А у меня и это есть, вон табличка с примером.

Я выгрузила эту табличку из конфлюенс в ворд-файл test_results_demo.docx, чтобы скормить ИИ. Правда, пришлось внести коррективы уже на этом этапе. Исходно то я и правда вставила в конфлюенс тест «как есть», где фамилия, имя и отчество находятся в разных ячейках.

В конфлюенсе это выглядело очень красиво, а вот в выгрузке в ворд — нет. Слишком много колонок, табличку просто разносит. Да, можно сделать альбомную ориентацию, но я так прикинула… И собрала ФИО в одну колонку, просто выписав каждый компонент на новую строку. Тоже удобно вышло, и в ворд выгрузилось нормально.

Ну и все, теперь у меня есть все нужные данные и примеры для ИИ, для удобства я положила их все в папку C:\tmp. 

Работать я решила в Cursor — это инструмент, внутри которого есть разные ИИ-модели. Фишка работы в нем — ты пишешь свои пожелания на простом русском языке, а он сам все делает. То есть пишет все необходимые скрипты, запускает, прогоняет… Очень удобно!

У меня Cursor Pro, но для этой задачи подошла бы и бесплатная версия. Я не меняла ИИ-модель, какую он предложил (Composer 2.5), с той и общалась. На компьютере установлен питон, потому что для похожих задач ИИ часто использует его.


3. Промпт для Cursor-а

Осталось написать промпт! У меня получилось вот так:

Проанализируй результаты прогона двух автотестов:

C:\tmp\testOldFunction.txt

C:\tmp\testNewFunction.txt

Оформи результат в файле C:\tmp\test_results.docx по примеру внутри файла C:\tmp\test_results_demo.docx.

Пополни таблицу, выписав туда все падения тестов. Структура таблицы, в результатах прогона смотри по «Input data»:

- Описание — 1 колонка из Input data

- Похожесть — 2 колонка

- ФИО 1 - 3, 4, 5 колонки, значение новой колонки идет с новой строки (получится 3 строки)

- ФИО 2 - 6, 7, 8 колонки, значение новой колонки идет с новой строки (получится 3 строки)

- testOldFunction и testNewFunction — пиши "Успех", если в результатах прогона соответствующего файла НЕТ такого теста (по описанию сверяй) и "FAIL", если тест упал. И допиши, что тест ожидает из строки « Actual:  [2/Similarity]:97» (в данном примере это будет 97)

Колонку "комментарий" оставляй пустой.

Сгруппируй результаты верхнеуровнево так:

- testOldFunction работает, testNewFunction нет

- testNewFunction работает, testOldFunction нет

- оба падают

Внутри эти групп добавь группы:

- двойные имена, если в описании теста есть слова “двойное имя”

- (другая группа и как роботу понять, кто к ней относится)

- все остальные

Вот и все. Важно просто прописать роботу все подробности — что в какой колонке смотреть, что в каком случае писать. И он все сделает!

Курсор немного пошуршал, анализируя мои файлы, составляя питон-скрипт для работы, выполняя его… И выдал результат!

Дальше копируем из ворда в конфлюенс, пишем свои выводы, добавляем комментарии, где это надо, и передаем аналитику красивый отчет!


Итого

Я даже представить боюсь, сколько времени у меня бы ушло на красивый отчет без помощи ИИ. Это ладно, когда надо десять падений выписать, но 200+... Как хорошо, что теперь есть, кому делегировать эту работу!

Что для этого нужно сделать? Только составить промпт. А для этого сесть и подумать:

  • Какие данные надо проанализировать (в моем случае это результаты двух прогонов автотестов).

  • В каком виде составить отчет — лучше всего показать ему пример. Я сделала одну строку, а робот заполнил все остальные. 

  • Как именно заполнять — что в какую колонку писать. Если нужна группировка, расписываем, какая именно.

И всё. Отдаем промпт курсору и идем пить чай, пока робот работает =))

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