在前续篇中我们提到了junit suit是如何运行多个case的,

那在自己搭建的框架中,你可以自己创建一个或多个×××.suite(xml or properties等类型均可)文件,然后把要运行的脚本路径写入里面,然后每次要大批量运行脚本时,只要读取相应的×××.suite文件然后把里面内容放入List中然后去运行就行了。你的测试用例可能分为好多种,比如功能性测试用例或者流程性测试用例,可以分别写在不同的文件里,根据自己的需要依次执行相应的文件就行了。因为如何把文件里的字符解析出来然后放到List里比较简单。就不细说了。

那么既然提到大批量运行脚本,我们就说下大批量脚本是怎么运行的。因为你不可能一个一个去执行,这样太费时间,只能并发多处理器运行。下面我们会一步一步说明它的实现方式。


  我们现在提到另外一个东西,TestNg,他和JunitTest的suite最大的不同之处在于可以同时并发执行多个测试用例,还有一个是selenium gird,它负责多处理器集群运行脚本。

我们先看下配置testng的ant脚本testng.xml,它指定在只装firefox和Ie8的不同的服务器上运行相同的测试用例。thread-count="10"启动10个线程去运行。

<classes>
<class
name="bert.lib.webapplication.estore.search.JstLibEStoreLoginPageTest">
</class>

是指定到包名。包里面的class都能运行。


<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >


 <suite name="Suite1" parallel="classes" thread-count="10" verbose="3">
<parameter name="qaEnvironment" value="QA3" />
<parameter name="environmentPlace" value="bert.lib.webapplication.JstLibTestRMI" />
<test name="Regression1">
<parameter name="browserType" value="*firefox" />
<parameter name="jstEnvironment" value="FIREFOX_3_WINDOWS" />
<classes>
<class
name="bert.lib.webapplication.estore.search.JstLibEStoreLoginPageTest">
</class>
<class
name="bert.lib.webapplication.estore.account.JstLibEStoreAccountPageTest">
</class>
</classes>
</test>


<test name="Regression2">
<parameter name="browserType" value="*iexplore" />
<parameter name="jstEnvironment" value="IE_8_WINDOWS" />
<classes>
<class
name="bert.lib.webapplication.estore.search.JstLibEStoreLoginPageTest">
</class>
<class
name="bert.lib.webapplication.estore.account.JstLibEStoreAccountPageTest">
</class>
</classes>
</test>


 </suite>下面是配置grid配置文件,命名为testconfig.properties。
#BASE_URL
 BASE_URL=http://172.28.94.14:8080/estore/


 # IE browser
 #BROWSER_TYPE = *iexplore
 # Firefox browser
 BROWSER_TYPE = *firefox


 # QA_ENVIRONMENT
 QA_ENVIRONMENT = QA3


 # JST_ENVIRONMENT
 #JST_ENVIRONMENT=IE_6_WINDOWS
 #JST_ENVIRONMENT=IE_7_WINDOWS
 #JST_ENVIRONMENT=IE_8_WINDOWS
 JST_ENVIRONMENT=FIREFOX_3_WINDOWS
读取配置文件
public class ConfigUtil {


private static Properties props = new Properties();

static {
try {
props.load(ConfigUtil.class.getResourceAsStream("/testconfig.properties"));
} catch (IOException e) {
e.printStackTrace();
}
}

public static String getConfig(String key) {
return props.getProperty(key);
}
 }test类,注意@Parameters({ "qaEnvironment", "environmentPlace" })里面指定的值可以被testng.xml里的<parameter name="browserType" value="*firefox" />
<parameter name="jstEnvironment" value="FIREFOX_3_WINDOWS" />改写。@BeforeSuite
@Parameters({ "qaEnvironment", "environmentPlace" })
protected void initTestEnvironment(@Optional("QA3") String qaEnv,
@Optional("bert.lib.webapplication.JstLibTestLocal") String className) throws Exception {
BertBase.initialize();
BertConfig.initQaEnvironment(qaEnv);
testEnv = (JstLibTestEnvironment) Class.forName(className).newInstance();
testEnv.init();
}


@BeforeClass
@Parameters({ "jstEnvironment", "browserType" })
protected void startSelenium(@Optional("IE_8_WINDOWS") String env, @Optional("*iexplore") String browserType)
throws Exception {
guiEvent = testEnv.start(env, browserType);
}


@AfterClass
protected void closeSelenium() throws Exception {
testEnv.close();
}


@AfterSuite
protected void closeTestEnv() throws Exception {
testEnv.closeEnv();
}


 }下面是它的测试主要类
public abstract class JstLibBaseTest {


public static final String KEY_BASE_URL = "BASE_URL";
public static final String KEY_BROWSER_TYPE = "BROWSER_TYPE";
public static final String KEY_QA_ENV = "QA_ENVIRONMENT";
public static final String KEY_JST_ENVIRONMENT = "JST_ENVIRONMENT";


protected static SeleniumServer server;
protected static Selenium selenium;
protected static GUIEvent GUIE;


@BeforeClass
public static void baseSetUpBeforeClass() throws Exception {
/* start server */
RemoteControlConfiguration cfg = new RemoteControlConfiguration();
try {
server = new SeleniumServer(cfg);
server.boot();
} catch (Exception e) {
e.printStackTrace();
}


/* start selenium instance */
BertBase.initialize();
BertConfig.initQaEnvironment(ConfigUtil.getConfig(KEY_QA_ENV));
selenium = new DefaultSelenium("localhost", 4444, ConfigUtil.getConfig(KEY_BROWSER_TYPE),
ConfigUtil.getConfig("BASE_URL"));
GUIE = new GUIEvent(selenium, ConfigUtil.getConfig(KEY_JST_ENVIRONMENT));
selenium.start();
selenium.windowMaximize();
}


@AfterClass
public static void baseTearDownAfterClass() throws Exception {
selenium.stop();
server.stop();
}
所有要测试testng继承它就行了。
比如下面这个类
public class JstLibEStoreSearchResultPageTest extends JstLibBaseTest {

 }

最后是selenium gird 配置方法

  下面,我们就介绍下如何使用Selenium Grid。

  准备:

  1. 下载安装ant
  http://apache.mirrormax.net/ant/binaries/apache-ant-1.7.0-bin.zip   解压包到你选择的任意目录,然后将 你的解压路径/apache-ant-1.7.0/bin 添加的Path变量中。
  最后验证安装:
  $ ant -version
  Apache Ant version 1.7.0 compiled on December 13 2006

  2. 下载安装JDK 1.6
  http://www.java.com/en/download/index.jsp   安装后添加java的bin目录到path变量,然后验证:
  $java -version
  java version "1.6.0"
  Java(TM) SE Runtime Environment (build 1.6.0-b105)
  Java HotSpot(TM) Server VM (build 1.6.0-b105, mixed mode)

  3. 下载Selenium Grid
  http://selenium-grid.seleniumhq.org/download.html   其中,zip是Windows平台的,tar.bz2用于其他平台。下载后解压缩,然后验证:
  $cd <你的grid目录>
  $ant sanity-check

  运行:

  1. 运行Selenium Grid
  $ ant launch-hub

  通过浏览器访问Selenium Grid控制台验证Selenium Grid启动成功:
  http://localhost:4444/console

  2. 运行Selenium Remote Control
  与Grid在同一台机器上,只要指定不同的端口号,就可以运行多个RC在同一台机器上:
 

$ant -Dport=5556 launch-remote-control
   $ant -Dport=5557 launch-remote-control
   $ant -Dport=5558 launch-remote-control

  运行后,通过访问Grid控制台,验证RC注册成功:

localhost
  5555
  *firefox
  
       
 localhost
  5556
  *firefox
  
 localhost
  5557
  *firefox
  
 localhost
  5558
  *firefox


 

  与Gird不在同一台机器上,假设环境如下图:

 

  我们三台机器,一台机器hub.thoughtworks.com运行grid,其它两台rc1和rc2分别运行两个RC.则我们需要在启动RC时,使用下列命令指定相应的参数:


$ant -Dport=<port> -Dhost=<hostname> -DhubURL=<hub url> -Denvironment="Firefox on Windows" launch-remote-control



  其中,-Dport指定RC的端口号,-Dhost指定RC所在机器的Host名。-DhubURL指定Grid机器的URL,-Denvironment标示RC的浏览器和操作平台,具体可参考Grid控制台说明。


  URL可以使Host Name,也可以是TCP/IP。


  按照上图所示参数运行完毕后,通过Grid控制台验证成功结果如下:


Host 

  Port 

  Environment 

   

 rc1.seleniumhq.org 

  5555 

  Firefox on Windows 

   

 rc1.seleniumhq.org 

  5556 

  Firefox on Windows 

   

 rc2.seleniumhq.org 

  5555 

  Firefox on Mac 

   

 rc2.seleniumhq.org 

  5556 

  Firefox on Mac


运行的testng 的不需要关心它是怎么把脚本分发到不同的服务器运行,这有gird自动替你完成。


到这里可以说已经接触到automation框架最难的地方。下面章节会说明在框架中实现并发多服务器测试。同时会介绍ActiveMQ的使用。