Описание задачи
JavaTestGen — это бенчмарк для оценки способности моделей генерировать тесты для Java-кода. Задачи заключаются в генерации unit-тестов на основе исходного Java-кода и контекста проекта. Датасет содержит 227
задач.
Тестируемые навыки моделей: Instruction Following, Code Perception, Completion, Testing
Авторы: Дмитрий Салихов, Павел Задорожный, Павел Адаменко, Родион Левичев, Айдар Валеев, Дмитрий Бабаев
Мотивация
Датасет оценивает способность моделей:
- Понимать реальный код на Java;
- Генерировать исполняемые тесты;
- Работать с Maven-проектами и зависимостями.
Описание датасета
Поля датасета
Каждый вопрос в датасете содержит следующие поля:
instruction
[str] — строка, содержащая формулировку задания по генерации теста;inputs
— Вводные данные, формирующие задание для модели. Могут включать одну или несколько модальностей - видео, аудио, изображение, текст.class_name
[str] — название Java-класса, для которого требуется сгенерировать тест;test_class_name
[str] — название тестового класса, который необходимо сгенерировать;code
[str] — строка с исходным кодом Java-класса;
outputs
[list] — одномерный массив строк размера n_samples, где n_samples — количество требуемых сэмплов для подсчета pass@k;meta
— Метаданные, относящиеся к тестовому примеру, но не используемые в вопросе (скрытые от тестируемой модели).id
[int] — уникальный идентификатор примера;instance_id
[str] — уникальный идентификатор примера;repo
[str] — строка, содержащая ссылку на репозиторий, из которого взят код;base_commit
[str] — строка с хэшем коммита, фиксирующего версию кода;image_name
[str] — строка с именем docker-образа, используемого для тестирования;test_command
[str] — строка с командой для запуска тестов внутри контейнера;fn_test
[str] — строка с путем к тестовому файлу в проекте;source_code
[str] — строка с исходным кодом Java-класса
Промпты
Для задачи были подготовлены 10 промптов, которые были равномерно распределены по вопросам по принципу "один вопрос – один промпт". Шаблоны в фигурных скобках в промпте заполняются из полей внутри поля inputs
в каждом вопросе.
Пример промпта:
```
Вам дана реализация класса {class_name}. А вот сам код:
{code}
Ответ должен быть оформлен так:```java
<code>```Ваша задача — написать тестовый класс {test_class_name} на JUnit5 для данного класса. Покройте все сценарии, даже если в коде нет соответствующих веток. Напишите тесты для обычных, пограничных и некорректных случаев. В каждом тесте только один assert. Имена методов должны быть осмысленными. Добавьте необходимые импорты и аннотации.
```
Создание датасета
Датасет состоит из 227 задач, собранных из публичных Java-репозиториев на GitHub. Для каждой задачи предоставлены исходный код, команда тестирования, параметры окружения и промпт. Оценка проводится через выполнение сгенерированных тестов в Docker-контейнере с установленным проектом.
Метрики
Для агрегированной оценки ответов моделей используются следующие метрики:
Pass@1
: Метрика Pass@1 вычисляет среднюю долю успешных случаев среди всех обработанных, где случай считается успешным (оценка 1), если первое сгенерированное решение проходит все модульные тесты, и неуспешным (оценка 0) в противном случае.
compile@1
: Метрика compile@1 показывает долю сгенерированного кода, который успешно компилируется без ошибок.