如何设置测试套件文件以跨环境执行

How to set up testsuite files for execution across environments

我有一个测试套件文件,需要能够从 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 命令行执行的临时执行?

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

供应商class:

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 右键点击结果

Current env is : eclipse-default

来自 mvn 测试的结果

Current env is : default-pom

结果来自 mvn test -DtestEnv=jenkins

Current env is : jenkins

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

您可以使用系统级参数覆盖套件 xml 参数(如果可用)- 这将允许您从 xml 和 mvn 运行 [=11] =]

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

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 常量。

根据以上答案的组合,我已经弄明白了。

首先删除测试套件文件中的 hard-coded 参数。

接下来,确保 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);
}

我可以将默认值放在配置文件中,但就目前而言,常量文件本身似乎最简单 class。