用java构建企业级自动化框架(第三篇-脚本的管理)

来源:互联网 发布:怎样通过网络发短信 编辑:程序博客网 时间:2024/05/16 14:05

   这个是我后来写的一本书,http://www.ituring.com.cn/minibook/10775。这个是我后来找到的自动化完美解决方案。


 在前续篇中我们提到了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的使用。


原创粉丝点击