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

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.

  • SourceFile
  • SourceDebugExtension
  • LineNumberTable
  • LocalVariableTable
  • LocalVariableTypeTable
  • Deprecated

Атрибуты, не используемые JVM

Эти атрибуты не используются JVM, но используются javac или библиотеками классов. Тестирование этих атрибутов имеет средний приоритет.

  • InnerClasses
  • EnclosingMethod
  • Synthetic
  • Signature
  • RuntimeVisibleAnnotations
  • RuntimeInvisibleAnnotations
  • RuntimeVisibleParameterAnnotations
  • RuntimeInvisibleParameterAnnotations
  • RuntimeVisibleTypeAnnotations
  • RuntimeInvisibleTypeAnnotations
  • AnnotationDefault
  • MethodParameters

Атрибуты, используемые JVM

Эти атрибуты проверяются верификатором байт-кода JVM. Дополнительное тестирование не требуется.

  • ConstantValue
  • Code
  • StackMapTable
  • Exceptions
  • BootstrapMethods

Тестирование

Чтобы протестировать эти новые тесты, мы проверим, что при запуске на намеренно повреждённых class-файлах тесты завершаются неудачей с соответствующим сообщением об ошибке.