JEP 233: Generate Run-Time Compiler Tests Automatically
Автоматическая генерация тестов для компиляторов времени выполнения
| Ответственный | Igor Ignatyev |
| Тип | Feature |
| Область | Implementation |
| Статус | Closed / Delivered |
| Выпуск | 9 |
| Компонент | hotspot / compiler |
| Обсуждение | hotspot dash compiler dash dev at openjdk dot java dot net |
| Трудоёмкость | L |
| Длительность | M |
| Рецензенты | Aleksandre Iline, Igor Veresov, Mikael Vidstedt, Vladimir Kozlov |
| Одобрен | Mikael Vidstedt |
| Создан | 2014/05/19 17:57 |
| Обновлён | 2017/04/10 04:25 |
| Задача | 8043467 |
Аннотация
Разработать инструмент для тестирования компиляторов времени выполнения с помощью автоматической генерации тестовых сценариев.
Цели
-
Сгенерированные тесты должны быть совместимы с
jtreg -
Инструмент должен настраиваться: язык конечного результата (исходный код на Java, байт-код Java), используемые языковые конструкции, сложность потока управления и выражений и т. д.
-
Тесты должны генерироваться случайным образом, но воспроизводимо
Мотивация
По мере того как мы добавляем новые платформы, задействуем новые инструкции процессора, вводим новые оптимизации и вносим другие улучшения в компиляторы времени выполнения, эффективно тестировать компиляторы прямыми целенаправленными тестами становится всё менее реально.
Описание
Инструмент будет случайным образом генерировать синтаксически и семантически корректный исходный код на Java или байт-код, при необходимости компилировать его, запускать как в режиме интерпретации (-Xint), так и в режиме компиляции (-Xcomp) и проверять результаты.
Инструмент будет работать автоматически, без участия человека. Сгенерированные тесты будут покрывать как можно больше комбинаций за разумное время.
Компилятор исходного кода Java, javac, использует не все байт-коды Java, поэтому при генерации только исходного кода на Java часть байт-кодов осталась бы непокрытой. Генерировать для всех видов тестов только байт-код было бы гораздо сложнее, поэтому мы применим гибридный подход, при котором генерируется и исходный код на Java, и байт-код.
Компиляция исходного кода во время выполнения тестов проблематична на встраиваемых платформах, где полный JDK может быть недоступен, поэтому инструмент предоставит возможность заранее компилировать тесты в виде исходного кода.
Сгенерированные тестовые сценарии будут содержать сложные выражения и графы потока управления и будут использовать intrinsics, операции с плавающей точкой, конструкции try-catch-finally и т. д. Конфигурацию инструмента можно будет настраивать.
Инструмент будет генерировать тесты случайным образом, но для воспроизводимости он будет сообщать начальное значение (seed) генератора случайных чисел и принимать такое значение, чтобы воспроизвести в точности ту же последовательность сгенерированных тестов.
Исходный код инструмента будет размещён в каталоге hotspot/test/testlibrary/jit-tester. Тесты можно генерировать с помощью целей, предусмотренных в make-файле инструмента. Результат генерации тестов — полный набор тестов jtreg, который можно запустить из того же make-файла или напрямую через jtreg. Make-файлы инструмента не будут интегрированы в инфраструктуру сборки HotSpot/JDK.
Поскольку генерация тестов занимает значительное время, генерация и запуск этих тестов не предполагаются как часть тестирования перед интеграцией. Однако имеет смысл регулярно запускать заранее сгенерированные тесты — для тестирования надёжности, а также вновь сгенерированные тесты — для лучшего покрытия кода. Сгенерированные тесты, которые находят ошибки, следует интегрировать как обычные регрессионные тесты в подходящий набор тестов и запускать так же, как остальные регрессионные тесты.
Альтернативы
Жизнеспособной альтернативой инструменту можно считать запуск существующих тестов в режимах компиляции. У такого подхода есть несколько недостатков:
-
Он не гарантирует покрытия всех языковых конструкций и комбинаций различных оптимизаций
-
Сбой теста не всегда означает дефект в компиляторах времени выполнения, требуется дополнительное время инженера на исследование и воспроизведение
-
Поскольку некоторые тесты могут быть специфичны для компиляторов времени выполнения, они могут сами принудительно вызывать компиляцию во время выполнения и/или требовать определённых состояний компилятора времени выполнения. Поэтому явный режим компиляции может изменить поведение тестов и привести к ложноположительным результатам
-
Создать регрессионный тест для сбоя теста относительно сложнее
Из-за этих недостатков такой подход не может полностью заменить предлагаемый инструмент.