如何在Maven中使用不同的配置运行UI测试

时间:2019-08-05 01:49:13

标签: java selenium cucumber ui-automation

我是自动化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

从正确的文件中选择属性,然后根据浏览器参数设置Web驱动程序。

有可能这样做吗?这种情况有什么例子吗?

2 个答案:

答案 0 :(得分:3)

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

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

假设您将属性文件存储在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>

</dependencies>

如您所见,我已经创建了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语句中填写所有使用的浏览器。

希望有帮助!

答案 1 :(得分:0)

对不起,如果代码看起来很垃圾,我倾向于使用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

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


如果您有多种不同的东西,例如不同的网络驱动程序等,则可以用相同的方式完成。然后根据属性的值读入属性,初始化所需的任何驱动程序。

希望有帮助