Как использовать системные переменные среды вместо configuration.properties в рамках автоматизации? - PullRequest
0 голосов
/ 10 июня 2019

Я создал инфраструктуру автоматизации тестирования WebApp для своего проекта на локальном компьютере, используя платформы Maven, Java и TestNG. В нашем CI / CD есть TeamCity, и моя команда хотела бы, чтобы инфраструктура использовала переменные среды TeamCity (включая имя пользователя и передачу в тестируемое WebApp) вместо компонентов, жестко закодированных в файле configuration.properties моих проектов.

Механизм, используемый в моем проекте, когда дело доходит до настройки свойств, выглядит следующим образом: - пакет ресурсов, который содержит файл 'configuration.properties'. Этот файл содержит переменные, такие как app.url, browser, chrome.driver.location. - Файл 'configuration.properties' затем читается классами в пакете конфигурации. Классы следующие: AppProperties.java, ConfigurationProperties.java, PropertiesLoader.java, LocalWebDriverPorperties.java и TestRunProperties .java классы

Configuration.properties

app.url=url for app under test
is.remote.run=false
grid.url="";

browser=CHROME
chrome.driver.location=C:/Selenium/chromedriver.exe
firefox.driver.location=C:/Selenium/geckodriver.exe

AppProperties.java

package configuration;

public class AppProperties {

        public static String getAllUrl() {
            return ConfigurationProperties.getProperties().getProperty("app.url");
        }

    }

ConfigurationProperties.java

package configuration;

import java.util.Properties;

public class ConfigurationProperties {

    private static Properties properties;

    private ConfigurationProperties() {
    }


    public static void setProperties(Properties properties) {
        ConfigurationProperties.properties = properties;
    }

    public static Properties getProperties() {
        if (properties == null) {
            throw new IllegalStateException("Please set properties using setProperties() before calling getProperties()");
        }
        return properties;
    }
}

PropertiesLoader.java

package configuration;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class PropertiesLoader {

    private Logger logger = LogManager.getLogger(PropertiesLoader.class);


    public Properties getPropertiesFromFile(String propertiesFileName) {


        InputStream inputStream = null;


        Properties properties = new Properties();
        try {
            logger.info("Trying to load properties with file name: " + propertiesFileName);


            inputStream = getClass().getClassLoader().getResourceAsStream(propertiesFileName);


            if (inputStream != null) {

                properties.load(inputStream);
                logger.info("Successfully loaded properties for file: " + propertiesFileName);
            } else {
                throw new FileNotFoundException("Property file '" + propertiesFileName + "' not found in the classpath");
            }

        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("Cannot load properties due to IOException!");
        } finally {

            closeResource(inputStream);
        }


        return properties;
    }

    private void closeResource(InputStream inputStream) {
        try {
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

LocalWebDriverProperties.java

package configuration;

public class LocalWebDriverProperties {

       return BrowserType.valueOf(ConfigurationProperties.getProperties().getProperty("browser"));
//    }
    public static String getChromeWebDriverLocation() {
        return ConfigurationProperties.getProperties().getProperty("chrome.driver.location");
    }

    public static String getFirefoxWebDriverLocation() {
        return ConfigurationProperties.getProperties().getProperty("firefox.driver.location");
    }

    public static String getInternetExplorerWebDriverLocation() {
        return ConfigurationProperties.getProperties().getProperty("ie.driver.location");
    }
}

TestRunProperties.java

package configuration;
import driver.manager.BrowserType;


public class TestRunProperties {

    public static String getGridUrl() {
        return ConfigurationProperties.getProperties().getProperty("grid.url");
    }

    public static BrowserType getBrowserToRun() {
        return BrowserType.valueOf(ConfigurationProperties.getProperties().getProperty("browser"));
    }

    public static boolean getIsRemoteRun(){
        return Boolean.parseBoolean(ConfigurationProperties.getProperties().getProperty("is.remote.run"));
    }
}

Приведенная выше конфигурация работает нормально, если я указываю свойства сервера, такие как (app.url, browser), используемые сервером Team City, в файле configuration.properties платформы. Но то, что я ищу, - это использовать другой подход и вместо того, чтобы настраивать свойства в файле configuration.properties, использовать переменные среды TeamCity.

Вероятно, наличие этой функциональности в одном классе, например AppProperties.java, вместо использования 5 классов, как я делаю в данный момент.

Есть ли способ сделать это?

...