如何设置测试套件文件以跨环境执行
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。
我有一个测试套件文件,需要能够从 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。