如何设置testsuite文件以跨环境执行

时间:2016-01-16 01:27:27

标签: maven jenkins testng testng-eclipse

我有一个测试套件文件,需要能够从mvn命令行(来自Jenkins)以及Eclipse的按需执行。

测试套件文件必须具有支持参数的能力,即:

<suite name="test run1">
   <parameter name="testEnv" value="dev"></parameter>
   <parameter name="proxyServer" value="x"></parameter>
   <parameter name="proxyPort" value="y"></parameter>

如果我保持原样,则mvn命令行参数不起作用,因为测试套件文件中的值将覆盖参数。即这不起作用:

mvn test ... -dtestEnv=E1QA -dproxyServer= -dproxyPort=

如何编写测试套件文件,以便它支持Eclipse的临时执行和mvn命令行执行?

3 个答案:

答案 0 :(得分:0)

如果您需要可配置的测试属性,请使用@DataProvider而不是硬编码套件xml。

提供者类:

public class EnvProvider {

    @DataProvider(name = "envProvider") 
    public static Object[][] createData() {
        return new Object[][] { new Object[] { 
           System.getProperty("testEnv", "eclipse-default") }
    };
}

测试方法:

@Test(dataProvider = "envProvider", dataProviderClass = EnvProvider.class)
public void myTest(String currentEnv) {
    System.out.println("Current env is : " + currentEnv);
}

的pom.xml

<properties>
    <testEnv>default-pom</testEnv>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <configuration>
                <systemPropertyVariables>
                    <testEnv>${testEnv}</testEnv>
                </systemPropertyVariables>
                ...

eclipse右键单击结果

  

目前的环境是:eclipse-default

mvn test

的结果
  

目前的环境是:default-pom

来自 mvn test -DtestEnv = jenkins 的结果

  

目前的环境是:詹金斯

参考文献:http://testng.org/doc/documentation-main.html#parameters-dataproviders

答案 1 :(得分:0)

如果可以使用系统级args,你可以覆盖套件xml参数 - 这将允许你从xml和mvn运行。

所有参数基本上都分配给一些常量属性,以便在测试中使用。属性文件在套件侦听器的onBeforeSuite方法中初始化,以实现效果

SuiteList extends SuiteListener{
 public void onStart(ISuite suite) {
    LProperties.loadProperties(suite);
}



//loadProperties implementation
  LProperties{

    public static void  loadProperties(ISuite suite){
        //This can read from a properties file and load properties 
        //or
        // from the suite.getParameter - pick the params you need (reflection or list) and assign to the constants

        //For all the properties, do System.getProperty and override values if found
   }

在测试中使用LProperties常量。

答案 2 :(得分:0)

基于上述答案的组合,我已经弄清楚了。

首先删除测试套件文件中的硬编码参数。

接下来,确保pom文件中支持参数。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.4.2</version>
            <configuration>
                <systemPropertyVariables>
                    <environment>${testEnv}</environment>
                    <environment>${proxyServer}</environment>
                    <environment>${proxyPort}</environment>
                </systemPropertyVariables>
            </configuration>
        </plugin>
    </plugins>
</build>

创建常量文件以包含参数的默认值

public class Constants {
    public static final String DEFAULT_TEST_ENV = "dev";
    public static final String DEFAULT_PROXY_SERVER = "a-dev.phx.com";
    public static final String DEFAULT_PROXY_PORT = "8585";
}

在testNG setup()方法中,使用System.getproperty():

@BeforeClass(alwaysRun = true)
protected static void setUp() throws Exception {
    String testEnv = System.getProperty("testEnv", Constants.DEFAULT_TEST_ENV);
    String proxyServer = System.getProperty("proxyServer", Constants.DEFAULT_PROXY_SERVER);
    String proxyPort = System.getProperty("proxyPort", Constants.DEFAULT_PROXY_PORT);

    System.out.println("testEnv: " + testEnv);
    System.out.println("proxyServer: " + proxyServer);
    System.out.println("proxyPort: " + proxyPort);
}

我可以将默认值放在配置文件中,但是现在,常量文件在它自己的类中看起来最简单。