您的位置:首页 > 编程语言 > Java开发

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

2011-11-28 10:30 615 查看
这个是我后来写的一本书,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的使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: