Validação no banco - raialmeida/mindqa-db-commons GitHub Wiki

Validação no banco

Embora o exemplo use RestAssured, a biblioteca é independente de framework e pode ser usada em qualquer automação de testes com Java 17 ou superior. Ela funciona com JUnit, TestNG, Cucumber, Selenium, Playwright para Java ou uma suíte própria, desde que o projeto tenha acesso ao banco configurado. Pode validar dados antes ou depois de uma ação realizada por qualquer ferramenta.

RestAssured

Depois de enviar um POST, capture o ID retornado e consulte o banco. O exemplo pressupõe uma API local que recebe nome e email e conclui a gravação antes de responder.

import io.mindqa.database.DatabaseService;
import io.restassured.http.ContentType;

import java.util.List;
import java.util.Map;

import static io.restassured.RestAssured.given;
import static org.junit.jupiter.api.Assertions.assertEquals;

String email = "[email protected]";
Map<String, String> payload = Map.of("nome", "Cliente QA", "email", email);

String id = given().baseUri("http://localhost:8080")
        .contentType(ContentType.JSON).body(payload)
        .when().post("/clientes")
        .then().statusCode(201).extract().path("id");

List<Map<String, Object>> rows = DatabaseService.select(
        "SELECT nome, email FROM clientes WHERE id = ?", id);
assertEquals(1, rows.size());
assertEquals(email, rows.get(0).get("email"));

GET com dados preparados pelo teste

Também é possível inserir um registro no banco, chamar a API e validar o retorno. O exemplo pressupõe GET /clientes/{id} retornando id, nome e email:

import io.mindqa.database.DatabaseService;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

import java.util.UUID;

import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.jupiter.api.Assertions.assertEquals;

class ConsultaClienteTest {
    private final String id = UUID.randomUUID().toString();

    @Test
    void deveConsultarClienteAtualizado() {
        String email = "qa-" + id + "@example.com";

        assertEquals(1, DatabaseService.execute(
                "INSERT INTO clientes (id, nome, email) VALUES (?, ?, ?)",
                id, "Cliente inicial", email));
        assertEquals(1, DatabaseService.execute(
                "UPDATE clientes SET nome = ? WHERE id = ?", "Cliente atualizado", id));

        given()
                .baseUri("http://localhost:8080")
                .pathParam("id", id)
        .when()
                .get("/clientes/{id}")
        .then()
                .statusCode(200)
                .body("id", equalTo(id))
                .body("nome", equalTo("Cliente atualizado"))
                .body("email", equalTo(email));
    }

    @AfterEach
    void limparCadastro() {
        DatabaseService.execute("DELETE FROM clientes WHERE id = ?", id);
    }
}

Como uma asserção com falha interrompe o método de teste, faça a limpeza em um @AfterEach, @AfterAll ou outro mecanismo de teardown adequado à sua suíte. A conexão deve apontar para o destino onde o dado que será validado foi persistido, como a base usada pela API ou uma réplica quando esse for o objetivo do teste.

Outros contextos de automação

Em um teste JUnit, use os mesmos métodos diretamente. Com TestNG, adapte as anotações e as asserções ao framework. Nos fragmentos seguintes, os IDs e os dados esperados vêm da preparação ou da ação executada pelo teste:

import io.mindqa.database.DatabaseService;
import org.junit.jupiter.api.Test;

import java.util.List;
import java.util.Map;

import static org.junit.jupiter.api.Assertions.assertEquals;

@Test
void deveValidarCadastroPersistido() {
    List<Map<String, Object>> rows = DatabaseService.select(
            "SELECT status FROM pedidos WHERE id = ?", pedidoId);

    assertEquals(1, rows.size());
    assertEquals("PROCESSADO", rows.get(0).get("status"));
}

Em um step do Cucumber, a consulta pode validar o efeito de uma ação executada no step anterior:

import io.cucumber.java.pt.Então;
import io.mindqa.database.DatabaseService;

import java.util.List;
import java.util.Map;

import static org.junit.jupiter.api.Assertions.assertEquals;

@Então("o pedido deve estar processado no banco")
public void pedidoDeveEstarProcessado() {
    List<Map<String, Object>> rows = DatabaseService.select(
            "SELECT status FROM pedidos WHERE id = ?", pedidoId);
    assertEquals(1, rows.size());
    assertEquals("PROCESSADO", rows.get(0).get("status"));
}

Em uma automação de interface com Selenium ou outra ferramenta, execute a consulta depois de submeter o formulário e valide os dados persistidos:

import io.mindqa.database.DatabaseService;
import org.openqa.selenium.By;

import java.util.List;
import java.util.Map;

import static org.junit.jupiter.api.Assertions.assertEquals;

driver.findElement(By.id("salvar")).click();

List<Map<String, Object>> rows = DatabaseService.select(
        "SELECT email FROM clientes WHERE id = ?", clienteId);
assertEquals(1, rows.size());
assertEquals(emailEsperado, rows.get(0).get("email"));

O fluxo pode ser adaptado para testes de API, interface, integração, contrato ou end-to-end.

RestAssured, Selenium, Cucumber e o framework de asserção continuam sendo dependências do projeto de automação; mindqa-db-commons fornece somente a configuração e a execução JDBC.