【问题标题】:How to run UI tests with different configuration in Maven如何在 Maven 中运行具有不同配置的 UI 测试
【发布时间】:2019-12-12 13:14:52
【问题描述】:

我是自动化 UI 测试的新手,我正在使用 Cucumber 和 Selenium 进行 UI 自动化。

所以在我的项目中,我创建了一个 Hook 类来设置用于测试的 Web 驱动程序。像这样的:

System.setProperty("webdriver.chrome.driver", "driver path");
driver = new chrome driver;

但是如果我想用不同的浏览器和不同的环境运行相同的测试。例如,我想用 chrome 和环境 A 运行测试,并用 firefox 和环境 B 运行相同的测试。我计划为不同的环境创建两个属性文件

env=qa
baseURl = http://qa......
username = test
password = test

env=dev
baseURl = http://dev......
username = test1
password = test1

我只想放一个像

这样的 maven 命令
mvn clean test broswer=chrome env=qa

从正确的文件中选择属性并根据浏览器参数设置网络驱动程序。

有可能做到吗?这种场景有什么例子吗?

【问题讨论】:

    标签: java selenium cucumber ui-automation


    【解决方案1】:

    对不起,如果代码看起来很垃圾,我倾向于使用 Scala


    这是一个使用我设法开始工作的属性的简单示例:

    省略部分代码

    private String getBaseUrl() {
            String base = "";
            String foo = System.getProperty("browser", "chrome");
            switch (foo) {
                case "firefox":
                    base = "https://www.google.co.uk";
                    break;
                case "chrome":
                    base = "https://www.bbc.co.uk";
                    break;
            }
            return base;
        }
    
    
    
    public void goTo() {
            this.driver.get(getBaseUrl());
        }
    

    所以当我使用命令时:

    mvn -Dbrowser=chrome test

    驱动程序将导航到https://www.bbc.co.uk

    如果我使用:

    mvn -Dbrowser=firefox test

    然后驱动程序将导航到https://www.google.co.uk

    如果我只是输入:

    mvn test

    然后它将导航到 bbc,因为默认设置为 Chrome


    如果你有多个东西,比如不同的 webdrivers 等,那么它可以用同样的方式完成。读入一个属性,然后根据该属性的值,初始化您需要的任何驱动程序。

    希望有帮助

    【讨论】:

      【解决方案2】:

      使用属性是个好主意。你走在正确的轨道上。

      为了加载不同的属性,根据环境,可以为属性文件创建多个文件夹。

      假设您将属性文件存储在src/main/java/dev/properties.properties

      创建多个目录,如:

      src/main/java/qa
      src/main/java/dev
      src/main/java/prod
      

      在每个路径中创建 1 个属性文件,就像我在开始时所做的那样。

      现在,您想使用 maven 加载正确的属性。您可以使用maven profiles 来执行此操作。

      到您的pom.xml 添加:

      </dependencies>
          <profiles>
              <profile>
                  <activation>
                      <activeByDefault>true</activeByDefault>
                  </activation>
                  <id>dev</id>
                  <properties>
                      <configuration.path>src/main/dev</configuration.path>
                  </properties>
              </profile>
              <profile>
                  <activation>
                      <activeByDefault>false</activeByDefault>
                  </activation>
                  <id>prod</id>
                  <properties>
                      <configuration.path>src/main/prod</configuration.path>
                  </properties>
              </profile>
          </profiles>
      </project>
      

      就在&lt;/dependencies&gt;下面

      如您所见,我创建了 2 个配置文件。他们的 ID 是 devprod。两个配置文件都有一个 configuration.path 属性指向您的 .properties 文件。 要使用 maven 推荐运行配置文件,您只需键入 -PprofileId。以-Pdev 为例

      我希望你使用maven-surefire-plugin,因为这就是我将在示例中展示的内容。

      <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-surefire-plugin</artifactId>
                      <version>2.22.1</version>
                      <configuration>
                          <systemPropertyVariables>
                              <configuration.path>${configuration.path}</configuration.path>
                          </systemPropertyVariables>
                      </configuration>
                  </plugin>
      

      以上只是surefire-plugin的部分配置!让我们关注systemPropertyVariables。为了从 Maven 配置文件中获取属性,您可以将它们加载到系统中,方法是将 ${configuration.paths} 变量传递给 surefire-plugin。您可以使用相同的名称。

      现在,您需要将.properties 文件中的属性加载到系统中。我写了一个类来做到这一点,阅读configuration.path。您可以使用其他解决方案。

      public class Properties {
          private static java.util.Properties props;
      
          static {
              props = new java.util.Properties();
      
              String pathWithPropertiesFiles = System.getProperty("configuration.path");
              String[] paths = pathWithPropertiesFiles.split("[;]");
      
              Arrays.asList(paths).forEach(propertyPath -> Arrays.asList(Objects.requireNonNull(new File(propertyPath).listFiles())).forEach(propertyFile -> {
                  InputStream input;
                  try {
                      input = new FileInputStream(propertyFile);
                      props.load(input);
                  } catch (IOException e) {
                      throw new RuntimeException(e);
                  }
              }));
          }
      
          public static String getValue(String key) {
              String envProperty = System.getenv(key);
              if (envProperty != null && !envProperty.equals("null")) {
                  return envProperty;
              }
      
              String systemProperty = System.getProperty(key);
              if (systemProperty != null && !systemProperty.equals("null")) {
                  return systemProperty;
              }
      
              return props.getProperty(key);
          }
      }
      

      上述解决方案允许您将多个路径传递给configuration.path 属性,以; 分隔。

      如果你想打开正确的 URL,你只需使用 Properties.getValue("baseURL"); 它会根据你选择的配置文件从正确的路径获取 URL。

      现在,除了浏览器之外,您可以做类似的事情。我强烈建议阅读BrowserFactoryFactory 设计模式。我只能为您提供有关如何执行此操作的提示,因为我的解决方案可能无法如您所愿。

      创建其他配置文件(您可以在 maven 中使用多个配置文件)但用于浏览器。

      <profile>
                  <activation>
                      <activeByDefault>true</activeByDefault>
                  </activation>
                  <id>chrome</id>
                  <properties>
                      <browser.type>chrome</browser.type>
                  </properties>
              </profile>
      

      调用:-Pchrome

      记得加到surefire-plugin:

      <configuration>
                          <systemPropertyVariables>
                              <configuration.path>${configuration.path}</configuration.path>
                              <browser.type>${browser.type}</browser.type>
                          </systemPropertyVariables>
                      </configuration>
      

      你现在要做的就是想想,你在哪里实例化你的浏览器。

      简单的解决方案是(非线程安全!!!):

      public class Browser {
      
          public static WebDriver getDriver() {
              String browserType = Properties.getValue("browser.type"); //it will get the `chrome` for profile `chrome`
              switch(browserType) {
                  case "chrome": return new ChromeDriver();
              }
          }
      }
      

      您现在要做的就是在您的框架中实施解决方案。添加配置文件,使用所有使用的浏览器填写switch 语句。

      希望对你有帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多