Sobes.tech
Middle

Gde u automatizovanom testiranju može da se primeni Singleton obrazac?

sobes.tech АИ

Одговор од АИ

У аутоматском тестирању, Singleton се често користи за управљање ресурсима који морају бити јединствени током целе тестне сесије.

Примери употребе:

  • Управљање WebDriver-ом: Да се обезбеди да постоји само један примерак објекта WebDriver, који користе све тестне класе. Ово спречава поновно отварање/затварање прегледача и одржава стање између корака теста.

    public class WebDriverSingleton {
        private static WebDriver instance;
    
        private WebDriverSingleton() {
            // Приватни конструктор за спречавање стварања примерака
        }
    
        public static WebDriver getInstance() {
            if (instance == null) {
                // Иницијализација WebDriver-а (нпр. Chrome, Firefox)
                instance = new ChromeDriver();
            }
            return instance;
        }
    
        public static void quitDriver() {
            if (instance != null) {
                instance.quit();
                instance = null;
            }
        }
    }
    
    // Коришћење у тест класи
    public class MyTests {
        @BeforeClass
        public void setup() {
            WebDriver driver = WebDriverSingleton.getInstance();
            // Коришћење driver-а
        }
    
        @AfterClass
        public void tearDown() {
            WebDriverSingleton.quitDriver();
        }
        // Тест методе
    }
    
  • Управљање везом са базом података: Гаранција да постоји само једна активна веза са базом података за извођење предуслова или провере података.

    public class DatabaseConnection {
        private static Connection instance;
    
        private DatabaseConnection() {
            // Приватни конструктор
        }
    
        public static Connection getInstance() {
            if (instance == null) {
                try {
                    // Успостављање везе са базом података
                    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();
                }
            }
        }
    }
    
    // Управљање конфигурационим фајлом
    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("Жао нам је, не можемо пронаћи 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);
        }
    }
    
    // Управљање логовањем
    public class Logger {
        private static Logger instance;
    
        private Logger() {
            // приватни конструктор
        }
    
        public static Logger getInstance() {
            if (instance == null) {
                instance = new Logger();
            }
            return instance;
        }
    
        public void log(String message) {
            // логика за вођење дневника
        }
    }
    

Коришћење Singleton помаже у управљању ресурсима који морају бити јединствени, али треба бити опрезан у његовој употреби, посебно у мулти-тредним тест оквирима, где може доћи до проблема са конкуренцијским приступом и потребом за синхронизацијом. У таквим случајевима могу бити потребни сложенији приступи, као што је коришћење ThreadLocal.