Sobes.tech
Middle

Kur galima taikyti Singleton dizaino šabloną automatizuotuose testuose?

sobes.tech AI

Atsakymas iš AI

Automatiniame testavime Singleton dažnai naudojamas valdyti išteklius, kurie turi būti vienetiniai viso testavimo sesijos metu.

Pavyzdžiai:

  • WebDriver valdymas: Užtikrinti vieną WebDriver objekto egzempliorių, kurį naudoja visi testų klasės. Tai leidžia išvengti naršyklės pakartotinio atidarymo/uždarymo ir išlaikyti būseną tarp testų žingsnių.

    public class WebDriverSingleton {
        private static WebDriver instance;
    
        private WebDriverSingleton() {
            // Privatūs konstruktorius, siekiant užkirsti kelią instancijų kūrimui
        }
    
        public static WebDriver getInstance() {
            if (instance == null) {
                // WebDriver inicializavimas (pvz., Chrome, Firefox)
                instance = new ChromeDriver();
            }
            return instance;
        }
    
        public static void quitDriver() {
            if (instance != null) {
                instance.quit();
                instance = null;
            }
        }
    }
    
    // Naudojimas testų klasėje
    public class MyTests {
        @BeforeClass
        public void setup() {
            WebDriver driver = WebDriverSingleton.getInstance();
            // Naudoti driver
        }
    
        @AfterClass
        public void tearDown() {
            WebDriverSingleton.quitDriver();
        }
        // Testų metodai
    }
    
  • Duomenų bazės ryšio valdymas: Užtikrinti, kad būtų tik vienas aktyvus ryšys su duomenų baze, naudojamas testų išankstiniams sąlygoms ar duomenų patikrinimui.

    public class DatabaseConnection {
        private static Connection instance;
    
        private DatabaseConnection() {
            // Privatūs konstruktorius
        }
    
        public static Connection getInstance() {
            if (instance == null) {
                try {
                    // Prisijungimo prie duomenų bazės nustatymas
                    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();
                }
            }
        }
    }
    
  • Konfigūracijos failo valdymas: Paraiškų parametrų įkėlimas iš failo pradžioje ir vienodas prieigos prie jų suteikimas.

    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("Atsiprašome, nepavyko rasti 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);
        }
    }
    
  • Žurnalo įrašymo valdymas: Vienas žurnalo įrašymo pavyzdys, skirtas centralizuotam testų žurnalo valdymui.

Singleton padeda valdyti išteklius, kuriems reikalingas unikalumas, tačiau jo naudojimas turi būti atsargus, ypač daugiagijų testavimo sistemose, kur gali kilti konkurencijos ir sinchronizacijos problemų. Tokiu atveju gali būti reikalingi sudėtingesni sprendimai, pavyzdžiui, ThreadLocal naudojimas.