脚本开发 完成测试用例后就可以开发测试脚本,一般包括自动化测试框架的开发和功能脚本的开发。在本节中不介绍如何开发自动化测试框架,有兴趣的读者可以参考《QTP自动化测试与框架模型设计》一书中第19章和第20章的自动化测试框架的内容。本章介绍该实例中需要调用到的函数。 (1)公用函数封装。 在本实例中需要封装的函数主要包括:读取测试用例、输入每个测试用例的测试结果。 通过获取单元格中数据的行数,可以确定测试用例文档中有多少条测试用例,代码如下:函数过程名称:GetExcelSheetRowsCount函数过程的目的:获取Sheet表中记录行数假设:无影响:无输入:无返回值:记录行数创建者:黄文高创建时间:20100811修改者:修改原因:修改时间:FunctionGetExcleSheetRowsCount(ExcelPath,SheetName)SetExcelBookCreateObject(Excel。Application)SetExcelSheetCreateObject(Excel。Sheet)SetmyExcelBookExcelBook。WorkBooks。Open(ExcelPath)SetmyExcelSheetmyExcelBook。WorkSheets(SheetName)GetExcleSheetRowsCountmyExcelSheet。UsedRange。Rows。CountExcelBook。QuitSetExcelSheetNothingSetExcelBookNothingEndFunction 读取单元格中的数据,即获得测试用例值,代码如下:函数过程名称:GetExcelCells函数过程的目的:读取Excel表中单元格的值假设:无影响:无输入:无返回值:Excel表中单元格的值创建者:黄文高创建时间:20100811修改者:修改原因:修改时间:FunctionGetExcelCells(ExcelPath,SheetName,SheetColumn,SheetRow)SetExcelBookCreateObject(Excel。Application)SetExcelSheetCreateObject(Excel。Sheet)SetmyExcelBookExcelBook。WorkBooks。Open(ExcelPath)SetmyExcelSheetmyExcelBook。WorkSheets(SheetName)SheetValuemyExcelSheet。cells(SheetColumn,SheetRow)。ValueGetExcelCellsSheetValueExcelBook。QuitSetExcelSheetNothingSetExcelBookNothingEndFunction 在该实例中还需要记录每个测试用例执行的结果,封装的代码如下:函数过程名称:CreateHtmlLog函数过程的目的:创建HTML格式的日志文件,并写Header假设:无影响:无输入:无返回值:无创建者:黄文高创建时间:20100809修改者:修改原因:修改时间:PublicSubCreateHtmlLog()ConstForReading1,ForWriting2,ForAppending8DimfileSystemObj,fileSpecDimcurrentTimecurrentDateDatecurrentTimeTimetestNameenvironment。Value(TestName)SetfileSystemObjCreateObject(Scripting。FileSystemObject)fileSpecTestPath测试记录testName。htmlSetlogFilefileSystemObj。OpenTextFile(fileSpec,ForAppending,False,True)logfile。writeline()logfile。writeline()logfile。writeline()logfile。writeline()logfile。writeline()logfile。writeline(TestLogFile)logfile。writeline()logfile。writeline()logfile。writeline(size2TestCaseName)logfile。writeline(size2TestCaseID)logfile。writeline(size2TestResult)logfile。writeline(size2TestTime)logfile。writeline(size2ActualValue)logfile。writeline(size2ExpectValue)logfile。writeline()logFile。CloseSetlogFileNothingEndSub函数过程名称:WriteHtml函数过程的目的:写HTML日志文件假设:无影响:无输入:无返回值:无创建者:黄文高创建时间:20100809修改者:修改原因:修改时间:FunctionWriteHtml(BusinessName,TestCaseID,TestResult,TestTime,ActualValue,ExpectValue)ConstForReading1,ForWriting2,ForAppending8DimfileSystemObj,fileSpecDimcurrentTimecurrentDateDatecurrentTimeTimetestNameenvironment。Value(TestName)SetfileSystemObjCreateObject(Scripting。FileSystemObject)fileSpecTestPath测试记录testName。htmlSetlogFilefileSystemObj。OpenTextFile(fileSpec,ForAppending,False,True)logfile。writeline()logfile。writeline()logfile。writeline(size2BusinessName)logfile。writeline(size2TestCaseID)ifucase(TestResult)Passthenlogfile。writeline(006000faceTahomasize2ucase(TestResult))elselogfile。writeline(CE0000faceTahomasize2ucase(TestResult))endiflogfile。writeline(size2TestTime)logfile。writeline(size2ActualValue)logfile。writeline(size2ExpectValue)logfile。writeline()logfile。writeline()logfile。writeline()logFile。CloseSetlogFileNothingendfunction 由于在本实例中需要连接数据库,检查数据库中的数据是否正确,所以将连接数据库的代码进行封装,代码如下:函数过程名称:ConnectDatabase函数过程的目的:连接数据库假设:无影响:无输入:无返回值:无创建者:黄文高创建时间:20100909修改者:修改原因:修改时间:SubConnectDatabase()StrConnProviderMicrosoft。Jet。OLEDB。4。0;DataSourceC:ProgramFilesHPQuickTestProfessionalsamplesflightappflight32。mdb;PersistSecurityInfoFalseSetConnCreateObject(Adodb。Connection)SetRstCreateObject(Adodb。RecordSet)Conn。OpenStrConnEndSub (2)单一模式脚本开发。 自动化测试脚本开发完成后,开始录制脚本,这个阶段主要是将自动化测试的需求转换为一个简单的脚本。 1)录制登录过程的脚本如下:Dialog(Login)。WinEdit(AgentName:)。SettestDialog(Login)。WinEdit(Password:)。SetSecure4f746e8c4a42371e29270aa8077835adfd4e3e6fDialog(Login)。WinButton(OK)。Clickwait(5)Window(FlightReservation)。Close 2)录制订票流程的脚本如下:Dialog(Login)。WinEdit(AgentName:)。SettestDialog(Login)。WinEdit(Password:)。SetSecure4f7470899cb23413741ea878e508c7c39c26d007Dialog(Login)。WinButton(OK)。Clickwait(5)Window(FlightReservation)。ActiveX(MaskEdBox)。Type040412Window(FlightReservation)。WinComboBox(FlyFrom:)。SelectFrankfurtWindow(FlightReservation)。WinComboBox(FlyTo:)。SelectLosAngelesWindow(FlightReservation)。WinButton(FLIGHT)。ClickWindow(FlightReservation)。Dialog(FlightsTable)。WinList(From)。Select20332FRA10:12AMLAX05:23PMAA112。20Window(FlightReservation)。Dialog(FlightsTable)。WinButton(OK)。ClickWindow(FlightReservation)。WinEdit(Name:)。SetarivnWindow(FlightReservation)。WinButton(InsertOrder)。ClickWindow(FlightReservation)。Close 3)录制航班信息的脚本如下:Dialog(Login)。WinEdit(AgentName:)。SettestDialog(Login)。WinEdit(Password:)。SetSecure4f7470899cb23413741ea878e508c7c39c26d007Dialog(Login)。WinButton(OK)。Clickwait(5)Window(FlightReservation)。ActiveX(MaskEdBox)。Type040412Window(FlightReservation)。WinComboBox(FlyFrom:)。SelectFrankfurtWindow(FlightReservation)。WinComboBox(FlyTo:)。SelectLosAngelesWindow(FlightReservation)。WinButton(FLIGHT)。ClickWindow(FlightReservation)。Dialog(FlightsTable)。WinList(From)。Select20332FRA10:12AMLAX05:23PMAA112。20Window(FlightReservation)。Close 4)录制查询订票信息的脚本如下:Dialog(Login)。WinEdit(AgentName:)。SettestDialog(Login)。WinEdit(Password:)。SetSecure4f7474b213b5bb9f7e950286e72b5f0d7487449bDialog(Login)。WinButton(OK)。Clickwait(5)Window(FlightReservation)。WinMenu(Menu)。SelectFile;OpenOrder。。。Window(FlightReservation)。Dialog(OpenOrder)。WinCheckBox(OrderNo。)。SetONWindow(FlightReservation)。Dialog(OpenOrder)。WinEdit(Edit)。Set42Window(FlightReservation)。Dialog(OpenOrder)。WinButton(OK)。ClickWindow(FlightReservation)。Close (3)脚本增强。 录制好的单一模式脚本的功能很弱,只完成了一个简单的功能,不具备可扩展性,无法兼容不同的测试数据,所以需要对上面的脚本进行增强。在录制单一模式的脚本时,其实有一个功能是通用的,就是登录功能,每个操作的功能都需要先登录系统,所以可将一个正确登录的脚本封装成一个过程,这样可以节约脚本量,也便于维护脚本。在封装登录过程时,需要使用到描述性编程,封装的代码如下:SubLogin()Dialog(text:Login)。WinEdit(attachedtext:AgentName:)。SettestDialog(text:Login)。WinEdit(attachedtext:Password:)。SetSecure4f746e8c4a42371e29270aa8077835adfd4e3e6fDialog(text:Login)。WinButton(text:OK)。Clickwait(5)EndSub 接着对登录的脚本进行增强操作,增强的原因是脚本需要能正确处理当输入用户名或密码出错的情况。主要需要处理的情况有:输入的用户名为空、输入的用户名少于4个字符、输入的密码为空、输入的密码少于4个字符。登录功能增强后的脚本如下:DimerrInfo返回提示的错误信息Dialog(Login)。WinEdit(AgentName:)。SettestDialog(Login)。WinEdit(Password:)。SetSecure4f772505bb7ff00c6ec281f9808222c2e89cf0ecDialog(Login)。WinButton(OK)。ClickIfDialog(Login)。Dialog(FlightReservations)。ExistThenerrInfoDialog(text:Login)。Dialog(text:FlightReservations)。Static(windowid:65535)。GetROProperty(text)Dialog(Login)。Dialog(FlightReservations)。WinButton(确定)。ClickDialog(Login)。Closeelsewait(5)Window(FlightReservation)。CloseEndIf 订票流程脚本的增强主要需要处理订票日期未输入和输入错误的情况,订票流程功能增强后的脚本如下:Dimerrinfo返回提示的错误信息Dialog(Login)。WinEdit(AgentName:)。SettestDialog(Login)。WinEdit(Password:)。SetSecure4f7729c18243dcb0a80aed533ae02ea81b074338Dialog(Login)。WinButton(OK)。Clickwait(5)Window(FlightReservation)。ActiveX(MaskEdBox)。Type121212Window(FlightReservation)。WinComboBox(FlyFrom:)。SelectSanFranciscoIfWindow(FlightReservation)。Dialog(FlightReservations)。ExistThenerrinfoWindow(regexpwndtitle:FlightReservation)。Dialog(text:FlightReservations)。Static(windowid:65535)。GetROProperty(text)Window(FlightReservation)。Dialog(FlightReservations)。WinButton(确定)。ClickelseWindow(FlightReservation)。WinComboBox(FlyTo:)。SelectLondonWindow(FlightReservation)。WinButton(Flight)。ClickWindow(FlightReservation)。Dialog(FlightsTable)。WinList(From)。Select13800SFO10:24AMLON12:54PMAF127。47Window(FlightReservation)。Dialog(FlightsTable)。WinButton(OK)。ClickWindow(FlightReservation)。WinEdit(Name:)。SetarivnWindow(FlightReservation)。WinButton(InsertOrder)。ClickEndIfWindow(FlightReservation)。Close 航班信息查询脚本的增强主要是需要检查当选择出发城市和到达城市后,显示出来的航班信息是否正确,脚本增强时需要获取所有航班信息。增强后的脚本如下:Dimflightinfo显示所有航班信息Dialog(Login)。WinEdit(AgentName:)。SettestDialog(Login)。WinEdit(Password:)。SetSecure4f7862cc49d3bfca65cfd26a9797bdbfab09733aDialog(Login)。WinButton(OK)。Clickwait(5)Window(FlightReservation)。ActiveX(MaskEdBox)。Type121212Window(FlightReservation)。WinComboBox(FlyFrom:)。SelectFrankfurtWindow(FlightReservation)。WinComboBox(FlyTo:)。SelectLondonWindow(FlightReservation)。WinButton(Flight)。ClickflightInfoWindow(FlightReservation)。Dialog(FlightsTable)。WinList(From)。GetROProperty(allitems)Window(FlightReservation)。Dialog(FlightsTable)。WinButton(OK)。ClickWindow(FlightReservation)。Close 查询订票信息脚本增强主要是需要检查该航班号是否存在,如果航班号不存在,会弹出相应的对应信息;如果查询的订单号存在,就会显示出该订单的相关信息。增强后的脚本如下:Dialog(Login)。WinEdit(AgentName:)。SettestDialog(Login)。WinEdit(Password:)。SetSecure4f78720180a456bfe5666600e64d62d0553bc374Dialog(Login)。WinButton(OK)。Clickwait(5)Window(FlightReservation)。WinMenu(Menu)。SelectFile;OpenOrder。。。Window(FlightReservation)。Dialog(OpenOrder)。WinCheckBox(OrderNo。)。SetONWindow(FlightReservation)。Dialog(OpenOrder)。WinEdit(Edit)。Set55555Window(FlightReservation)。Dialog(OpenOrder)。WinButton(OK)。ClickIfWindow(FlightReservation)。Dialog(OpenOrder)。Dialog(FlightReservations)。ExistThenerrInfoWindow(regexpwndtitle:FlightReservation)。Dialog(text:OpenOrder)。Dialog(regexpwndtitle:FlightReservations)。Static(windowid:65535)。GetROProperty(text)Window(FlightReservation)。Dialog(OpenOrder)。Dialog(FlightReservations)。WinButton(确定)。ClickWindow(FlightReservation)。Dialog(OpenOrder)。Dialog(FlightReservations)。CloseEndIfWindow(FlightReservation)。Close