Class TestDescuentoSelenium

java.lang.Object
giis.demo.descuento.it.TestDescuentoSelenium

@SpringBootTest(classes=DescuentoApplication.class, webEnvironment=RANDOM_PORT) @TestPropertySource(locations="classpath:application-test.properties") public class TestDescuentoSelenium extends Object
Pruebas de la interaccion del usuario con la aplicacion web del ejemplo de descuentos a clientes (Problema 3d) utilizando Selenium (https://www.seleniumhq.org/): Ilustra la configuracion para pruebas de integracion con el interfaz web de usuario en Spring Boot y el proceso basico de ejecucion y comparacion de resultados con Selenium.
Las situaciones a cubrir son las mismas que en samples-test-java (giis.demo.descuento.it.assertj).
La configuracion es la siguiente:
SpringBootTest: Al igual que en las pruebas unitarias (TestDescuentoRepository) se reutiliza la configuracion de la aplicacion, pero se anyade la especificacion del entorno (webEnvironment). Esto permite que se ejecute la instancia del servidor tomcat embebido con el que se puede interaccionar. Se especifica RANDOM_PORT para que la prueba no interfiera con otras aplicaciones que puedan estar ejecutandose (por ejemplo en CI).
TestPropertySource: Igual que en las pruebas unitarias (TestDescuentoReposotory) Especifica un fichero de configuracion diferente (localizado en src/test/resources), en este caso solo se omite la carga de datos inicial de data.sql para que se arranque con una base de datos limpia (esto se podria hacer utilizando un profile diferente con su propia configuracion)
Notar que no se especifica DataJpaTest pues interferiría con la configuracion especificada de webEnvironment fallando al intentar lanzar el servidor.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    private DataSource
     
    (package private) org.openqa.selenium.WebDriver
     
    (package private) int
     
  • Constructor Summary

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    private void
    doStep(boolean initialStep, String edad, String expected)
    La ejecucion de un paso ilustra el uso de las acciones basicas de selenium (findElement, click, sendKeys) y otras utilidades (obtener el contenido de una tabla, tomar imagenes)
    void
    Carga limpia de la base de datos: A diferencia de otros tests *ut* que usan @Transactional, aqui NO sirve el rollback de @Transactional: con WebEnvironment.RANDOM_PORT el navegador llama a un servidor real que atiende la peticion en otro hilo y otra conexion, por lo que los datos deben estar commiteados para que la aplicacion los vea; un rollback de la transaccion del test no alcanzaria esa conexion.
    private void
    Inicializa el WebDriver para el navegador indicado y navega a la pagina principal.
    void
     
    void
     
    void
    Escenario de prueba de la pantalla: Cuatro pasos cambiando el filtro por edad, comprobando en cada uno el valor de la tabla de descuentos.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • datasource

      @Autowired private DataSource datasource
    • port

      @LocalServerPort int port
    • driver

      org.openqa.selenium.WebDriver driver
  • Constructor Details

    • TestDescuentoSelenium

      public TestDescuentoSelenium()
  • Method Details

    • setUp

      @BeforeEach public void setUp()
    • tearDown

      @AfterEach public void tearDown()
    • loadMainPage

      private void loadMainPage()
      Inicializa el WebDriver para el navegador indicado y navega a la pagina principal. Inserta sleeps tras cada accion para que se pueda ver la secuencia de pasos en los videos
    • loadCleanDatabase

      public void loadCleanDatabase()
      Carga limpia de la base de datos: A diferencia de otros tests *ut* que usan @Transactional, aqui NO sirve el rollback de @Transactional: con WebEnvironment.RANDOM_PORT el navegador llama a un servidor real que atiende la peticion en otro hilo y otra conexion, por lo que los datos deben estar commiteados para que la aplicacion los vea; un rollback de la transaccion del test no alcanzaria esa conexion. Por eso hay que eliminar explicitamente los datos antes de insertar (junto con spring.sql.init.mode=never, que evita la carga de data.sql). El efeccto del rollback se podria simular tambien de forma declarativa usando una anotacion
    • testDescuentoScenario

      @Test public void testDescuentoScenario()
      Escenario de prueba de la pantalla: Cuatro pasos cambiando el filtro por edad, comprobando en cada uno el valor de la tabla de descuentos. Como los pasos son similares, encapsula el proceso de ejecucion y comparacion de resultados en un metodo especifico, eliminando codigo duplicado.
    • doStep

      private void doStep(boolean initialStep, String edad, String expected)
      La ejecucion de un paso ilustra el uso de las acciones basicas de selenium (findElement, click, sendKeys) y otras utilidades (obtener el contenido de una tabla, tomar imagenes)