CodeGym /Cursos /Módulo 5. Spring /Lección 297: Pruebas de GraphQL API

Lección 297: Pruebas de GraphQL API

Módulo 5. Spring
Nivel 16 , Lección 6
Disponible

Cualquier desarrollador sabe que cuántos menos bugs haya en el API, menos llamadas al soporte técnico. Las pruebas no son solo comprobar que tu sistema funciona, son la manera de demostrar que funciona como está pensado. Probar GraphQL API es especialmente importante:

  • Verificar la lógica de las queries y mutations: asegurarse de que tus queries se ejecutan correctamente y que las mutations cambian los datos como se espera.
  • Garantizar la seguridad: comprobar que los usuarios solo acceden a los datos a los que deberían tener acceso.
  • Rendimiento: asegurarse de que el API procesa las peticiones rápida y eficientemente incluso bajo carga.
  • Estabilidad: garantizar que los cambios en el código no rompen la funcionalidad ya existente.

Enfoques para probar GraphQL API

Como en cualquier aplicación, las pruebas de GraphQL API se pueden dividir en varios niveles:

Unit-tests

Son tests de componentes individuales de la aplicación, como Data Fetchers, Resolvers, o servicios. El objetivo es comprobarlos aislados del resto de componentes.

Ejemplo:


@Test
void testFetchUserById() {
    // Given
    UUID userId = UUID.randomUUID();
    User mockUser = new User(userId, "John", "Doe");
    when(userRepository.findById(userId)).thenReturn(Optional.of(mockUser));

    // When
    User result = userService.fetchUserById(userId);

    // Then
    assertEquals(mockUser, result);
}

2. Pruebas de integración

Aquí probamos la interacción entre distintos componentes de la aplicación — por ejemplo, la llamada a una query GraphQL y su manejo por el Resolver.

Herramientas: Spring Boot Test, MockMvc.

Ejemplo:


@Test
void testGraphQLQuery() throws Exception {
    String query = "{ user(id: \"1\") { firstName lastName } }";

    mockMvc.perform(post("/graphql")
            .contentType(MediaType.APPLICATION_JSON)
            .content("{\"query\":\"" + query + "\"}"))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.data.user.firstName").value("John"))
            .andExpect(jsonPath("$.data.user.lastName").value("Doe"));
}

3. Pruebas de contrato

Se usan para comprobar la interacción entre microservicios. Por ejemplo, si un microservicio expone un GraphQL API y otro lo consume, es importante asegurar que los acuerdos sobre el formato de las peticiones y respuestas se cumplen.

Herramienta: Pact.

4. Pruebas de carga

Permiten verificar cómo se comporta el API con un gran número de peticiones concurrentes.

Herramienta: k6.


Uso de JUnit para probar GraphQL

JUnit es el framework estándar para testing en Java, y va muy bien para comprobar la lógica de negocio de GraphQL. Vamos a empezar con un test sencillo del Resolver.

Ejemplo de test del Resolver:


@Test
void testResolveQuery() {
    // Given
    String query = "{ user(id: \"1\") { firstName, lastName } }";
    ExecutionInput executionInput = ExecutionInput.newExecutionInput()
            .query(query)
            .build();

    // When
    ExecutionResult executionResult = graphQL.execute(executionInput);

    // Then
    Map<String, Object7>) data.get("user")).get("firstName"));
}

Aquí creamos una query de GraphQL y comprobamos que los datos se devuelven correctamente.


Práctica: probar GraphQL API usando JUnit y MockMvc

MockMvc es una herramienta potente para pruebas de integración de aplicaciones Spring, incluyendo GraphQL API.

1. Configurar los tests

Para empezar asegúrate de que tienes configurado Spring Boot Test. Para probar queries GraphQL vía MockMvc necesitas configurar tu controlador.

Ejemplo de configuración:

@Autowired
private MockMvc mockMvc;

2. Escribir el escenario de prueba

Probamos la query para obtener un usuario:


@Test
void testUserQuery() throws Exception {
    String query = "{ user(id: \"1\") { firstName, lastName } }";

    mockMvc.perform(post("/graphql")
            .contentType(MediaType.APPLICATION_JSON)
            .content("{\"query\":\"" + query + "\"}"))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.data.user.firstName").value("John"))
            .andExpect(jsonPath("$.data.user.lastName").value("Doe"));
}

Aquí comprobamos que la petición funciona y devuelve los datos esperados.


Probar queries y mutations complejas

En escenarios más complejos el API puede devolver objetos anidados o realizar mutations sobre los datos.

Ejemplo de query compleja:


@Test
void testComplexQuery() throws Exception {
    String query = "{ user(id: \"1\") { firstName, posts { title, content } } }";

    mockMvc.perform(post("/graphql")
            .contentType(MediaType.APPLICATION_JSON)
            .content("{\"query\":\"" + query + "\"}"))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.data.user.firstName").value("John"))
            .andExpect(jsonPath("$.data.user.posts[0].title").value("Post 1"))
            .andExpect(jsonPath("$.data.user.posts[0].content").value("Content 1"));
}

Ejemplo de mutation:


@Test
void testCreateUserMutation() throws Exception {
    String mutation = "mutation { createUser(input: { firstName: \"Jane\", lastName: \"Doe\" }) { id, firstName, lastName } }";

    mockMvc.perform(post("/graphql")
            .contentType(MediaType.APPLICATION_JSON)
            .content("{\"query\":\"" + mutation + "\"}"))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.data.createUser.firstName").value("Jane"))
            .andExpect(jsonPath("$.data.createUser.lastName").value("Doe"));
}

Pruebas de seguridad y rendimiento

Comprueba que los usuarios sin los permisos necesarios no pueden ejecutar ciertas queries.

Ejemplo de comprobación de permisos:


@Test
@WithMockUser(roles = "ADMIN")
void testAdminAccess() throws Exception {
    String query = "{ adminData { sensitiveInfo } }";

    mockMvc.perform(post("/graphql")
            .contentType(MediaType.APPLICATION_JSON)
            .content("{\"query\":\"" + query + "\"}"))
            .andExpect(status().isOk());
}

@Test
@WithMockUser(roles = "USER")
void testUnauthorizedAccess() throws Exception {
    String query = "{ adminData { sensitiveInfo } }";

    mockMvc.perform(post("/graphql")
            .contentType(MediaType.APPLICATION_JSON)
            .content("{\"query\":\"" + query + "\"}"))
            .andExpect(status().isForbidden());
}

Usa herramientas como k6 para comprobar el rendimiento:

k6 run --vus 10 --iterations 100 script.js

Conclusión

Ahora tienes conocimientos y ejemplos para escribir tests para GraphQL API. Puedes comprobar tanto la lógica de componentes individuales como la interacción entre distintas partes del sistema. Presta especial atención a la seguridad y al rendimiento — son aspectos clave en el desarrollo real.

Todas tus pruebas ayudarán a evitar bugs antes de que lleguen a producción. Y eso significa: sueño tranquilo y usuarios agradecidos!

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION