0

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

4

3 回答 3

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 测试的结果

当前环境是:default-pom

来自mvn 测试 -DtestEnv=jenkins的结果

当前环境是:詹金斯

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

于 2016-01-18T07:40:43.303 回答
0

如果可用,您可以使用系统级参数覆盖套件 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 常量。

于 2016-01-19T09:03:20.903 回答
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);
}

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

于 2016-01-21T04:59:30.907 回答