Sobes.tech
Middle

¿Dónde se puede aplicar el patrón de diseño Singleton en las pruebas automatizadas?

sobes.tech AI

Respuesta de la IA

En las pruebas automatizadas, Singleton se utiliza a menudo para gestionar recursos que deben ser instancias únicas durante toda la sesión de prueba.

Ejemplos de uso:

  • Gestión de WebDriver: Para garantizar una única instancia del objeto WebDriver, que será utilizada por todas las clases de prueba. Esto evita abrir/cerrar el navegador repetidamente y mantiene el estado entre pasos de prueba.

    public class WebDriverSingleton {
        private static WebDriver instance;
    
        private WebDriverSingleton() {
            // Constructor privado para evitar crear instancias
        }
    
        public static WebDriver getInstance() {
            if (instance == null) {
                // Inicialización de WebDriver (por ejemplo, Chrome, Firefox)
                instance = new ChromeDriver();
            }
            return instance;
        }
    
        public static void quitDriver() {
            if (instance != null) {
                instance.quit();
                instance = null;
            }
        }
    }
    
    // Uso en la clase de prueba
    public class MyTests {
        @BeforeClass
        public void setup() {
            WebDriver driver = WebDriverSingleton.getInstance();
            // Uso de driver
        }
    
        @AfterClass
        public void tearDown() {
            WebDriverSingleton.quitDriver();
        }
        // Métodos de prueba
    }
    
  • Gestión de conexión a base de datos: Garantiza que solo exista una conexión activa a la base de datos para realizar condiciones previas de prueba o verificaciones de datos.

    public class DatabaseConnection {
        private static Connection instance;
    
        private DatabaseConnection() {
            // Constructor privado
        }
    
        public static Connection getInstance() {
            if (instance == null) {
                try {
                    // Establecer conexión con la base de datos
                    instance = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb", "user", "password");
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            return instance;
        }
    
        public static void closeConnection() {
            if (instance != null) {
                try {
                    instance.close();
                    instance = null;
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
  • Gestión del archivo de configuración: Carga los parámetros de configuración desde un archivo al inicio de la ejecución de pruebas y proporciona acceso único a ellos.

    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    
    public class ConfigurationManager {
        private static ConfigurationManager instance;
        private Properties properties;
    
        private ConfigurationManager() {
            properties = new Properties();
            try (InputStream input = getClass().getClassLoader().getResourceAsStream("config.properties")) {
                if (input == null) {
                    System.out.println("Lo siento, no se pudo encontrar config.properties");
                    return;
                }
                properties.load(input);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    
        public static ConfigurationManager getInstance() {
            if (instance == null) {
                instance = new ConfigurationManager();
            }
            return instance;
        }
    
        public String getProperty(String key) {
            return properties.getProperty(key);
        }
    }
    
  • Gestión del registro: Un único ejemplar del registrador para llevar los registros de la ejecución de pruebas de manera centralizada.

El uso de Singleton ayuda a gestionar recursos que requieren unicidad, pero se debe tener cuidado con su uso, especialmente en marcos de prueba multihilo, donde puede surgir un problema de acceso concurrente y necesidad de sincronización. En tales casos, pueden ser necesarios enfoques más complejos, como el uso de ThreadLocal.