Maven,Jenkins - 如何将项目构建到不同的测试环境?

时间:2013-03-19 11:40:06

标签: java maven-3 junit4

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

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

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

编辑:我已将配置文件添加到Project 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>

如何将网址,用户名和密码传递给这些个人资料?

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

 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();
        }
    }

5 个答案:

答案 0 :(得分:5)

我不会在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配置文件,并在Jenkins构建配置中指定-DappConfig=/your/path/to/app.staging.properties

答案 1 :(得分:0)

您可以设置maven配置文件,并使用-P标志

选择哪一个处于活动状态

答案 2 :(得分:0)

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

$ mvn -Pstaging

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

有关详细信息,请参阅Build Profiles上的Sonatype手册。

答案 3 :(得分: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

答案 4 :(得分:0)

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

它会强制您实际更改不同环境的构建。

而是进行测试,并且可能是您的应用程序可配置。基本思想是从一些系统属性中读取配置详细信息(例如数据库URL)。这反过来可以在Jenkins作业配置中轻松指定

对于更复杂的场景,您可以从系统属性中指定用于给定目的的类,例如,如果您需要针对Dev环境的MockedImplementation以及QA中的真实内容。

如果您碰巧使用Spring,请查看Spring Profiles,它非常支持这类内容。

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