-
Notifications
You must be signed in to change notification settings - Fork 26
Errores y problemas conocidos
En esta página recopilaremos algunos errores y problemas conocidos para el uso de las herramientas y tecnologías propuestas en la asignatura.
El Script de login que creé con Katalon recorder no me funciona (o tengo problemas con la automatización de la pulsación de enlaces en general)
Si estáis usando el google chrome driver, es posible que tengáis problemas con algunos selectores generados por Katalon Recorder. Concretamente, los selectores que buscan por texto (usando el selector del tipo By.linkText("Login")
), deben sustituirse por un selector basado en texto un poco más específico (concretamente By.xpath("//a[contains(text(),'Login')]")
) pero que en realidad representa lo mismo. Parece que la búsqueda de enlace por texto a secas y directa no funciona bien con este driver.
Al ejecutar las pruebas de interfaz de usuario me aparece el error java.lang.NoSuchMethodError:com.google.common.base...
Lo que le sucede es que hay una incompatibilidad con la versión de guava que utiliza la dependencia de com.google.api-client, que es la que utilizan la API de Gmail y otras de google, con la versión que requiere las dependencias de selenium que utilizamos. La solución es realizar una exclusión de dicha versión en la dependencia de com.google.api-client
:
...
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava-jdk5</artifactId>
</exclusion>
</exclusions>
...
Mis pruebas de interfaz de usuario interfieren unas con otras (afectan a la BD y cambian los resultados de otras pruebas)
En general, las pruebas del mismo tipo (como pruebas de interfaz de usuario, las pruebas E2E de controlladores, o las pruebas de servicios) se ejecutan normalmente en un mismo contexto por cada tipo (arrancando y parando una sola vez la aplicación para ejecutar todas las pruebas de cada tipo) para acelerar el proceso de pruebas. Esto tiene como consecuencia que si no declaramos como transaccionales los métodos designados con @Test
(usando la anotación @Transactional
en los métodos o en la clase), los cambios realizados en una prueba puedan afectar a las otras. La única excepción son las pruebas anotadas con @DataJpaTest
que son transaccionales por defecto.
Para evitar esto en el caso de las pruebas de interfaz de usuario se recomienda usar la anotación @DirtiesContext
en cada clase de manera que el contexto se reinicie para cada clase de pruebas de interfaz (arrancando y parando la aplicación para cada prueba). Es importante tener en cuenta que esto aumenta aún más el tiempo de ejecución de este tipo de pruebas.
Selenium no es capaz de encontrar el driver a pesar de que he puesto la variable de entorno en el sistema
En algunos casos (especialmente en sistemas Windows), el sistema no es capaz de enlazar la variable de entorno para cargar el driver, puedes solucionarlo con la siguiente instrucción:
System.setProperty("webdriver.gecko.driver", System.getenv("webdriver.gecko.driver"))
Si la gestión de fechas o la conexión con la BD os dan problemas por culpa del timezone, podéis especificar los siguientes parámetros en la cadena de conexión del fichero application-mysql.properties
:
spring.datasource.url=jdbc:mysql://localhost:3306/petclinic?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
Se produce un error al eliminar las tablas de la base de datos H2 tras ejecutar un test de controlador E2E
El error se produce al intentar eliminar la tablas de la base de datos H2 tras ejecutar el test. Concretamente parece deberse a que H2 no establece el orden adecuado para la eliminación de las tablas y al intentar hacerlo en un orden inapropiado, la operación genera un error que para la construcción con maven.
El efecto observado es que cuando ejecutamos un test e2e con Run as --> JUnit test, desde eclipse, el test se ejecuta sin problemas, aunque en la consola pueden aparecer mensajes como éstos:
ERROR 29744 --- [extShutdownHook] .SchemaDropperImpl$DelayedDropActionImpl : HHH000478: Unsuccessful: drop table pets if exists
Sin embargo, si hacemos un Run as -> Maven test o Maven install, la construcción falla (mostrando también los errores mencionados respecto del borrado/drop de las tablas).
Para solucionar el problema es necesario añadir/cambiar dos propiedades en el fichero application.properties
con los siguientes valores:
spring.jpa.properties.javax.persistence.schema-generation.drop-source=script
spring.jpa.properties.javax.persistence.schema-generation.drop-script-source=drop-tables.sql
Además, es necesario crear un fichero en src/test/resources/
llamado drop-tables.sql
que lo que hace es borrar todas las tablas en masa con una instrucción única especifica soportada por h2 . El contenido de dicho fichero es sencillamente:
DROP ALL OBJECTS
Desgraciadamente esta instrucción no está soportada por mysql por lo que también debemos sobreescribir una de esas propiedades en el fichero application-mysql.properties
, con el valor:
spring.jpa.properties.javax.persistence.schema-generation.drop-source=metadata
Así, el comportamiento descrito en application.properties
no se aplica cuando usamos mysql (el error es específico del driver de H2).
Para los que no os queráis complicar, si no habéis modificado los ficheros application.properties
y application-mysql.properties
en vuestra aplicación, podéis resolver el problema copiando a vuestros proyectos esos ficheros junto con el de drop-tables.sql
desde la rama de advanced integration tests de este repositorio. Si habéis modificado alguno de esos ficheros previamente, debéis realizar los cambios manualmente tal y como se ha descrito.
Este es un síntoma derivado de un error subyacente. Probablemente vuestro código está generando muchos errores con trazas de excepciones extremadamente largas, y llega un momento en el que Travis decide cortar el log. Deben centrarse en arreglar el error que indican las excepciones, esto resolverá también el problema de log excesivo.
Las versiones usadas de Lombok tienen un bug conocido al generar el método toString() de una entidad que tenga relaciones múltiples. Dicho bug hace que no se puedan mapear bien las propiedades que tiene que usar para generar el String. Un posible "workaround" propuesto por uno de los grupos de la asignatura ha sido utilizar @ToString.Exclude en las propiedades de la entidad que daban dicho conflicto.
Es posible que entre las distintas dependencias que tengáis que usar en vuestro proyecto surja algún problema de compatibilidad con las últimas versiones de los componentes y habría que resolverlos de manera particular. Por ejemplo, la versión 4.3 de RestAssured tiene una incompatibilidad reportada por otros usuarios de dicha dependencia. En este caso, el "workaround" propuesto ha sido cambiar a una versión anterior de RestAssured para que todo funcionase correctamente.