Jacks: pruebas de compatibilidad de Java, el camino hacia el código abierto
¿Qué son los jotas?
El conjunto de pruebas Jacks comprueba si el compilador de Java cumple con la JLS (Especificación del lenguaje Java). Consta de una gran cantidad de pequeños casos de prueba. Cada prueba se centra en una parte específica de JLS. ha hecho una gran contribución al proyecto Jacks. Describe los beneficios de este tipo de pruebas en el dominio orientado a los detalles. Al generar pequeños casos de prueba con un comportamiento de compilación específico y luego automatizar la ejecución de cada caso, el autor del compilador o el depurador. Descubra rápidamente la traducción del código fuente de Java a código de bytes. Problemas
El concepto detrás del desarrollo de Jacks era simplificar las pruebas de ejecución de múltiples compiladores o configuraciones de múltiples compiladores (como las distribuciones JDK de Jikes y Javac). Un conjunto de pruebas) Si se hace manualmente, debe configurar repetidamente las variables de entorno y luego comparar los resultados de las pruebas con los resultados esperados. Con Jacks solo necesita cambiar al directorio donde se almacenan las pruebas, llamar al marco de Jacks e indicar qué compilador. se debe utilizar la configuración
El incumplimiento de Sun de sus compromisos con los desarrolladores de Java inspiró al equipo de Jikes a configurar y ejecutar el proyecto Jacks. Sun declaró repetidamente que incluiría Java JCK (Java Compatibility Kit) y otros relacionados. Las tecnologías Java están en manos de un organismo de estándares. Pero como esto aún no se ha implementado, los desarrolladores que trabajan en proyectos Java no pueden usar JCK para realizar pruebas de regresión en el desarrollo diario. Cuando se enfrentan a la insuficiencia artificial del código debido a restricciones de licencia irrazonables. tienden a utilizar otros nuevos y más completos. Esto es lo que le pasó a Jacks (aunque Jacks está alojado en desarrolladorWorks y está sujeto a la GPL en lugar de a la licencia pública de IBM)
Uso de Jacks
Jacks está escrito en Tcl. Por lo tanto, debe asegurarse de tener Tcl (necesita la versión para asegurarse de tener la extensión tcltest y la compatibilidad con Unicode, los cuales son necesarios para Jacks). Puede descargar el instalador para Windows y el RPM para Red Hat x o más cómodamente desde el código fuente integrado. Si no sabe dónde descargarlo, consulte la sección de referencia más adelante en este artículo. Si está utilizando Red Hat, es probable que se haya instalado Tcl. p>
Después de instalar Tcl, Jacks debe extraerse de CVS y luego configurarse incluyendo el nombre de ruta del compilador en el archivo de configuración _setup de Jacks para el compilador que desea probar. Necesitará un archivo _setup. para cada configuración que desea admitir, por ejemplo, es necesario editar el archivo Jacks con javac_setup para establecer la ruta para javac. Eric Blake dijo que la parte más difícil fue descubrir cómo probar Jikes ya que tenía JIKESPATH configurado en el entorno, pero. Descubrí qué cambiar en el archivo de configuración jikes_setup y todo salió bien
Obtener el código fuente de Jacks del módulo CVS
setenv CVSROOT :pserver:anoncvs@:/usr/cvs /jikes cvs login
paswsd anoncvs
cvs checkout jacks
¿Puedes usar Ja con un número ilimitado de compiladores o configuraciones de compiladores?
cks Para eliminar la configuración de un determinado compilador, simplemente elimine su archivo _setup
Después de eliminar el código fuente de CVS, debe incluir el directorio Jacks de nivel superior en la ruta para que el script de shell de Jacks pueda Como precaución, ejecute inicialmente El script de shell debe ejecutarse sin ningún argumento para garantizar que todo esté configurado correctamente
Jacks
Si todo va bien, verá una lista de. Opciones de línea de comando aceptadas por el script Jacks. Si acepta el error, verifique si puede encontrar el ejecutable tclsh en la ruta. Los usuarios de Windows deben ejecutar tclsh directamente y pasar el argumento jacks tcl antes del indicador general. instalar la capa de compatibilidad Cygwin UNIX para que, al igual que los usuarios de Unix, pueda utilizar el script de shell proporcionado para ejecutar Jacks. Las siguientes instrucciones suponen que está utilizando un script de shell
Para el ejemplo de prueba, debe utilizar el. Compilador Jikes para ejecutar todos los comandos de prueba en el subdirectorio dado de la siguiente manera
cd tests/jls/packages/package declares/unnamed packages
Jacks jikes
Desarrollar nuevas pruebas de regresión
Desarrollar nuevos casos de prueba de Jacks Fácil de seguir Eric Blakes Básicamente, diseñas un archivo fuente simple para probar el problema, lo colocas en un formato de Jacks específico y luego ejecutas Jacks si los resultados del compilador son diferentes. de lo esperado, imprime un error. Aquí está la página de inicio de Jacks. Un ejemplo de cómo agregar un nuevo caso de prueba en el tutorial
// Archivo SynchronizedInterface java interfaz pública sincronizada SynchronizedInterface {} ¿Se genera el siguiente error al compilar con? Jikes
jikes SynchronizedInterface java
Error semántico encontrado al acumular SynchronizedInterface java:
interfaz pública sincronizada SynchronizedInterface {}
lt; /p>
*** Error: sincronizado no es un modificador de interfaz válido
Si echas un vistazo rápido a la sección JLS, verás que sincronizado no es un modificador legal en este contexto. Si intenta compilar la misma clase utilizando el compilador Javac en una versión anterior de JDK, no generará un error de compilación (este error se solucionará en una versión posterior)
javac SynchronizedInterface java
Ahora que se ha reproducido el problema, puede agregar pruebas de regresión al conjunto de pruebas de Jacks siguiendo los pasos a continuación Casos
Comprender en qué directorio debe colocar sus casos de prueba
Escribir regresión tests
Ejecutar nuevas pruebas en el marco Jacks
tcltest El formato de las pruebas de regresión en el marco es
tcltest::test NOMBRE DESCRIPCIÓN
ION {MANDS
} EXPECTED_RESULT?
Esta es la primera prueba en la sección JLS, por lo que el nombre es
El caso de prueba está en el directorio tests/jls. / en interfaces/declaraciones de interfaz/modificadores de interfaz (ubicación basada en el nombre de la sección JLS)
La DESCRIPCIÓN puede ser cualquier cosa que desee
La sección MANDS contiene todos los comandos Tcl pero en la mayoría cases Solo se necesitan los métodos saveas y pile en Jacks
El comando saveas utiliza dos argumentos, el nombre del archivo y los datos que se guardarán en el archivo
saveas SynchronizedInterface java \ {public interfaz sincronizada SynchronizedInterface {} }? El comando de pila toma cualquier número de argumentos de la línea de comando y los pasa al compilador de Java. Devolverá PASS FAIL o WARN para indicar el estado de salida del compilador.
EXPECTED_RESULT es el resultado. esperado del comando pile
La compilación no debería tener éxito en este ejemplo de interfaz, por lo que la prueba de regresión completa debería verse así
tcltest::test {debería generar un error en la interfaz sincronizada} { saveas. SynchronizedInterface java \
p>
{interfaz sincronizada SynchronizedInterface {}}
pila SynchronizedInterface java
} ¿FALLO? p> Ejecutar la prueba y verificar los resultados es completamente automático. Así que realmente puedes tomar un descanso y ver qué sale. El marco de Jacks desciende recursivamente en el directorio de pruebas y ejecuta todas las pruebas que encuentra. Si todo va bien, no funcionará. No imprime ningún mensaje. Si una prueba falla, imprimirá una descripción del error. Como lo muestra Mo Dejong en el listado, este ejemplo demuestra el error en Javac causado por el primer constructor que llama al segundo constructor y el segundo que llama al primero. El JLS establece que esto es ilegal (sección 1). Por lo tanto, si se detecta, el compilador de Java debe señalar el error.
Veamos qué hace Jikes para el mismo caso de prueba. En el listado usaremos algunos. características en Jacks que le permiten pasar el patrón como tercer argumento al script de Jacks omitirá los casos de prueba cuyos nombres no coincidan con el patrón. En este pequeño caso, el patrón es el nombre del caso de prueba. cómo pasa el caso de prueba que nos interesa Cómo se omiten otros casos de prueba El resultado anterior muestra que el error encontrado en el compilador Javac no existe en Jikes
Aunque los resultados legibles por humanos son muy útiles cuando se tienen mucho con qué lidiar. En el caso de los casos de prueba, rápidamente pueden volverse muy difíciles de manejar. Jacks celebró recientemente un hito importante que ahora incluye más de 10 casos de prueba independientes para JLS. Con tantos casos de prueba, nadie puede recordar cuáles. estuvieron disponibles en un momento dado los casos aprobados y cuáles fallaron, pero no temas, Jacks incluye una serie de notas.
La función de registro y análisis de resultados de pruebas puede realizar un seguimiento de los resultados de las pruebas a lo largo del tiempo. Esta es una función clave porque proporciona a los desarrolladores de compiladores de Java una forma de realizar un seguimiento del estado de las correcciones de errores y las posibles regresiones.
Cómo escribir. Jacks y por qué usar Tcl
Al implementar un conjunto de pruebas como Jacks, un lenguaje de secuencias de comandos es una elección natural y hay varias razones para usar Tcl
Tcl es de código abierto, por lo que en el futuro Continuará existiendo con el tiempo
Fácil de instalar, no es necesario compilar scripts
El lenguaje de scripting fácil de leer y escribir es mucho más fácil de dominar que C/C p>
Funciones de procesamiento de cadenas y expresiones regulares generales fáciles de usar
Altamente portátil para ejecutarse en más plataformas que Java
Utilizado con éxito en miles de organizaciones durante la última década p>
Irónicamente, era un proyecto de Sun :)
Mo DeJong dijo que una de las características más sorprendentes de Jacks es la documentación autogenerada. En la página de inicio de Jacks puede encontrar enlaces a la prueba. página de índice de casos. La página enumera todos los casos de prueba disponibles. Está indexada y tiene referencias cruzadas de varias maneras útiles. También es posible buscar casos de prueba por nombre. Según las pruebas existentes, Tcl es altamente dinámico. Las características del lenguaje facilitan la implementación de casos de prueba autodocumentados.
Hasta ahora, Jacks admite los siguientes compiladores de Java
JDK (y JDK también lo son). disponibles pero están desactualizados)
Se burla del compilador Java de código abierto de IBM
Kaffe aprovecha el compilador Kopi
GCJ para el front-end Java de gcc
Mejorar los compiladores de Java en todas partes
Jacks inicialmente se centró en proporcionar pruebas de compiladores solo para el proyecto Jikes. El objetivo original era reemplazar el sistema de prueba casero creado por Jikes. Sin embargo, esta intención original fue abandonada porque. Era demasiado difícil de configurar y usar. Rápidamente se descubrió que si la prueba a medida que la suite se volvía más general, podría ser utilizada por otros proyectos de compiladores de Java, lo que no conduciría a un aumento en el número de casos de prueba. Es doloroso que al menos otros expertos en Java evalúen los casos de prueba de corrección
El proyecto Jikes naturalmente hace un gran uso de Jacks, pero ¿qué pasa con los proyectos del compilador GCJ y Kopi? Tom Tromey, líder de Java desde hace mucho tiempo en Red Hat, se dio cuenta de la utilidad del desarrollo de Jacks para el proyecto GCJ. Jacks se ha convertido en un activo real para el proyecto GCJ. Ejecuto Jacks cada vez que hago cambios en el compilador frontal y uso Jacks. regularmente para encontrar errores en GCJ Error Descubrí que agregar pruebas es un asunto trivial. El marco es muy fácil de usar y está muy bien pensado.