7

我有一个包含 junit 测试的 Java 项目,需要通过 Jenkins 在不同的测试环境(Dev、Staging 等)上运行。

如何将项目的构建设置到不同的环境以及如何将 url、用户名和密码传递给 maven?

我可以使用 maven 3 配置文件从属性文件中读取环境 url、用户名和密码吗?

编辑:我已将配置文件添加到项目 POM:

<profiles>
        <profile>
            <id>Integration</id>
        </profile>
        <profile>
            <id>Staging</id>
        </profile>
        <profile>
            <id>PP1</id>
        </profile>
        <profile>
            <id>PP2</id>
        </profile>
        <profile>
            <id>PP3</id>
        </profile>
</profiles>

如何将 url、用户名和密码传递给这些配置文件?

目前,测试正在从属性文件中获取测试环境详细信息:

 public  class BoGeneralTest extends TestCase {

    protected WebDriver driver;
    protected BoHomePage boHomePage;
    protected static Properties systemProps;
    String url = systemProps.getProperty("Url");
    String username = systemProps.getProperty("Username");
    String password = systemProps.getProperty("Password");
    int defaultWaitTime = Integer.parseInt(systemProps.getProperty("waitTimeForElements"));

    static {
        systemProps = new Properties();
        try {
            systemProps.load(new FileReader(new File("src/test/resources/environment.properties")));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

编辑2:

在测试运行器类中实现的更改:

public class BoGeneralTest extends TestCase {

    protected WebDriver driver;
    protected BoHomePage boHomePage;
    protected static Properties systemProps;
    String url = systemProps.getProperty("Url");
    String username = systemProps.getProperty("Username");
    String password = systemProps.getProperty("Password");
    int defaultWaitTime = Integer.parseInt(systemProps.getProperty("waitTimeForElements"));
    String regUsername = RandomStringUtils.randomAlphabetic(5);

    final static String appConfigPath = System.getProperty("appConfig");

    static {
        systemProps = new Properties();
        try {

            systemProps.load(new FileReader(new File(appConfigPath)));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
4

5 回答 5

6

我不会在 POM 中包含任何属性,而是会为每个环境使用一个外部属性文件,至少当属性更改时您不需要触摸 POM。

在您的 POM 中指定一个配置文件,该配置文件引用具有您的属性的属性文件:

<profiles>
    <profile>
        <id>staging</id>
        <properties>
            <app.config>/your/path/to/app.staging.properties</app.config>
        </properties>
    </profile>
</profile>

然后您可以将其传递到您的 Surefire 配置中:

<plugins>
    <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <systemPropertyVariables>
                <appConfig>${app.config}</appConfig>
            </systemPropertyVariables>
        </configuration>
    </plugin>
</plugins>

然后,您可以在测试中加载属性文件的内容,例如:

final String appConfigPath = System.getProperty("appConfig");
// Load properties etc...

实际上,您实际上可以更进一步……完全转储 Maven 配置文件并-DappConfig=/your/path/to/app.staging.properties在您的 Jenkins 构建配置中指定。

于 2013-03-19T12:04:59.920 回答
0

为什么不使用Maven 构建配置文件,因为您可以指定<properties>每个配置文件来指定不同的构建主机等。只需执行

$ mvn -Pstaging

(比如说)启用暂存配置文件。

有关更多信息,请参阅有关构建配置文件的 Sonatype 手册。

于 2013-03-19T11:45:36.960 回答
0

在这里,我使用 bash 脚本将 Jenkins 构建的工件部署到 Glassfish。

sudo /usr/share/glassfish3/glassfish/bin/asadmin --user admin --passwordfile /root/.asadminpass undeploy PROJECT_NAME
sudo /usr/share/glassfish3/glassfish/bin/asadmin --user admin --passwordfile /root/.asadminpass deploy $WORKSPACE/PROJECT_NAME/target/PROJECT_NAME.war
于 2013-03-19T11:46:52.093 回答
0

您可以设置 Maven 配置文件,并使用 -P 标志选择哪个处于活动状态

于 2013-03-19T11:44:45.280 回答
0

不要为此使用 Maven 构建配置文件!

它迫使您针对不同的环境实际更改构建。

而是让你的测试,可能你的应用程序是可配置的。基本思想是从某些系统属性中读取配置详细信息(例如数据库 url)。这反过来可以很容易地在 Jenkins Job 配置中指定

对于更复杂的场景,您可以从系统属性中指定用于特定目的的类,例如,如果您想要开发环境的 MockedImplementation 和 QA 中的真实事物。

如果您碰巧使用 Spring,请查看 Spring Profiles,它非常支持这种东西。

如果您只在测试中需要它,您应该能够将这类东西封装在 JUnit 规则中。

于 2013-03-19T11:56:45.243 回答