12
返回列表 发新帖
楼主: Sky-Tiger

建立基于 Linux 和 MPICH2 的并行计算环境

[复制链接]
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
11#
 楼主| 发表于 2013-5-20 20:29 | 只看该作者
业务测试人员擅长什么
显然,测试人员十分熟悉业务,擅长编写传统的功能测试用例文档。本文会给出一份简化的测试用例:在搜索引擎谷歌站点查询 IBM 开发者社区,如下表:

表格 2. 测试用例
步骤编号         步骤名称         期望结果         实际结果         执行状态
1 .         打开浏览器,访问谷歌站点         谷歌首页被打开               
2 .         在谷歌搜索输入框输入“IBM Developerworks cn”         成功输入               
3 .         点击 “搜索”按钮         搜索成功,显示搜索结果               
4 .         截屏         成功截屏,图片文件保存成功               

该测试用例只包括测试步骤,每个测试步骤又分成若干组成部分:步骤编号、测试步骤、期望结果、实际结果、执行状态等。很显然,业务测试人员肯定会写出比这复杂得多的用例。我们用这份简单的测试做演示使用。下面就演示如何对这个用例做自动化测试。

使用道具 举报

回复
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
12#
 楼主| 发表于 2013-5-20 20:29 | 只看该作者
用 Selenium 为测试用例编写自动化脚本
我们先以开源的 Selenium 工具为例,开发上述用例的自动化测试脚本。Selenium 包含 Selenium-IDE、Selenium Remote Control、Selenium WebDriver 和 Selenium Grid,他们共同组成了强大的自动化测试工具。Selenium RC 和 Selenium WebDriver 都可以使用 Selenium Sever,Selenium Server 还包括内建的 Grid 功能特性。如果浏览器和测试用例运行在相同的机器上并且测试用例完全基于 WebDriver API 编写,可以直接使用 WebDriver 驱动浏览器,而不必使用 Selenium Server。在特定情况下,比如计划使用 Selenium Grid 创建分布式自动化测试环境、或需要连接到安装特别版本浏览器的远程机器上执行测试用例脚本,必须使用 Selenium Server。下面分别简单介绍一下各个组件:
Selenium 2 ( 又名 Selenium WebDriver):Selenium 2.0 的主要新特性就是集成了 Selenium WebDriver API。WebDriver 被设计用于提供简化精炼的编程接口,并解决了在 Selenium RC 中的一些限制。WebDriver 可以更好的支持使用 AJAX 技术的动态网页。总的来说,WebDriver 提供设计良好的面向对象的接口和改进的对动态网页支持,是 Selenium 的未来发展方向。
Selenium 1(Selenium Remote Control):曾是 Selenium 的主要组成部分,现已经正式被 Selenium 官方弃用。替代者为 Selenium 2(Selenium WebDriver)。更多详细内容,请参考 Selenium 项目简史。
Selenium IDE:Selenium-IDE 是快速开发 Selenium 测试用例的 Firefox 插件工具。可以利用它录制用户的基本操作,生成测试用例脚本,还可以将这些测试用例转化为其他编程语言的自动化测试脚本。通过点击回放按钮,可以回放录制的测试用例脚本。该工具还包含一个上下文菜单,测试工程师可以使用它从浏览器的当前显示页面选择页面元素,然后可以选择适配已选取元素的带预定义参数的 Selenium 命令来快速完成脚本编写。这一特性为自动化测试人员节省了花费在脚本编写上的时间、也提供了学习 Selenium 命令的快捷方法。
Selenium Grid:Selenium Grid 用于在不同的机器系统上、不同的浏览器上并行运行自动化测试。利用 Selenium Grid,可以轻松创建分布式自动化测试环境
下面,我们将会使用 JUnit4 和 Selenium Server 演示如何对前文提到的测试用例编写自动化测试脚本。准备项目依赖的 Jar 文件,如 Selenium、dom4j 等 Jar 包,启动 Eclipse 集成开发环境,创建项目名称为 SeleniumDemo 的 Java 项目,并创建一个 JUnit 4 单元测试类:dw.junit. DWloginJUnit.java,依次编写 @BeforeClass、@Test 、@AfterClass 方法。本文提供源代码下载,您可自行下载,导入到自己的 Eclipse 开发工作区。首先,创建 Selenium 实例,启动浏览器,使浏览器窗口最大化,打开要访问的谷歌网站。代码如下:

清单 1. 创建初始化 Selenium 实例
                               
private static Selenium selenium;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
    selenium = new DefaultSelenium("localhost", 4444, "*iexplore",
               "http://www.google.com/");
    System.out.println("正在启动 Selenium。。。");
    selenium.start();
    selenium.windowMaximize();
    selenium.open("/");
}

然后在测试方法中实现演示用例,即在谷歌站点搜索输入框输入“ibm developerworks cn”,然后点击搜索按钮,最后截图。Pause 和 captureScreenshot()方法在本文附带的源代码文件中可查。执行用例部分的代码清单如下:

清单 2. 执行用例的程序代码
                               
@Test
public void test() {
// 在 Google 查询输入框,输入 ibm developerworks cn
String queryString="ibm developerworks cn";
selenium.type("//input[@name='q']", queryString);
                 pause(1000);
// 单击查询按钮,执行查询
selenium.click("//input[@name='btnK']");
                 pause(1000);
System.out.println("获取的页面标题:"+selenium.getTitle());
                 pause(2000);
SeleneseTestBase.assertTrue(selenium.getTitle().contains(
queryString));
// 测试截图函数
captureScreenshot("截图测试 JUnit");
         }

使用道具 举报

回复
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
13#
 楼主| 发表于 2013-5-20 20:29 | 只看该作者
自动化测试框架开发人员如何做
我们上文实现了演示用例的自动化回归测试,很多公司的测试工程师也是用这样的方法执行自动化测试的,但这不是最好的方法。理由如下:
如果用例发生变更,比如界面的美化重构导致页面的某一控件元素信息变化,就不得不修改 Java 脚本代码,重新编译打包。
擅长业务的测试人员很大一部分还是不熟悉 Java 编程的,他们期望有一种不需要编程的测试框架,这样他们就可以根据对业务的把握,快速编写自动化测试用例脚本。
目前市场上还没有自动化测试工具可以直接识别传统的测试用例,继而直接执行自动化测试。也就是说,现在还没有工具可以读取像“用户名输入框”这样的纯文字性描述内容,然后映射到页面上的输入框控件。那么,如何添加一些额外的信息到传统的用例里面,从而使自动化工具能执行业务测试人员写的这些用例呢?
先分析一下 Web 应用的测试用例及其测试步骤,显而易见,都包含下述几部分:Web 页面控件部分、用户执行动作部分、测试数据部分等。比如,演示用例中提到的用户输入框、密码输入框和登录按钮属于 Web 页面控件,动词输入、点击等属于用户执行动作,用户名和密码数据属于测试数据。我们需要把这几部分都添加额外信息、转化为测试工具能识别的形式。测试工具都提供定位 Web 页面控件的方式,以 Selenium 为例,它可以通过 CSS、JS 和 XPath 定位控件,方式非常丰富。用户执行动作对应着测试工具的应用编程接口 API,测试工具都提供类似单击 Click、双击 DoubleClick、拖拽 DragAndDown、输入数据 Type 等动作的 API。页面控件信息和测试数据对应着 API 的参数列表。比如,selenium.type(“//input[@id= ’ username ’ ]”,”我的用户名”)。
下面怎么做呢?传统的测试用例文档存储方式在不同的公司里差异很大,有的是 Word 文档,有的是 Excel 文档,也有维护在配置管理站点的,比如 IBM 的 Rational ClearQuest、开源的 TestLink 等等。Word 和 Excel 在维护用例额外的步骤信息方面都不够灵活简便,我们决定使用 XML 文档。下面是使用 XML 维护本文中演示用例。

使用道具 举报

回复
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
14#
 楼主| 发表于 2013-5-20 20:30 | 只看该作者
我们创建另一个 JUnit 4 单元测试类:dw.xml.DWloginXML.java,依次编写 @BeforeClass、@Test、@AfterClass 方法。读者可自行下载本文附带的源代码项目导入到自己的 Eclipse 开发工作区。下面对代码进行讲解:
解析测试用例 XML,读取执行设置信息
使用 Dom4J 来解析 XML 用例脚本文件,ucXMLFile 变量存放测试用例文件路径。首先解析 SETTINGS 元素,读取其中的属性设置。可以看出,使用 XML 维护测试用例,能轻松维护 Selenium Server 的相关信息。如果想换其他浏览器执行这个用例,只需修改 XML 文件中 SETTINGS 元素的 browser 属性,比如把“*iexplore”改为“*firefox”,运行的时候就会启动 firefox 浏览器来执行该用例,而不需要改动任何 Java 程序代码。同样,如果喜欢使用谷歌 Chrome 浏览器,则需要设置为“*googlechrome”。当然,需要预先在启动 Selenium Server 的机器上安装相应的浏览器软件。


清单 5. 使用 DOM4J 解析 XML 脚本文件
                               
Document document = null;
try {
System.out.println("测试用例 XML 文件位置 ::" + ucXMLFile);
document = new SAXReader().read(new File(ucXMLFile));
} catch (DocumentException e) {
   e.printStackTrace();
                 }
Element suiteElm = document.getRootElement();
// settings element
Element settings = suiteElm.element("SETTINGS");
if (settings != null) {
    browser = settings.attributeValue("browser");
    seleniumServer = settings.attributeValue("seleniumServer");
    seleniumPort = settings.attributeValue("seleniumPort");
    application_url = settings.attributeValue("application_url");
    }

读取 STEP 测试步骤信息
获取用例级别的延时设置,在每一个测试步骤执行之前,暂停 timeout 指定的秒数。通过指定延时,可以让程序执行的慢一些,符合用户真实操作,也方便演示。获取的测试步骤信息保存在列表实例 List<Element> stepNodes。


清单 6. 获取测试步骤信息
                               
// TEST element
Element testElm = suiteElm.element("TEST");
System.out.println("测试用例名称为 ::" + testElm.attributeValue("name"));
if (testElm.attributeValue("timeout") != null) {
// 用例级别的 timeout 设置 , 覆盖了默认设置!
timeout = new Integer(testElm.attributeValue("timeout")).intValue();
System.out.println("延时设置,timeout=" + testElm.attributeValue("timeout")+"秒");
         }
stepNodes = testElm.element("STEPS").elements();
}

创建 Selenium 实例,启动浏览器,最大化浏览器窗口,打开要访问的网站

清单 7. 创建初始化 Selenium 实例
                               
selenium = new DefaultSelenium(seleniumServer,
new Integer(seleniumPort).intValue(), browser, application_url);
System.out.println("正在启动 Selenium。。。");
selenium.start();
selenium.windowMaximize();
selenium.open(application_url);

迭代解析 STEP 元素执行各个测试步骤
创建一个迭代器实例 iterator,使用 while 循环,依次执行各个测试步骤。在执行的时候,打印详细的步骤信息,方便调试。根据 type 属性指定的步骤类型,分别调用不同的 Selenium 接口。作为演示,本文提供的代码例子,仅仅包括鼠标单击、输入框输入和截图功能。通过丰富处理 SETP 步骤元素的代码,可以支持更多的功能。


清单 8. 迭代依次解析测试步骤
                               
Element elm = null;
// 循环解析测试步骤
Iterator<Element> iterator = null;
iterator = stepNodes.iterator();
while (iterator != null && iterator.hasNext()) {// while 循环开始
elm = iterator.next();
System.out.println("------------------------------>");
System.out.println("step index=" + elm.attributeValue("index"));
System.out.println("step name=" + elm.attributeValue("name"));
System.out.println("step type=" + elm.attributeValue("type"));
String type = elm.attributeValue("type");
if (type == null) {
SeleneseTestBase.fail("必须定义 type 属性,请检查 XML 测试用例。");
                         }
if (type.equals("Type.CLICK")) {
// 处理 Click 单击操作
pause(timeout*1000);
try {
String xpValue = elm.element("XPATH").getText();
selenium.click(xpValue);

} catch (Exception e) {
SeleneseTestBase.fail(e.getMessage()+ "\n 步骤执行失败,测试执行被中止 , \
       测试元素为 :\n" + elm.asXML());
                                 }
} else if (type.equals("Type.INPUT")) {
// 处理 Input 在输入框执行输入操作
pause(timeout*1000);
try {
    String inValue = elm.element("VALUE").getText();selenium.type(\
       elm.element("XPATH").getText(), inValue);
} catch (Exception e) {
SeleneseTestBase.fail(e.getMessage()
+ "\n 步骤执行失败,测试执行被中止 , 测试元素为 :\n" + elm.asXML());
                                 }
                         }
else if(type.equals("Type.CaptureScreenshot")){
pause(timeout*1000);
String fileName = elm.element("VALUE").getText();
                                 captureScreenshot(fileName);
                         }
}// 循环解析测试步骤;while 循环结束

完整的框架项目代码请参考附件进行下载。对这个单元测试类的运行和前文描述的是一致的,不再赘述。当然,现在的框架支持的功能是非常简单的 ( 仅仅支持单击、表单输入和截图功能 ),框架开发人员可以添加更多的功能特性,然后就可以把该自动化测试框架交付给业务测试人员,他们就再不会为编写测试代码发愁了。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表