X
BLOG

Empiece a amar las pruebas de primavera con el asistente de pruebas unitarias para Java

Empiece a amar las pruebas de primavera con el asistente de pruebas unitarias para Java Tiempo de leer: 7 minutos
Spring es el marco de trabajo de aplicaciones Java empresarial líder y, como tal, necesita un nivel adecuado de pruebas para garantizar la calidad y seguridad de las aplicaciones creadas con él.

Al Primavera marco (junto con Bota de primavera) es uno de más popular Marcos de software empresarial Java. Su uso en aplicaciones de misión crítica significa que ha sido objeto de escrutinio por su calidad y seguridad.

Anteriormente, nuestro vicepresidente de productos, Mark Lambert, discutió cómo a los desarrolladores no les gustan las pruebas unitarias a pesar de su historial comprobado de mejora, y detalló cómo Parasoft Jtest's Asistente de prueba unitaria puede proporcionar un enfoque guiado y automatizado de las pruebas para que las pruebas no solo sean más agradables, sino también más fáciles y eficientes. En esta publicación, continuaré el mismo tema con el marco de Spring, mostrándole cómo se pueden aprovechar las pruebas automatizadas y guiadas en este importante marco de aplicación.

Los desafíos de probar aplicaciones de primavera

El marco de Spring viene con un buen soporte para pruebas de integración, pero se requiere mucha codificación manual para configurar correctamente los casos de prueba. La creación y el mantenimiento de pruebas para aplicaciones Spring presenta a los desarrolladores un conjunto único de desafíos, que incluyen los siguientes:

  • El marco de Spring debe inicializarse y configurarse
  • La aplicación suele tener 3rd-dependencias de la biblioteca de partes (almacenamiento persistente, servicios externos, etc.)
  • Las aplicaciones a menudo usan funciones integradas de Spring para sesiones, seguridad, mensajería, etc. Estas pueden ser difíciles de configurar para los desarrolladores que son nuevos en las pruebas de Spring.
  • Las dependencias de la aplicación (es decir, beans) deben configurarse adecuadamente

Estos desafíos, combinados con el hecho de que escribir conjuntos de pruebas integrales y fáciles de mantener lleva mucho tiempo en general, hacen que los desarrolladores no escriban suficientes pruebas. A su vez, esto genera vulnerabilidades de seguridad, defectos, regresiones y muchos dolores de cabeza.

Parasoft Jtest Unit Test Assistant ayuda a que el proceso de generación, mejora y mantenimiento de las pruebas JUnit sea mucho más fácil y requiere menos tiempo, de modo que los desarrolladores creen buenas pruebas rápidamente y vuelvan a lo que supuestamente les encanta: escribir código.

Acelere las pruebas unitarias de aplicaciones Spring con Parasoft Jtest y su asistente de pruebas unitarias

El marco de prueba Spring MVC

Spring Framework incluye un marco de prueba que facilita mucho las pruebas de controladores, servicios y otros componentes. Incluye funcionalidad para configurar el contenedor de prueba Spring, invocar métodos de controlador de controlador y validar el comportamiento con aserciones personalizadas.

Un ejemplo de controlador Spring MVC:

@Controller
public class TodoController {     @Autowired
    private TodoService service;
    @GetMapping("/")    public String findAll(Model model) {
        List<Todo> todos = service.findAll();
        model.addAttribute("todos", todos);
        return "todo/list";
    }
}

Este controlador de ejemplo implementa un servicio REST simple para obtener elementos de una lista de "tareas pendientes". Depende de un TodoService, que contiene la lógica empresarial.

Para probar el encuentra todos método, necesitamos una prueba JUnit que haga lo siguiente:

  • Configure el contenedor Spring con el controlador bajo prueba y un TodoService, del que depende TodoController.
  • Envíe una solicitud válida al método del controlador findAll.
  • Validar elementos de la respuesta, incluido el valor de retorno ("todo / list") y el atributo de modelo "todos".

Un ejemplo de prueba Spring MVC Junit puede verse así:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class TodoControllerTest {
    @Autowired
    TodoController controller;
 
    @Autowired
    TodoService todoService;
 
    MockMvc mockMvc;
 
    @Before
    public void setup() {
        mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
    }
 
    @Configuration
    static class Config {
        @Bean
        public TodoController getTodoController() {
            return new TodoController();
        }
 
        @Bean
        public TodoService getTodoService() {
            return new TodoService();
        }
    }
 
    @Test
    public void testFindAll() throws Exception {
        mockMvc.perform(get("/")).andExpect(view().name("todo/list"));
    }
}

El ejemplo anterior es un prueba simple, pero todavía hay mucho código de "placa de caldera" por escribir, y muchas cosas están sucediendo. En este ejemplo, hemos configurado Spring con un controlador y sus servicios, usando una clase de configuración interna. Luego usamos el MockMvc funciones para enviar una solicitud al método del controlador (utilizando realizar), y validar el nombre de vista devuelto usando y esperar.

¿Qué pasa con la prueba anterior? En realidad, nada, pero imagina un método de controlador más complejo, con múltiples métodos de controlador que aceptan más argumentos y producen más resultados. Escribir las pruebas llevaría mucho más tiempo, especialmente si es importante una buena cobertura de las pruebas. Además, la mayoría de las pruebas reales requieren una configuración significativamente mayor (configuraciones XML o de clase, sesiones y entornos, seguridad, etc.).

Generación de pruebas de primavera con Parasoft Jtest

Parasoft Jtest's Asistente de prueba unitaria ayuda a los desarrolladores a escribir pruebas de Spring de varias formas:

  1. Generación automática del código de placa de caldera para pruebas Spring MVC rápidamente
  2. Pruebas parametrizadas de generación automática para una mayor cobertura de prueba
  3. Burlarse de dependencias para aislar el método auxiliar y simplificar la prueba
  4. Recopilar datos de cobertura y analizar el flujo de prueba en tiempo de ejecución
  5. Proporcionar recomendaciones con soluciones rápidas para mejorar las pruebas.

Pruebas de generación automática

Generar pruebas de Spring en Parasoft Jtest es sencillo: simplemente seleccione un método de controlador de Spring en su IDE para su controlador y elija una acción de creación de prueba:

Elegir cualquiera Primavera regular or Resorte parametrizado genera automáticamente la prueba Spring MVC de placa de caldera para usted, incluidas las clases de configuración (y todos los Beans de los que depende su controlador). los mockMvc.perform también se agrega la llamada, y está preconfigurado para invocar el método del controlador para el que se creó la prueba. Asistente de pruebas unitarias de Jtest incluso agrega algunas afirmaciones de ejemplo que puede descomentar y configurar.

Parasoft Jtest admite la generación de pruebas mediante XML o la configuración de clases estableciendo la opción "Atributos de configuración de contexto para pruebas de Spring" en las preferencias.

Burlarse de las dependencias

La gestión de las dependencias en las pruebas unitarias es fundamental, ya que gran parte de la complejidad y el trabajo proviene de aislar una unidad bajo prueba. El Asistente de prueba unitaria de Jtest utiliza Mockito or PowerMockito para simular dependencias de forma predeterminada (puede deshabilitar esto en las preferencias si no lo desea). La simulación de dependencias permite que la prueba controle esas dependencias, aislando el método del controlador del resto de la aplicación para centrar los esfuerzos de prueba en el controlador. En nuestro controlador de ejemplo, el encuentra todos se invocó el método en TodoService - si usamos un real TodoService, estamos probando eficazmente tanto el TodoController y el TodoService. Esto puede ser lo que queremos para una prueba de integración, pero no para una prueba unitaria. Burlándose de la respuesta de TodoService.findAll en la prueba nos permite enfocar nuestros esfuerzos de prueba en el método del controlador.

(Si desea más información sobre las dependencias simuladas en las pruebas de Spring, sigue leyendo mi próxima publicación.)

Ebook: Mejore las pruebas unitarias para Java con automatización

Bota de primavera

Dado que Spring Boot proporciona una configuración simplificada para Beans, así como anotaciones adicionales para las pruebas, Unit Test Assistant genera pruebas ligeramente diferentes cuando detecta Spring Boot en su proyecto. Por ejemplo, MockMvc está conectado automáticamente, las dependencias se simulan con @MockBean y se usa la anotación @SpringBootTest.

Ejecución de pruebas y análisis de resultados

Puede ejecutar pruebas generadas utilizando cualquier corredor JUnit normal. Parasoft Jtest proporciona acciones de la barra de herramientas que ejecutan JUnit y analizan la prueba.

Después de ejecutar las pruebas, se muestra el flujo de ejecución de la prueba y el Asistente de prueba unitaria hace recomendaciones para mejorar la prueba y se informa en su IDE:

Proporcionar entradas de método de controlador

Los métodos de controlador a menudo se configuran para aceptar rutas, consultas u otros parámetros como argumentos del método. Para probar el método del controlador MVC, puede usar MockMvc para construir la ruta / consulta y cualquier otro parámetro necesario para invocar el método.

El Asistente de prueba unitaria de Jtest configura automáticamente la llamada mockMvc.perform para invocar el método del controlador. Los parámetros individuales aparecen en la prueba como variables locales (o parámetros en una prueba parametrizada) que deben configurarse para que la prueba se ejecute correctamente.

Por ejemplo (consulte Unit Test Assistant abreviado como UTA a continuación):

@Test public void testGetPerson() throws Throwable {     // When     String id = ""; // UTA: Configure an appropriate parameter value since the tested method depends on it     ResultActions actions = mockMvc.perform(get("/people/" + id));

Aquí el "idEs necesario configurar la cadena; de lo contrario, la ruta utilizada sería “/ people /”, y Spring no coincidirá con la ruta proporcionada con el método del controlador apropiado.

clase = ”p1 ″>El asistente de prueba unitaria busca varios tipos de parámetros de métodos de manejo y prepara automáticamente la prueba para ellos de las siguientes maneras:

  • HttpSession (agrega un ejemplo setAttribute () llamada)
  • Encabezados (agrega un encabezamiento() llamada),
  • Cuerpo de la solicitud (agrega una variable de carga útil y contenido() llamada)
  • Autenticación (agrega una instanciación de ejemplo al Configure método, y un principal() llamada)

La ejecución de una prueba que no hace que se invoque el método del controlador produce una recomendación como la siguiente:

Validación de las salidas del método del controlador

Dependiendo de lo que se supone que el método del controlador debe proporcionar a las personas que llaman, puede devolver una variedad de tipos. La mayoría de las veces, los métodos de controlador devuelven un ModelAndView (u objetos similares como Model o RedirectView) para publicar una página o un ResponseEntity de algún tipo (a veces solo el objeto sin formato que se va a serializar). Esta respuesta es accesible al marco de prueba Spring MVC para su validación.

Por ejemplo, las siguientes afirmaciones fueron agregadas por Jtest Unit Test Assistant para un método de controlador que devuelve un ModelAndView:

  // When
  String id = "1";
  ResultActions actions = mockMvc.perform(get("/people/" + id));
 
  // Then
  // actions.andExpect(status().isOk());
  // actions.andExpect(header().string("", ""));
  // actions.andExpect(view().name(""));
  // actions.andExpect(model().attribute("", ""));

Una vez que se genera la prueba, puede descomentar estas afirmaciones y completar valores para crear rápidamente una prueba útil y valiosa. Si una afirmación falla en tiempo de ejecución, el Asistente de prueba unitaria proporciona una recomendación y una solución rápida para actualizar automáticamente el valor esperado o simplemente eliminar la afirmación. Para configurar rápidamente la aserción con un valor adecuado, puede descomentar una aserción, dejar que falle y luego usar una solución rápida para establecer el valor esperado correcto.

Para concluir

Spring (combinado con Spring Boot) es el marco de trabajo de aplicaciones Java empresarial líder y, como tal, necesita un nivel adecuado de pruebas para garantizar la calidad y seguridad de las aplicaciones creadas con él. Pero desafortunadamente, este nivel de pruebas no se está logrando actualmente, principalmente debido a la falta de tiempo y la cantidad de codificación manual y mantenimiento requeridos. El Parasoft Jtest Asistente de prueba unitaria proporciona no solo automatización de pruebas unitarias, sino también creación guiada de pruebas y gestión de dependencias, para acelerar la creación de pruebas y reducir el mantenimiento.

Para obtener más información, lea cómo el Asistente de prueba unitaria puede ayudar con gestión de la dependencia con marcos simulados.

Aprenda a aumentar el rendimiento de las pruebas unitarias con Parasoft Jtest.
Solicite una demostración ahora
Escrito por

Brian McGlauflin

Brian McGlauflin es un ingeniero de software en Parasoft con experiencia en el desarrollo de pila completa utilizando Spring y Android, pruebas de API y virtualización de servicios. Actualmente se centra en las pruebas de software automatizadas para aplicaciones Java con Parasoft Jtest.

Reciba las últimas noticias y recursos sobre pruebas de software en su bandeja de entrada.

Prueba Parasoft