openjdk.ruOpenJDK на русском

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.

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

Альтернативы

Жизнеспособной альтернативой инструменту можно считать запуск существующих тестов в режимах компиляции. У такого подхода есть несколько недостатков:

  • Он не гарантирует покрытия всех языковых конструкций и комбинаций различных оптимизаций

  • Сбой теста не всегда означает дефект в компиляторах времени выполнения, требуется дополнительное время инженера на исследование и воспроизведение

  • Поскольку некоторые тесты могут быть специфичны для компиляторов времени выполнения, они могут сами принудительно вызывать компиляцию во время выполнения и/или требовать определённых состояний компилятора времени выполнения. Поэтому явный режим компиляции может изменить поведение тестов и привести к ложноположительным результатам

  • Создать регрессионный тест для сбоя теста относительно сложнее

Из-за этих недостатков такой подход не может полностью заменить предлагаемый инструмент.