Aprende a automatizar pruebas con Java | Parte 4: Bases de datos

4 min read
21 de junio de 2023

Las bases de datos tienen un papel fundamental  en un proyecto de automatización de pruebas de software. En este artículo te explicamos cómo puedes utilizarlas y te mostramos cómo integrarlas en tu proyecto. Para aprender más, también puedes consultar la tercera parte de esta serie de artículos en la que hablamos sobre cómo usar la API de Google Sheets en un proyecto de pruebas QA automatizadas. 

Las bases de datos son componentes esenciales en muchos sistemas, y la mayoría de las aplicaciones interactúan con ellas de alguna manera. En un entorno de pruebas, las bases de datos juegan juegan un rol fundamental pues proporcionan un estado inicial conocido para las pruebas y permiten la verificación de la integridad de los datos durante el proceso de automatización.

El uso de bases de datos en las pruebas automatizadas permite simular escenarios reales en los que se pueden probar diferentes funciones del software, como la inserción, modificación o eliminación de datos. Además, se pueden realizar pruebas de consultas y comprobaciones de integridad referencial, lo que garantiza que los datos sean consistentes y que las relaciones entre ellos se mantengan correctamente.

¿Cómo usar Java para automatizar pruebas QA en proyectos con bases de datos?

Por su parte, el acceso y manipulación de datos en una base de datos a través de código Java automatizado  brinda la posibilidad de realizar pruebas de regresión, donde se pueden validar los cambios realizados en el software y verificar que no se hayan producido efectos secundarios no deseados en los datos almacenados.

La capacidad de interactuar con bases de datos en un proyecto de automatización de pruebas de software ayuda a garantizar la calidad y la estabilidad del sistema en su conjunto. Al tener un control preciso sobre los datos utilizados en las pruebas, es posible realizar pruebas más exhaustivas y descubrir problemas potenciales antes de que lleguen a los usuarios finales. Esto conduce a una mayor confianza en el software y a la reducción de errores y fallas una vez que se implementa en producción.

Para manejar las base de datos podemos tener 2 clases de utilidad, una para la gestión de la conexión y otra para gestionar las diferentes peticiones a la misma. La clase gestor de conexión puede recibir el nombre de ‘ConnectionManagerDB’ y se detalla a continuación:


package utils.data;

import

public class ConnectionManagerDB {

    Logger logger=Logger.getLogger(ConnectionManagerDB.class.getName());
    private Connection connection;


    public static ConnectionManagerDB util(){return new ConnectionManagerDB();}

    public Connection getConnection() {
        return connection;
    }

    public void setConnection(Connection con) {
        connection = con;
    }


    public Connection crearConexionMySql(String strCon, String usr, String pwd) throws SQLException {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            connection = DriverManager.getConnection(strCon, usr, pwd);
            logger.log(Level.FINE, "Connection successful");
            return connection;
        } catch (ClassNotFoundException | SQLException ex) {
            throw new RuntimeException("Falló la creación de la conexión con la BD de MySQL, error: "+ ex.getMessage());
        }
    }

    public void closeConnection( Connection connection){
        try {
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            logger.log(Level.SEVERE,() ->"CONNECTION_NOT_CLOSED " + e.getMessage());
        }
    }
}


Y la clase de utilidad para gestionar las peticiones a la BD  puede recibir el nombre de ‘AppDB’ y se detalla a continuación

package utils.data;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class AppDB {
    private static Logger logger=Logger.getLogger(AppDB.class.getName());
    private static ResultSet resultSet = null;
    private static Statement statement;
    private static boolean result = false;
   
    private AppDB(){}
   
    public static ResultSet executeSelect(String strQuery, Connection conexion) throws SQLException
    {
        try{
            statement = conexion.createStatement();
            resultSet = statement.executeQuery(strQuery);
        }catch(SQLException e){
            logger.log(Level.SEVERE,() -> "CONNECTION_FAILURE " + e.getMessage());
        }catch(Exception ex){
            logger.log(Level.SEVERE,() -> "DRIVER_NOT_FOUND " + ex.getMessage() );
        }
        return resultSet;
    }

    public static boolean executeUpdateOrDelete(String strQuery, Connection conexion)
    {
        try{
            statement = conexion.createStatement();
            statement.executeUpdate(strQuery);
            result = true;
        }catch(SQLException e){
            logger.log(Level.SEVERE,() -> "CONNECTION_FAILURE " + e.getMessage());
            result = false;
        }catch(Exception ex){
            logger.log(Level.SEVERE,() -> "DRIVER_NOT_FOUND " + ex.getMessage());
        }
        return result;
    }

    public static Map<String,String> fillHashWithResultSetRecord(ResultSet resultSet) throws SQLException {

        HashMap<String,String> hashMap = new HashMap<>();
       
        if(resultSet != null) {
            while(resultSet.next()) {
                for(int i=1;i<=resultSet.getMetaData().getColumnCount();i++){
                    String nombreCampo = resultSet.getMetaData().getColumnName(i);
                    String valorCampo = resultSet.getObject(i)== null?"":resultSet.getObject(i).toString();
                    hashMap.put(nombreCampo, valorCampo);
                }
            }
        }
        return hashMap;
    }

    public static List<Map<String,String>> fillHashWithResultSetList(ResultSet resultSet) throws SQLException {

        List<Map<String,String>> listRecords = new ArrayList<>();

        if(resultSet != null) {

            List<String> columnNames = new ArrayList<>();
            for (int i=1; i <= resultSet.getMetaData().getColumnCount(); i++) {
                String columnName = resultSet.getMetaData().getColumnName(i);
                columnNames.add(columnName);
            }
            while(resultSet.next()) {
                //con LinkedHashMap mantenemos el orden en que se agregaron
                HashMap<String,String> hashMap = new LinkedHashMap<>();
                for(String columnName : columnNames){
                    String valorCampo = resultSet.getObject(columnName)== null?"":resultSet.getObject(columnName).toString();
                    hashMap.put(columnName, valorCampo);
                }
                listRecords.add(hashMap);
            }
        }
        return listRecords;
    }
}

 

yUn ejemplo del uso de la utilidad para obtener un dato de un registro de una base de datos se muestra a continuación, donde se tiene un método dentro de una prueba automatizada con Serenity y POM en donde se debe ingresar en un campo de texto de una página web una frase contenida en la base de datos.

public void readDBAndWriteOnSearchField(Integer id){

        ResultSet resultSet;
        HashMap<String,String> hashMap;
        try {
            Connection connection = ConnectionManagerDB.util().crearConexionMySql(MYSQL_URL,MYSQL_USER,MYSQL_PASSWORD);
            resultSet = AppDB.executeSelect(String.format(QueriesConstants.SELECT_DATA_SEARCH_VALUES_BY_ID,id),connection);
            hashMap = (HashMap<String, String>) AppDB.fillHashWithResultSetRecord(resultSet);
            ConnectionManagerDB.util().closeConnection(connection);
        } catch (SQLException e) {
            throw new RuntimeException("error obteniendo valor de la base de datos, mensaje: " + e.getMessage());
        }
        enter(hashMap.get("value")).into(SEARCH_FIELD);

}


Un ejemplo para el uso de esta utilidad se muestra a continuación con la asignación de constantes leídas de este archivo de configuración.

package utils;

public class UtilConstants {

//    Archivo google sheet
    public static final String SPREADSHEET_ID = AppProperties.getSpreadSheetId();
    public static final String NAME_HOJA = AppProperties.getNameHoja();
    public static final String RANGE = AppProperties.getRange();

//    Conexión BD
    public static final String MYSQL_URL = AppProperties.getMySqlUrl();
    public static final String MYSQL_USER = AppProperties.getMySqlUser();
    public static final String MYSQL_PASSWORD = AppProperties.getMySqlPassword();

}


El query utilizado como constante en la consulta es el siguiente:

package utils.data;

public class QueriesConstants {

    public static final String SELECT_DATA_SEARCH_VALUES_TABLE = " SELECT * FROM search_values ";
    public static final String SELECT_DATA_SEARCH_VALUES_BY_ID = SELECT_DATA_SEARCH_VALUES_TABLE + " WHERE id='%s' ";

}



Para seguir aprendiendo, consulta ya la quinta parte de esta serie de artículos. Allí explicaremos cómo podemos sacar ventaja de Excel para automatizar pruebas con Java. 

También te invitamos a consultar nuestro micrositio de carrera donde encontrarás información importante sobre nuestras vacantes de trabajo y la cultura empresarial que hace que trabajar en Pragma sea una experiencia única.

scrum_metodologia_agil_ebook

 

Suscríbete al
Blog Pragma

Recibirás cada mes nuestra selección de contenido en Transformación digital.

Imagen form