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

Поэтому я хочу показать на конкретном примере из жизни, где еще несколько лет назад пришлось бы делать красивый отчет в ручную, а теперь его делает робот за пару минут. Возможно, это вдохновит вас тоже попробовать сделать нечто похожее =))
Содержание
Мой пример
1. Проведение тестирования
Тестировала задачу исследования — изменение коэффициента похожести для поиска дублей. То есть функция определения коэффициента уже есть, работает. Но решили «тут поменять, там поменять», и посмотреть, станет ли лучше.
Поэтому это и называется задачей исследования — мы не сразу заменяем старую функцию новой, а проводим эксперимент:
делаем вторую функцию,
готовим тестовые данные,
прогоняем их на старой и новой функции,
анализируем результат — если “да, круто вышло!”, то заменяем одну функцию на другую, если “чет не то”, то думаем дальше.
Вторую функцию сделали, моя задача была — провести шаги 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+... Как хорошо, что теперь есть, кому делегировать эту работу!
Что для этого нужно сделать? Только составить промпт. А для этого сесть и подумать:
Какие данные надо проанализировать (в моем случае это результаты двух прогонов автотестов).
В каком виде составить отчет — лучше всего показать ему пример. Я сделала одну строку, а робот заполнил все остальные.
Как именно заполнять — что в какую колонку писать. Если нужна группировка, расписываем, какая именно.
И всё. Отдаем промпт курсору и идем пить чай, пока робот работает =))
