Я создал инфраструктуру автоматизации тестирования 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 классов, как я делаю в данный момент.
Есть ли способ сделать это?