每日e测创刊号 - 软件测试/自动化测试杂志

31

Upload: 5etest

Post on 12-Nov-2014

257 views

Category:

Documents


0 download

DESCRIPTION

敬请登陆 E测中国站点 www.5etesting.com 获取更多自动化测试资讯

TRANSCRIPT

www.5etesting.com

《每日E测》 目录

刊首语.........................................................2

实例讲解手工编写FTP脚本.......................3创刊号:2009 年 8 月

Shared store的介绍.................................7

SystemUtil常见对象介绍........................9

QTP中Excel的比较..................................19

QTP中日志函数.........................................22

小谈冒烟测试...........................................23

浅谈自动化测试.......................................25

QC的安装注意事项之Weblogic..............29

《每日 E 测》第一期 我们的 E 测 1

主办单位:E测中国

出版单位:《每日E测》编辑部

主编: 朱伟

副主编: 裴明哲,韩柳,俞戴龙

美工 :陈宇辉

征稿启事...................................................30

本期责任

编辑:朱伟

www.5etesting.com主页:

[email protected] 投稿:

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 2

刊首语

——为 爱 工 作

工作是一门技术,亦是一种艺术。热爱你的工作,为爱而工作,那么你会很快乐!

E 测工作室秉承对软件测试事业的钟爱,筹备良久,满溢着对梦想的感动,打造了 5E

软件自动化测试专业论坛。在这个平台上倾情负载着每位精英工作的实践精华。

正是这些枝枝干干、点点滴滴,成就了我们创办这本杂志的信心。点燃了我们对打造这

个交流舞台的激情。

当我们真正做到为爱工作,我们的心中就有了潮涌的激情,就有了坚如磐石的信念,就

有了对工作的极度狂热,就有了“衣带渐宽终不悔,为伊消得人憔悴”的追求和执着。

《每日 E 测》杂志,在 E 测专家对工作的爱与激情中,诞生了第一期。

它就似一架搭载着梦想的飞船,已经起航。由衷的邀请同一片星光下为爱工作的读者与

我们同乘。一同勤奋奉献,互相激励,集思广益,懂得感恩,相濡以沫,共同发展。

为爱工作是衡量一个人是否善待生命的筹码,是检索个人价值存在的意义,是每一个优

秀员工所需要具备的基本素质。工作不仅仅是我们谋生的手段,更是实现人生随着时间的流

逝而不断增值的方式,成功和快乐不过是我们实现人生价值过程中所附加的利息。因为为爱

工作本身就是对生命最好的诠释。

E 测中国

2009 年 08 月

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 3

实例讲解手工编写 FTP 脚本

作者:于涌

手工编写脚本需要您必须清楚被测试系统应用的协议,清楚被测试的内容(需求内容,

在这里我们主要要测试多用户的并发上传操作)。手工编写是一个循序渐进的过程,不要试

图一次就将代码编写的很完美。您最好先画一张流程图,而后按照流程图一步一步的编写相

应代码,先不要在脚本中添加事务、集合点以及参数化操作,以免扰乱了您的思路,仅进行

基本逻辑的实现就可以了。大家都清楚,要上传一个文件到 FTP 服务器,您必须先以具有写

权限的用户身份登录到 FTP 服务器(建立一个 FTP 连接),这里以用户名为“yuy”,密码为

“test”的用户登录到 IP 地址为“210.108.0.12”FTP 服务器。然后,进行上传文件操作,

这里我们将 C 盘的“人事代理系统测试总结报告.doc”文件上传到文件服务器的根目录。

最后,关闭建立的 FTP 连接。大家看仅 4 句话一个上传文件到 FTP 服务器的脚本就实现了,

代码很精简。代码编写完成以后,应该调试一下看看是否按照作者的设计初衷实现了文件上

传的操作,执行一下脚本发现在 FTP 服务器的根目录上传了文件“人事代理系统测试总结报

告.doc”文件,这说明脚本正确。接下来,就可以根据测试需求,在上传文件操作处加入

事务以及集合点,同时为了考查传输不同大小文件时,FTP 服务器组件的处理能力,需要对

要上传的文件进行参数化。

相应脚本代码:

Action() { //建立一个有效的 FTP 连接,yuy 为用户名,test 为密码 //210.108.0.12 为 FTP 服务器地址 ftp1 = 0; ftp_logon_ex(&ftp1, "FtpLogon", "URL=ftp://yuy:[email protected]", LAST); //上传文件到 FTP 服务器的根目录 ftp_put_ex(&ftp1, "FtpPut", "SOURCE_PATH=c:\\人事代理系统测试总结报告.doc", "TARGET_PATH=", "人事代理系统测试总结报告.doc", ENDITEM, LAST); //释放 FTP 连接

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 4

ftp_logout_ex(&ftp1); return 0; }

改良后的脚本:

Action() { //建立一个有效的 FTP 连接,yuy 为用户名,test 为密码 //210.108.0.12 为 FTP 服务器地址 ftp1 = 0; ftp_logon_ex(&ftp1, "FtpLogon", "URL=ftp://yuy:[email protected]", LAST); //加入集合点和事务 lr_rendezvous("大家一起来"); lr_start_transaction("文件上传事务"); //上传文件到 FTP 服务器的根目录,同时将要上传的文件参数化 ftp_put_ex(&ftp1, "FtpPut", "SOURCE_PATH={filename}", "TARGET_PATH=","{Ftpfilename}", ENDITEM, LAST); lr_end_transaction("文件上传事务", LR_AUTO); //释放 FTP 连接 ftp_logout_ex(&ftp1); return 0; }

为了保证不同虚拟用户上传的文件大小、文件名称不同,在改良后的脚本中进行了参数

化工作。同时为了考查多用户同时上传文件时 FTP 服务器组件的处理能力,在文件上传部分

加入了集合点和事务。脚本改良工作完成以后,执行一次,证实是按照我们的意图运行的,

这样就完成了脚本的编写工作。接下来,就需要设计场景,打开 Controller,设置 100 个

用户,运行持续时间为 8 小时,在“2007-3-14”晚上 20:00 运行。场景这样设置的原因主

要是因为白天开发人员和部分用户会上传文件到 FTP 服务器,考虑到存在互相干扰的问题,

所以测试工作通过 LoadRunner Controller 定时运行脚本功能,在下班以后进行,第二天

测试人员直接看运行结果就可以了,很方便。为了考查服务器组件的稳定性,我们设置了

www.5etesting.com 100 个用户,同时上传文件到 FTP 服务器,持续运行 8 小时(请参见图 3 和图 4)。这种场

景设计符合用户要求 FTP 服务器端组件支持多用户并发、可靠性高等方面的需求。

图 3:场景设计对话框

图 4:持续运行设置和运行设置

脚本编写注意事项

1. 并不是所有的协议都适合手工编写脚本,如:Web(HTTP/HTML)、Windows Sockets、

Media Player (MMS)等协议,最好还是先录制,而后在自动生成的脚本基础上对脚本

进行修改更方便。

2. 上述功能如果您通过录制 CuteFTP 等应用软件来实现同样的功能,脚本就会出现很多

类似 ftp_dir_ex(&ftp1, "FtpDir", "PATH=", ENDITEM, LAST);等多余的函数,您需

要手动将这些多余的函数删除。

3. 脚本参数化以后,您必须设置相应的取值策略(如果您不是很清楚参数化相关部分内容,

请参见第二章的第三节),否则在默认情况下上传到服务器均会取首条记录的文件名;

还有一个问题就是因为场景持续运行 8 小时,需要上传大量的文件,所以要保证您的

《每日 E 测》第一期 我们的 E 测 5

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 6

参数列表有足够多的记录,同时还要保证 FTP 服务器的硬盘足够大,否则会导致测试失

败。

4. 象 File Transfer Protocol(FTP)、Post Office Protocol(POP3)、Simple Mail Protocol

(SMTP) 、VB Vuser 、Java Vuser、 Javascript Vuser 、VB Script Vuser 以及数

据库方面的协议在了解业务和相应协议、函数的情况下,您可以通过手工编写脚本的方

式建立脚本。因为在脚本中减少了很多不必要的操作过程,所以相信您会取得事半功倍

的效果。手工编写脚本和自动产生脚本以后对脚本进行修改各有各得优点,读者应该根

据自己的实际情况适当选择编写方式,适合自己才是最重要的。

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 7

Shared store 的介绍

原著:Tarun Lalwani 翻译:fei.ge

你曾经遇到下面的问题么? 1、 进程间的通信? 2、 Action 之间的信息传递? 3、 在 BPT 框架中,模块间的信息传递? 4、 机器间的信息传递? 5、 当你的进程没有结束时,如何把信息保存在内存中? 6、 如果以上的问题你还不能回答,那么现在有答案给你。 知识收件匣感到自豪的是,目前一个最新的解决方案来克服上述问题—知识收件匣的共享仓

库 什么是知识收件匣的共享仓库? 知识收件匣的共享仓库是一个基于 Activex 的 COM 组件,允许你创建逻辑的仓库,存储

对象和值。这种信息在没有被覆盖之前一直保存在系统中。简单的 QTP 代码如下: 'Create the shared store Set oSharedStore = CreateObject ("KnowledgeInbox.SharedStore") 'Add a new store Set oStore = oSharedStore.AddStore("GeneralTest") 'Create a dictionary object in shared store Set oDict = oSharedStore.CreateObject("Scripting.Dictionary") 'Add the dictionary object to the store oStore.AddItem "TestDictionary" , oDict 'Update some values in dictionary oDict("CA") = "California" 'Destroy the object Set oDict = Nothing 'Instruct shared to store to remain in memory oSharedStore.PersistInMemory = True 'Destroy the shared store

www.5etesting.com Set oSharedStore = Nothing 关闭 QTP 并打开一个 VBScript 的记事本 'Create the shared object store Set oSharedStore = CreateObject ("KnowledgeInbox.SharedStore") 'Get the specified store Set oStore = oSharedStore.GetStore("GeneralTest") 'Get the specified object from the store Set oDict = oStore.GetItem ("TestDictionary") 'Will display california MsgBox oDict("CA") 'Now instruct shared store to unload when destroyed oSharedStore.PersistInMemory = False 'Destroy the shared store Set oSharedStore = Nothing

备注:运行上面程序需要先安装 ObjectStore.msi 下载地点: http://www.5etesting.com/viewthread.php?tid=556

《每日 E 测》第一期 我们的 E 测 8

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 9

SystemUtil 常见对象介绍

作者:风过无息

前言:

对于 SystemUtil 这个对象,不少 QTP 使用者并不陌生,但是通常我们在使用该对象的 run的方法来实现打开一个已知程序,但是它还有一些其它鲜为人知的对象属性,本文将介绍常

见的 SystemUtil 的对象,并加上相应的实例帮助读者来学习这个方法。

SystemUtil 对象

描述 在脚本运行的时候,这个对象可以用来控制应用程序或进程。

p 操作

下面这个表格式 SystemUtil 这个对象内置的所有方法和属性.

e 方法

BlockInput禁止键盘或鼠标操作。

CloseDescendentProcesses关闭由 QuickTest 打开的所有进程。

CloseProcessByHwnd关闭具有指定句柄的窗体的进程.

CloseProcessById根据流程号关闭相应的进程。

CloseProcessByName根据名称关闭指定的进程。

CloseProcessByWndTitle根据标题,关闭指定窗口标题的进程。

Run运行文件或应用程序。

UnblockInput恢复对键盘或鼠标的可用,结合 BlockInput 方法。

BlockInput 方法

描述

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 10

禁止键盘或鼠标操作。

语法

object.BlockInput

参数 对象

Object SystemUtil 类型的测试对象。

返回值

备注 这个方法通常是用来防止 QTP 在运行脚本的时候一些意外的鼠标键盘的操作的干扰,导致脚本运

行失败。

使用 BlockInput 方法后,使用以下方法可以解除对键盘或鼠标的禁止:

• 通常我们使用了 UnblockInput 语句。

• 当脚本运行结束或中断(如整个 test 结束、运行错误、断点等等)。

• 在键盘上按下 Ctrl+Alt+Delete 结合键。

• 当出现了严重的系统错误时。

举例 下面的例子使用 BlockInput 方法,在 QTP 脚本运行过程中禁用了键盘及鼠标。

Sub BlockInput_Example_login() SystemUtil.BlockInput Browser("Welcome: Mercury Tours").Page("Welcome: Mercury Tours").WebEdit("userName").Set "mercury" Browser("Welcome: Mercury Tours").Page("Welcome: Mercury Tours").WebEdit("password").SetSecure "4082986e39ea469e70dbf8c5a29429fe138c6efc" Browser("Welcome: Mercury Tours").Page("Welcome: Mercury Tours").Image("Sign-In").Click 2, 2 SystemUtil.UnblockInput End Sub

UnblockInput 方法 描述 在 BlockInput 语句禁止键盘或鼠标之后,使用 UnblockInput 语句可解除对键盘或鼠标的禁

止。

语法

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 11

object.UnblockInput

参数 描述

object SystemUtil 类型的测试对象。

返回值 无

Remarks 如果先前使用了 BlockInput 方法禁止了键盘及鼠标,使用 UnblockInput 方法可解除禁止。

举例

此处省略,请参考 BlockInput 处的例子.

CloseDescendentProcesses 方法 描述 关闭由 QuickTest 打开的所有进程。

语法

object.CloseDescendentProcesses

参数 描述

object SystemUtil 类型的测试对象。

返回值 返回一个长整型值。被 CloseDescendentProcesses 方法语句关闭的应用程序实例数。

备注 注意:执行该语句时,首先 QuickTest 会向进程窗口发送一个 WM_CLOSE 信息,尝试关闭该

进程;如果该进程在 5 秒钟后仍然没有关闭,则 QuickTest 强制结束进程。

举例 在本例中我们需要先手工打开一个 IE,访问页面

(http://newtours.demoaut.com/mercurywelcome.php),然后使用 SystemUtil.Run

打开 2 个 IE,一个访问(http://newtours.demoaut.com/mercuryregister.php),另外

一个访问(http://newtours.demoaut.com/mercuryunderconst.php)那么

CloseDscendentProcessed 就会关闭 2 个 IE,那返回值是 2,因此 Message 显示的应该就

是“2”,并检查剩下未关闭的页面时:

http://newtours.demoaut.com/mercurywelcome.php

Sub CloseDescendentProcesses_Example_Close() SystemUtil.Run "iexplore.exe","http://newtours.demoaut.com/mercuryregister.php"

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 12

SystemUtil.Run "iexplore.exe","http://newtours.demoaut.com/mercuryunderconst.php" MsgBox SystemUtil.CloseDescendentProcesses End Sub CloseDescendentProcesses_Example_Close()

CloseProcessByHwnd 方法 描述 根据窗口的句柄找到相应的进程,并关闭该进程。

语法

object.CloseProcessByHwnd (hWnd)

参数 描述

object SystemUtil 类型的测试对象。

hWnd 必须输入的参数。

他是一个 ULong 对象。

你想要关闭的进程的窗口的句柄。

在 QTP 的对象中有 hwnd 这个属性,你可以通过 GetRoProperty 来得

到这个。例如:

Window(“MyAppName”).GetRoProperty(“hwnd”)

HWND- HANDLE(句柄)WND - WINDOW(窗口)HWND 表示窗口句柄

返回值 一个 Boolean 值。

· True――指定的进程已被成功关闭。

· False――指定的进程未被关闭。

备注 注意:执行该语句时,QuickTest 首先向进程窗口发送一个 WM_CLOSE 信息,尝试关闭该进

程;如果该进程在 5 秒钟后仍然没有关闭,则 QuickTest 强制结束进程。

举例 在本例中,首先通过 GetroProperty 方法获取窗口的句柄,然后使用 CloseProcessByHwnd

方法关闭程序。

Sub CloseProcessByHwnd_Example() hWnd = Browser("Welcome: Mercury Tours").GetROProperty("hwnd")

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 13

SystemUtil.CloseProcessByHwnd (hWnd) End Sub

这边需要注意的 hwnd 的属性是否是不为空。

CloseProcessById 方法 描述

根据进程的 Process ID(PID)关闭进程。 语法

object.CloseProcessById (wdProcessId)

参数 描述

Object SystemUtil 类型的测试对象。

wdProcessId 必须。一个 ULong 对象。

你想关闭的进程的 PID。

在 Windows 的任务窗口的进程标签页可以查看到程序的 PID 值,你也

可以通过获取Runtime窗口对象的Process id属性值来获得PID信息。

例如:

Window(“MyAppName”).GetRoProperty(“process id”)

返回值

Boolean 值。

· True――指定的进程已被正常关闭。

· False――指定的进程未被关闭。

备注 注意:执行该语句时,QuickTest 首先向进程窗口发送一个 WM_CLOSE 信息,尝试关闭该进

程;如果该进程在 5 秒钟后存未关闭,则 QuickTest 强制结束进程。

举例 下面的例子通过 GetRoProperty 方法获取 Notepad 窗口的 PID 值,然后使用

CloseProcessById 方法关闭 Notepad 程序。

Sub CloseProcessById_Example() PID = Window("Notepad").GetROProperty("process id") SystemUtil.CloseProcessById (PID) End Sub

知识小题库: Process Identifier(进程控制符)简称 PID,PID 后面的数字就是各进程的身份标识编号,程序一运行系统就会自动分配给进程一个独一无二的 PID。 进程中止后 PID 被系统回收,可能会被继续分配给新运行的程序。

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 14

CloseProcessByName 方法 描述

根据名字来关闭进程。 语法

object.CloseProcessByName (bsProcessName)

参数 描述

object SystemUtil 类型的测试对象。

bsProcessName 必须。一个字符串值。

你想关闭的进程的名称。

返回值 一个 Long 值。所关闭的程序的实例数。

备注 注意:执行该语句时,QuickTest 首先向进程窗口发送一个 WM_CLOSE 信息,尝试关闭该进

程;如果该进程在 5 秒钟后存未关闭,则 QuickTest 强制结束进程。

举例 在本例中我们需要先手工打开一个 IE,访问页面

(http://newtours.demoaut.com/mercurywelcome.php),然后使用 SystemUtil.Run

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 15

打开 2 个 IE,一个访问(http://newtours.demoaut.com/mercuryregister.php),另外

一个访问(http://newtours.demoaut.com/mercuryunderconst.php)那么

CloseProcessByName就会关闭所有的 IE,那返回值是3,因此Message显示的应该就是“3”,

并检查所有 IE 都被关闭

Sub CloseProcessByName_Example() SystemUtil.Run "iexplore.exe","http://newtours.demoaut.com/mercuryregister.php" SystemUtil.Run "iexplore.exe","http://newtours.demoaut.com/mercuryunderconst.php" wait 10 Msgbox SystemUtil.CloseProcessByName("iexplore.exe") End Sub CloseProcessByName_Example()

CloseProcessByWndTitle 方法 描述 关闭指定窗口标题的所有进程。

语法

object.CloseProcessByWndTitle (bsTitle, [bRegExp])

参数 描述

object SystemUtil 类型的测试对象。

bsTitle 必须。一个字符串值。

你想关闭的进程的窗口的标题。

bRegExp 可选。一个 Boolean 值。

是否在执行的是用正则表达式。默认值为 False。

返回值 一个 Long 值。被语句所关闭的程序的实例数。

备注 注意:执行该语句时,QuickTest 首先向进程窗口发送一个 WM_CLOSE 信息,尝试关闭该进

程;如果该进程在 5 秒钟后存未关闭,则 QuickTest 强制结束进程。

举例 本例关闭了所有的标题包含有“Mercury”字样的顶层窗口。因为 bRegExp 参数值为

“ture”,表示只要标题里包含“Mercury”都会被关闭。下面的例子我们会打开 2 个包含

“mercury”字样的页面会被关闭,而不包含这样的字符的页面会被保留。因此我们的返回值是

2。

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 16

Sub CloseProcessByWndTitle_Example() SystemUtil.Run "iexplore.exe","http://newtours.demoaut.com/mercuryregister.php" SystemUtil.Run "iexplore.exe","http://newtours.demoaut.com/mercuryunderconst.php" SystemUtil.Run "iexplore.exe",http://www.5etesting.com wait 10 Msgbox SystemUtil.CloseProcessByWndTitle (".*mercury.*",true) End Sub CloseProcessByWndTitle_Example()

大家可以看到,这里是不区分大小写。

Run 方法 描述 运行一个文件或应用程序。

语法

object.Run file, [params], [dir], [op], [mode]

参数 描述

object SystemUtil 类型的测试对象。

file 必须。一个字符串值。

你想要运行的文件的名称。

params 可选。一个字符串值。

如果 file 参数中指定的是一个可执行文件,则可以使用 params 参数来指定该可执行

文件的运行参数。

dir 可选。一个字符串值。

应用程序或文件的默认目录。

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 17

op 可选。一个字符串值。将要被执行的动作。如果该参数值为空(“”),则默认操作为

open 操作。

下面是 op 参数中可以指定的操作:

操作 描述

open 打开 file 参数中所指定的文件。文件有可能是一个可执行文件、一个文档

文件、或一个文件夹。非可执行文件会被相应的应用程序打开。

edit 将文件在文件编辑器中打开以进行编辑。如果 file 参数中指定的文件不可

编辑,则本语句失败。

explore 打开由 file 参数中所指定的文件夹。

find 在 file 参数所指定的文件夹中进行搜索。

print 打印在 file 参数中所指定的文档。如果参数中所指定的文档不可打印,则

语句失败。

mode 可选。一个 Integer 值。

指定应用程序打开时的显示模式。可以指定以下几种打开模式。默认模式是 1。

Mode Description

0 Hides the window and activates another window.

1

Activates and displays the window. If the window is

minimized or maximized, the system restores it to its

original size and position. Specify this flag when

displaying the window for the first time.

2 Activates the window and displays it as a minimized window.

3 Activates the window and displays it as a maximized window.

4 Displays the window in its most recent size and position.

The active window remains active.

5 Activates the window and displays it in its current size

and position.

6 Minimizes the specified window and activates the next

top-level window in the Z order.

7 Displays the window as a minimized window. The active

window remains active.

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 18

8 Displays the window in its current state. The active window

remains active.

9

Activates and displays the window. If the window is

minimized or maximized, the system restores it to its

original size and position. Specify this flag when

restoring a minimized window.

10 Sets the show-state based on the state of the program that

started the application.

返回值 无

备注 当指定的是一个非可执行文件时,文件被相应的应用程序打开。

注意:在录制脚本的过程中,如果你从系统的“开始”菜单或“运行”对话框中运行应用程序时,

SystemUtil.Run 语句会自动添加到脚本中。

举例 本例使用Run方法打开了一个名为 type.txt的文件(txt类型文件的默认打开程序是Notpad),

然后向文件中输入“happy days”文字,然后使用快捷键保存该文件,然后关闭 NotePad 应

用程序。

Sub SystemUtil _Example() SystemUtil.Run "C:\type.txt", "", "", "" Window("Text:=type.txt - Notepad").Type "5etesting" Window("Text:=type.txt - Notepad").Type micAltDwn & "F" & micAltUp Window("Text:=type.txt - Notepad").Type micLShiftDwn & "S" & micLShiftUp Window("Text:=type.txt - Notepad").Close End Sub

小结:通过对 SystemUtil 的对象学习,有利我们使用除了 run 对象以外其它对象,特别是

我们在做一些场景恢复的时候,需要关闭一些 IE,保证每次运行的环境的唯一性的时候,有

很大帮助。

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 19

QTP 中 Excel 的比较

- QTP 对 Excel 操作 作者:Wally (俞戴龙)

最近在 SQAForum 经常有人提出关于比较两个 Excel 的值的问题的帖子 例如: http://www.sqaforums.com/showflat.php?Cat=0&Number=549014&an=0&page=0#Post549014 http://www.sqaforums.com/showflat.php?Cat=0&Number=567634&an=0&page=0#Post567634

国人肯定在此问题上也会有一定的困惑,我把自己写的一些函数发出来,给大家予以一

定的启发和思路 两个 Excel 比较的函数:

'************************************************* '** Functionality: compare two excels '** input parameter: '** excelFullPath1 - the first excel sheet '** excelFullPath2 - the second excel sheet '** output: if excel sheet are equal, return "equal", else return difference '** Author: Wally Yu in Shanghai, [email protected] '** Date:1st May 2009 '************************************************* Function CompareExcelSheet(excelFullPath1, excelFullPath2,sheetName) Dim rows1, rows2, columns1, columns2, ret, i, j, tempDoc1, tempDoc2, diffFlag diffFlag = False Dim srcData1,srcDoc1 set srcData1 = CreateObject("Excel.Application") srcData1.Visible = False set srcDoc1 = srcData1.Workbooks.Open(excelFullPath1) srcDoc1.Worksheets(sheetname).Activate rows1 = srcDoc1.Worksheets(sheetname).UsedRange.rows.Count columns1 = srcDoc1.Worksheets(sheetname).UsedRange.columns.Count Dim srcData2,srcDoc2 set srcData2 = CreateObject("Excel.Application") srcData2.Visible = False set srcDoc2 = srcData2.Workbooks.Open(excelFullPath2) srcDoc2.Worksheets(sheetname).Activate For i = 1 To rows1

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 20

rows2 = srcDoc1.Worksheets(sheetname).UsedRange.rows.Count columns2 = srcDoc1.Worksheets(sheetname).UsedRange.columns.Count If (rows1 <> rows2) Or (columns1 <> columns2) Then ret = "Excel sheet " & sheetName & "used ranges are not equal" diffFlag = True Else For j = 1 To columns1 tempDoc1 = srcDoc1.Worksheets(sheetname).Cells(i,j).value tempDoc2 = srcDoc2.Worksheets(sheetname).Cells(i,j).value If tempDoc1 <> tempDoc2 Then diffFlag = True ret = ret & "cell(" & i & "," & j & ") values are differert: value1 = " & tempDoc1 & ", value2 = " & tempDoc2 & vbCrLf End If Next Next ret = "Excel sheet " & sheetName & "cells are different:" & vbCrLf & ret End If If diffFlag = False Then ret = "equal" End If 'srcDoc1.Close 'scrDoc2.Close CompareExcelSheet = ret srcData1.Workbooks.Close srcData2.Workbooks.Close srcData1.Quit srcData2.Quit ' QTP_Read_Excel = ret End Function 读取 Excel 单元格的函数: Public Function readExcelCell(pathway,sheetname,x,y) On Error Resume Next Set fso=CreateObject("scripting.FileSystemObject") If fso.FileExists(pathway) Then Dim srcData,srcDoc,ret set srcData = CreateObject("Excel.Application") srcData.Visible = False set srcDoc = srcData.Workbooks.Open(pathway) srcDoc.Worksheets(sheetname).Activate ret = srcDoc.Worksheets(sheetname).Cells(x,y).value srcData.Workbooks.Close srcData.Quit

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 21

Else ret = "file not found" End If Set fso = Nothing Set srcData = Nothing If Err Then readExcelCell = Err.Description Else readExcelCell = ret End If End Function 写入 Excel 单元格函数 Public Function writeExcelCell(content, pathway,sheetname,x,y) On Error Resume Next Set fso=CreateObject("scripting.FileSystemObject") If fso.FileExists(pathway) Then Dim srcData,srcDoc,ret set srcData = CreateObject("Excel.Application") srcData.Visible = False set srcDoc = srcData.Workbooks.Open(pathway) srcDoc.Worksheets(sheetname).Activate srcDoc.Worksheets(sheetname).Cells(x,y).value = content srcDoc.Save srcData.Workbooks.Close srcData.Quit ret = "success" Else ret = "File not found" End If Set fso = Nothing Set srcData = Nothing If Err Then writeExcelCell = Err.Description Else writeExcelCell = ret End If End Function

注: 这三个函数都是对 Excel 的基本操作,我们只是给还没有掌握的测试界的朋友一个基本

思路 其实在真正自动化测试过程中可能需要更多的对于 Excel 的操作,各位朋友都可以参照

这样的思路实现自己的操作,对于更对多的 Excel 操作方法请参见: http://www.5etesting.com/viewthread.php?tid=213

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 22

QTP 中日志函数

作者:peimzh

大家在进行调试脚本或者在整体脚本执行的过程中,难免会出现各种问题,尤其

在脚本整体自动化的过程中,如果没有很好的记录错误日志,那对于你修改脚本

是特别困难的,因此日志是必不可少的一个重要环节,如下我写了一个简单的日

志函数,供大家参考。

'********************************************************** '作者:E 测中国(peimzh) '功能描述:打印日志功能 '输入参数:logMessage:Log 的信息 '输出参数:文本文件 '********************************************************** Public Function LogPrint(ByVal logMessage) Dim fso, logFile Set fso = CreateObject("Scripting.FileSystemObject") Set logFile = fso.OpenTextFile(LogFilePath, 8, True) 'Open a file and write to the end of the file and open as Unicode logFile.WriteLine(date() & " " & hour(now) & ":" & minute(now) & ":" & second(now) & ": " & logMessage) logFile.Close End Function

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 23

小谈冒烟测试

作者:cosed

在一般的项目里,我们往往需要进行多个版本的测试工作,但是在我们按照计划

执行正式的系统集成测试前,我们需要作一些中间测试版,在刚刚编译出来后,软件

编译人员需要进行基本性能确认测试,例如是否可以正确安装/卸载,主要功能是否

实现,是否存在严重死机或数据严重丢失等 Bug。如果通过了该测试,则可以根据正

式测试文档进行正式测试。否则,就需要重新编译版本,再次执行版本可接收确认测

试,直到成功。

这样的测试就叫做冒烟测试,它是一种自由测试。

冒烟测试(smoke testing),据说是微软起的名字。在《微软项目求生法则》一

书第 14 章“构建过程”关于冒烟测试,就是开发人员在个人版本的软件上执行目前的

冒烟测试项目,确定新的程序代码不出故障。

冒烟测试的名称可以理解为该种测试耗时短,仅用一袋烟功夫足够了。它的作用

就是保证系统的主流程和新模块的基本功能能用,保证希望集成测试能正常开展。,

优点是节省测试时间,防止 build 失败。缺点是覆盖率还是比较低。

冒烟测试的对象是每一个新编译的需要正式测试的软件版本,目的是确认软件基

本功能正常,可以进行后续的正式测试工作。冒烟测试的执行者是版本编译人员。

下面我们介绍我们公司的冒烟测试流程。

第一步:确定冒烟测试用例 测试经理会和项目经理等相关人员从测试用例库中选定重要的测试用例,标记为

冒烟测试用例。

第二步:执行冒烟测试 关于执行冒烟测试的人选,通常我们会让测试人员进行。具体流程如下:

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 24

由此可以看到冒烟测试失败的话,会导致测试进度延期,成本和进度风险很大,

因此冒烟测试失败是一个很大的项目失误,所以一般的,在发布前,开发人员会内部

执行一次冒烟测试,来保证提交的版本的质量。

下面介绍一下冒烟测试执行的注意点:

1. 冒烟测试的时间:通常冒烟测试会在正式测试的半天到 1 天时间前提交。测

试人员在 1-2 小时内完成冒烟测试,并给出测试结果。

2. 发布测试版本邮件的内容。通常版本发布者需要发邮件给测试经理并抄送项

目相关人员,内容需要包括: 此次新增的功能模块有哪些? 新增的功能模块由哪位开发人员负责(方便 BUG 的指派) 修复的 BUG 有哪些?

第三步:报告冒烟测试 通常测试组在执行完冒烟测试,会回复本次冒烟测试结果,接受本次版

本或者拒绝本次本版,假如拒绝本次版本,需要附录失败的原因和详细

缺陷的描述。

总结:从八二法则看冒烟测试,往往冒烟测试集合了项目中最重要的功能和模块,

一旦出错,系统就陷于不能使用的境地,其严重性不言而喻,而提高每次测试版

本的质量,也是成本控制的一种方式,将测试前移,从源头做起,节省成本,提

高产品质量的出路,那先从我们的冒烟测试做起吧,个人感想,与同仁共勉。

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 25

浅谈自动化测试

作者:大海仙逝

[说明] 既然是“浅谈”,那当然是浅浅的谈了,再说了,深的我也谈不来^_^

本文为本人个人结合自己在公司中的实践情况谈的一些感想,欢迎讨论,但不想理论。

哎,实在是本人理论功底不好,而且懒于辩论。从初中开始,语文就没很好过- -!

自动化测试从广义上来说包括自动化功能测试、自动化性能测试、自动化安全测试、

自动化单元测试等等。而我们日常常说的自动化测试一般是指自动化功能测试,本文主要也

是从自动化功能测试角度考虑。

[正文]

说起自动化测试的强大,很多人起先的了解来自于测试论坛或者说来自于自动化测试工

具厂商对工具的介绍。咱们先来看一段我因为需要而写的一段有关自动化测试的描述(不代

表本人真实想法,这是因为有需要才为之的):

自动化测试就是通过模拟手动测试步骤,执行用某种程序设计语言编制的测试程序,控

制被测软件的执行,完成全自动或半自动测试的过程。自动化测试解决了功能测试不仅耗时

且高成本的问题。采用自动化测试,企业可以将重点放在改进自动业务过程方面。开发和

QA 组可以增加测试过程的速度和精确度。整个 IT 部门可以获得更高的投资回报,而且降低

了大量风险。

这段话,个人感觉或许对于像微软这些大公司而言是对的,但就目前中国软件企业现状

来说,自动化测试是不是像这段话说的这样真的很难说。单不说我们的定制项目战略与大公

司的通用产品战略的差距,就我们公司的质量意识也能使这段话失效。就说以下这点,进行

了程序修改后,需要对程序进行比较全面的测试这点,我们的很多公司就不做。原因很简单,

上级认为这没有必要、而且是浪费时间,另一点,定制项目的利润可比通用产品少得多得多,

哪有那么多钱让我们认真测试呢。而定制项目好像还是我们的主流。

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 26

对于自动化测试,有这么一句总结的定义“利用程序测试程序”。这句话很简练吧,自

动化测试归根到底也确实是这么个味道。利用工具、利用软件、利用小脚本等等都可以进行

自动化测试。本人一直认为自动化测试是一种技术,是一种能力。既然是一种技术,那就不

应该用太固定的框框把它限死了。应该是做到随需所用、依需而定。既然是一种能力,就应

该用发散的思维去发挥它更多更大的作用。就像阅读这个能力,谁说一定要先划定中心思想,

谁说一定要精读,更没人说一定要用三遍阅读法哦。阅读当然得根据读者的目的以及所读文

章的特点,甚至是读者的水平来确定读此文章的方法。自动化测试也一样,不一定要用在回

归测试上,也不一定要用在集成测试上。有时甚至可以写个小脚本用在解决功能人员测试难

的小问题上。这不也是很好的自动化测试嘛。

关于自动化测试工具,厂商说的可以说基本不可信。说什么“录制/回放”就可以实现,

“简单得很”。要真相信这个,那你自动化测试的失败也会“快得很”。当然,微软所吹嘘

的,要自己编程序来进行自动化测试,而不应该想着使用自动化测试工具来实现自动化测试。

这个观点对于微软来说,应该是正确的。但是得看看微软什么现状:就微软的产品,有哪个

自动化测试工具能支持得了全自动化测试的?再说了,微软的产品是全世界在卖,那质量要

求高,而且利润更高,有的是钱请牛人来编写自动化测试程序。而且微软的人才也是我们这

些公司不可企盼的。因此,如果有好的工具,甚至小工具或开源工具,只要能更好的解决公

司中的问题,那何乐而不为呢?

可以毫不客气的说,想要进行自动化测试,那还真得会编码。就拿易用性方面名声不错

的 QTP 来说,要是不会编写 VBScript 脚本,要是不会综合应用 QTP 内置的对象和函数,

要是不了解 QTP 支持的扩展,那么就是对 QTP 这个工具没有很深入的了解,那么如何做到

能灵活应用呢。要是真碰到特殊问题,那很容易就 GameOver 了。我曾经拿几个自动化测试

工具(如 QTP9.2 版、RFT7.1 版、TestComplete5.0 版)试了试一些基本的标准 html 页面的

功能。有的没法完全回放成功,而如果要进行一些特殊的判断或处理,那“录制”基本就不

可能了。而且,即使录制的都能成功回放,那能说明这就实现了自动化测试嘛?自动化测试

重点还是在测试,要实现的是测试的目的,而不是在于几个工具的使用上。

自动化测试是一种技术、是一种能力,它不是绑定在某种工具上的。在实际的实践中,

发现一些自动化测试人员,在熟练掌握一个自动化测试工具后,非常的高兴,而且有点炫耀

的味道。于是乎,本人就问他:“你以为会这个工具,你就会自动化测试了吗?你最多就算

会这个工具,或精通这个工具,跟自动化测试无关。”(本人说话较直,总喜欢实话实说- -!)。

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 27

这里要说的是,要注意自动化测试不是工具的必然。如果只是把自动化测试定位在一两个工

具上,那这个人到头来可能会的不是自动化测试技术,而是工具。当然如果要直接从自动化

测试技术入手,可能学起来会没有感观认识,而且进入那个自动化测试思维大门较难。因此,

一般的学习和进阶方法可以如下:找一个或两个比较容易实现自动化测试的工具,进行深入

的学习,并在项目中进行实践,等有一定实践经验后,自然会有一定的认识的。而这时就需

要自己的思维脱离这些自动化测试工具,进而思考自动化测试技术的方方面面。然后当然就

是可以试用其他的测试工具(强调一下,不要以为只有测试工具才能用于自动化测试,其他

工具也可以的,只要那个工具提供的功能满足应用的需求,那就可以了),或自己编码实现

一个小型工具(自动化测试人员是需要编程技术的),或直接用脚本语言编写执行程序等等。

这时就是要根据要测试的内容能随心所欲的应用自动化测试了。

接下来根据几个网友的讨论,谈点有关自动化测试框架的认识吧。在开展自动化测试时,

没有必要去深究自动化测试框架到底是什么,要怎么定义。因为这个定义的话,估计还没人

敢说他有标准的定义。而且即使有标准的框架要求,那我根据公司的自动化测试需要,加入

一些东西也是可以的嘛。在应用自动化测试框架方面,个人感觉还是不要跟风的好。有人总

喜欢有什么好的框架或功能齐全的框架,就要拿来用。当然并不是说这些框架不好,也不是

说不能用。只是说在用时,请考虑一下,自己目前用这些框架真的好嘛?如果刚开展自动化

测试,就拿封装度很高的框架来套上,这不仅会增加学习量(框架是要学习的),而且会使

测试人员只对框架有概念,而对于原版的工具生疏,要真是碰到框架不好解决的问题,那到

时就不好办了。个人感觉,适用自己公司自动化测试要求的框架是比较好的框架。这个框架,

可以是开源的,可以是自己开发的,甚至前期可以就几个文件夹或者规范要求或者再加几个

共享文件、几个通用脚本等等。

自动化测试也是需要比较完备的规范的,不仅需要脚本规范,也需要适用公司的自动化

测试流程规范。只有有了脚本规范,才能使合作开发的脚本更像一个整体,使后期的脚本维

护相对容易些。自动化测试流程规范是相当重要的。流程规范需要确定如何与手工测试人员

交互,如何获取需求,如何产生测试用例,如何开发自动化测试程序,如何使用自动化测试,

如何分析结果等等。如果这些没有确定好,很容易使自动化测试不流畅,甚至于“破产”。

公司中要实行自动化测试,上级领导和现有开发测试人员对质量的意识很重要。举个碰

到过的小例子:系统在发布前,按理应该要进行比较完备的回归测试的。但目前的现状就是

只进行简单跑跑看看。这对于手工测试来说,时间不太多。而如果用自动化测试来实现了比

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 28

较完备的回归测试,时间也不见得比手工测试少,因为手工测试没有进行完备的回归测试呀。

在对这点的认识上,手工测试人员和上级认为自动化测试确实没有节省时间,也没有产生效

益(因为发现的问题几乎没有)。后来我只问了一句:“难道你们认为在发布前也应该找出

一堆 BUG 吗?难道质量保证是没有效益的吗?”。在后来的自动化测试实现中,我当然是

拒绝再为这种之前测试就不完备,而且还不被上级和手工测试人员所承认的功能实现自动化

测试了。因为这很容易让上级和手工测试人员感觉自动化测试也就这样,还不如手工测试得

了。久而久之,自动化测试基本就会被抛弃了。

瞎扯了这么多,主要还是要说明,自动化测试不像厂商吹的那么强大、易用。具体还得

自己去试试,就像小马过河不试怎么能知道呢。而且每个人的认识都会不一样的。最后说明

一点,咱们国家现在更需要的是创新,而不是复制。当然创新性的应用也是创新呀。

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 29

QC 的安装注意事项

之 Weblogic

作者:哈日格

1、 首先安装数据库,选择安装 MS-SQL Server2000 时,一定要将版本升级到 8.0(sp4)

2、 安装 Weblogic,并且进行配置

3、 安装 QC,注意:QC8.0 是不支持操作系统 windows XP 的

4、 群集配置:选择第一个节点

5、 许可证密钥:选择使用评估密钥

6、 应用服务器配置:选择其他应用服务器(Weblogic)

7、 Mercury Quality Center 演示:选择 Mercury Quality Center 演示项目+Mercury Tours

8、 邮件服务器属性:选择无

9、 数据库类型属性:选 MS-SQL Server

10、输入 SQL Server 的管理员用户名和密码

11、安装完毕后,打开 Weblogic http://localhost:7001/console 进行配置

12、打开 Web Application 下,点击“Deploy a new Web Application Module... ”进入

文件夹 cgServer 然后选择 upload your file(s),上载 qcbin.war、sabin.war、mtours.war

三个文件,然后对这三个文件进行配置,如果是自己建立的的服务,千万别忘了选中 SSL

Listen Port Enabled 这个选项,这样就可以进行远程访问了。

13、这样就 OK 了,直接输入:http://20.1.1.138:7001/qcbin 就可以访问了

www.5etesting.com

《每日 E 测》第一期 我们的 E 测 30

征稿启事 《每日 E 测》是一本涵盖软件测试各方面实践经验知识,国内首刊以自动化测试为特色的 E

测中国旗下的非营利的综合性电子杂志。本刊以“知识分享,共同成长,提高国内软件质量”

为办刊宗旨,服务于所有软件测试行业尤其是自动化测试行业的工程师。为了汇集更多广大

软件测试从业人员的研究成果、促进学术交流互补、丰富软件测试理论创新宝库,我们特向

全球征集优秀中文稿件。

【征稿对象】

所有软件行业从业人员,对测试有热情的愿意分享工作中软件测试的心得体会的所有海内外

人士

【来稿须知】

1.文字精练、语句通顺、层次清楚。文章内容应具有先进性和实用性。引用资料要注明文献

依据,参考文献需为作者亲自查阅的近 5 年的主要文献

2.投稿方式:电子邮件形式,请发送至[email protected]。来稿请使用word排版,

并请注明作者姓名、单位、通讯地址、邮编、电子信箱、联系电话等,本刊暂只接受邮件投

稿

3.论文的基本要素齐全,文章标题、作者单位、作者姓名、关键词、摘要、结语、参考文献

等。

4..文责自负,文稿一律不退,请作者自留底稿,请勿一稿多投!

5.本刊有权对采用的稿件作必要的修改

6.来稿必复,如在 15 日内不见回复,请再次发送邮件,以免影响正常发表

7.其他未尽事宜及本刊相关情况,将在文稿采用通知中详告作者

【其他事项】

1.网站收录:我们会将《每日 E 测》发表在 E 测中国首页及“E 测下载”(研发中...)的显

著位置,供软件测试界的同行下载学习与探讨

2.优秀作者将成为我们的特约撰稿人,并赠送即将出版的《QTP 项目应用与进阶》

3.本征稿启事长期有效

4.E 测中国保留对《每日 E 测》的所有解释权

E测中国 - www.5etesting.com