JEP 235: Test Class-File Attributes Generated by javac
Тестирование атрибутов class-файлов, генерируемых javac
| Автор | Mikhail Kondratyev |
| Ответственный | Andrei Eremeev |
| Тип | Feature |
| Область | Implementation |
| Статус | Closed / Delivered |
| Выпуск | 9 |
| Компонент | tools / javac |
| Обсуждение | compiler dash dev at openjdk dot java dot net |
| Трудоёмкость | M |
| Длительность | M |
| Рецензенты | Aleksandre Iline, Jonathan Gibbons |
| Одобрен | Aleksandre Iline |
| Создан | 2014/05/28 13:40 |
| Обновлён | 2016/10/10 16:16 |
| Задача | 8044127 |
Аннотация
Написать тесты, проверяющие корректность атрибутов class-файлов, генерируемых javac.
Цели
Создать тесты, которые проверяют, что все атрибуты class-файлов генерируются корректно, даже если такие атрибуты не используются в обычном сценарии компиляции и запуска. Кроме того, задокументировать все уже существующие тесты такого рода.
Мотивация
Атрибуты class-файлов недостаточно покрыты тестами. Необязательные атрибуты и атрибуты, которые не проверяются VM, нельзя протестировать, компилируя исходные файлы, запуская их и проверяя, что скомпилированная программа ведёт себя ожидаемым образом. Недостаточное покрытие приводит к возможным ошибкам, которые могут быть обнаружены только внешними инструментами, например отладчиками. Нужен специальный набор тестов, который будет анализировать class-файлы и проверять корректность атрибутов class-файлов каким-либо другим способом.
Описание
Обычный способ протестировать файлы, генерируемые javac, — запустить скомпилированные классы и проверить, что сгенерированная программа ведёт себя ожидаемым образом. Этот подход не работает ни для необязательных атрибутов class-файлов, ни для атрибутов, которые не проверяются VM, поэтому эти два вида атрибутов нужно тестировать каким-либо другим способом. Будут разработаны тесты, которые принимают на вход исходный код на Java, компилируют его, читают атрибуты скомпилированных class-файлов и проверяют их корректность.
Согласно JVMS, атрибуты class-файлов делятся на три группы.
Необязательные атрибуты
Эти атрибуты не критичны для корректной работы javac, JVM или библиотек классов, но их используют инструменты. Тестирование этих атрибутов имеет высокий приоритет, поскольку они не используются ни одним компонентом JDK.
SourceFileSourceDebugExtensionLineNumberTableLocalVariableTableLocalVariableTypeTableDeprecated
Атрибуты, не используемые JVM
Эти атрибуты не используются JVM, но используются javac или библиотеками классов. Тестирование этих атрибутов имеет средний приоритет.
InnerClassesEnclosingMethodSyntheticSignatureRuntimeVisibleAnnotationsRuntimeInvisibleAnnotationsRuntimeVisibleParameterAnnotationsRuntimeInvisibleParameterAnnotationsRuntimeVisibleTypeAnnotationsRuntimeInvisibleTypeAnnotationsAnnotationDefaultMethodParameters
Атрибуты, используемые JVM
Эти атрибуты проверяются верификатором байт-кода JVM. Дополнительное тестирование не требуется.
ConstantValueCodeStackMapTableExceptionsBootstrapMethods
Тестирование
Чтобы протестировать эти новые тесты, мы проверим, что при запуске на намеренно повреждённых class-файлах тесты завершаются неудачей с соответствующим сообщением об ошибке.