1.QTP测试技术简介
QTP是Quick Test Professional的简称,是一种自动测试工具。使用QTP的目的是想用它来执行重复的自动化测试,主要是用于回归测试和测试同一软件的新版本。因此你在测试前要考虑好如何对应用程序进行测试,例如要测试哪些功能、操作步骤、输入数据和期望的输出数据等。
1.1基本功能
HP QuickTest Professional 提供符合所有主要应用软件环境的功能测试和回归测试的自动化。采用关键字驱动的理念以简化测试用例的创建和维护。它让用户可以直接录制屏幕上的操作流程,自动生成功能测试或者回归测试用例。专业的测试者也可以通过提供的内置脚本和调试环境来取得对测试和对象属性的完全控制。如图(1-1)

图(1-1)
2.功能测试

用户需要输入用户名应大于或者等于四个字符,输入密码为“mercury”即可登录该飞机订票系统。
针对登录模块的输入条件:用户名和密码,有以下几种情况:
1. 当用户什么也没输入,直接点OK按钮,是否提示请输入用户名;
2. 当用户输入正确的用户名,没输入密码,直接点击OK按钮,是否提示请输入密码;
3. 对密码进行验证看是否设置输入密码的长度;
4. 当输入正确的用户名和密码时,点击OK按钮是否进入操作界面;
根据上面的分析,设计了如下表(2-1-2)的测试用例:
因此根据以上的分析,设计下列测试用例测试系统功能。
| ID | 输入条件 | 预期输出 | 实际输出 | |
| 用户名 | 密码 | |||
| 001 | 空 | 空 | 提示:输入用户名 | 提示:输入用户名 |
| 002 | 空 | Zhang | 提示:输入用户名 | 提示:输入用户名 |
| 003 | 空 | mercury | 提示:输入用户名 | 提示:输入用户名 |
| 004 | zha | 空 | 提示:用户名长度少于4位 | 提示:用户名长度少于4位 |
| 005 | zha | Baihao | 提示:用户名长度少于4位 | 提示:用户名长度少于4位 |
| 006 | zha | Mercury | 提示:用户名长度少于4位 | 提示:用户名长度少于4位 |
| 007 | Mercury | 空 | 提示:输入密码 | 提示:输入密码 |
| 008 | Mercury | Zhang | 提示:密码错误 | 提示:密码错误 |
| 009 | Mercury | Mercury | 登录成功 | 登录成功 |
| 010 | zhang | Mercury | 登录成功 | 登录成功 |
第一步:用QTP自动打开Flight Reservation系统的登陆界面,输入用户名和密码,确定当前的操作,将订票系统打开,登陆界面如图(2-1-1);

图(2-1-1)
第二步:在QTP主界面中单击“Record”,在登陆界面的文本框中,输入正确的用户名和密码,单击“OK”按钮,进入飞机订票系统界面。在QTP主界面,单击“Stop”按钮,结束当前的录制,如图(2-1-2)
图
(2-1-2)
录制的脚本为:
Dialog("Login").WinEdit("Agent Name:").Set "zhang"
Dialog("Login").WinEdit("Password:").Set "636b53c7a146a382b12b9daa065cd86181"
Dialog("Login").WinButton("OK").Click
Window("Flight Reservation").Activate
Window("Flight Reservation").Close
第三步:在Expert View中更改Keyword View中,将密码更改为明文,同时在用户名字位置文本中添加检查点,脚本如下:
1: Dialoa(Loain").WinEdit("Agent Name:".Check CheckPoint("Agent Name:")
2: Dialog("Login").WinEdit("Agent Nam Set'zhang"
3: Dialog("Login") WinEdit("Password.SetSecure "636b5cb878f8a2a38c53d9f5389f0b0374254ac
4: Dialoa("Loain").WinButton("OK").Click
5: Window("Flight Reservation").Close
图(2-1-
3)
订票实例的前提是登录订票系统的成功,该实例是在订票系统中进行订票操作:输入航班日期、选择起飞地、选择目的地、选择航班、输入顾客姓名、输入票的张数、选择航班级别、单击订票按钮,完成订票功能。
| 测试编号 | 输入 | 预期结果 | 实际结果 |
| 001 | 空 | 选择Fly From中的地点,弹出警告
|
|
| 002 | 13/01/22 | 月份不合法,弹出警告信息 |
|
| 003 | 10/36/22 | Day不合法,弹出警告信息 |
|
| 004 | 10/12/20 | 时间没有在当天的后面,弹出警告 |
|
| 005 | 11/07/22 | 正确 |
|
| 006 | Fly From 为空 | Fly To不可选,弹出警告 |
|
![]() | Fly From和Fly To 有一个为空,或都为空 | 航班按钮不可选择 |
|
| 008 | Fly From选择Paris | 正确 |
|
| 009 | Fly To 选择London | Flights按钮可用 | 成功 |
| 010 | 单机选择10583航班 | 在窗口显示航班信息 | 出发点为Paris,目的地为London,选择10583航班 |
| 011 | 在Fly From中改选 LosAngeles | 清空航班信息,Flights按钮不可用 | Flights按钮不可用 |
| 012 | 输入名字、票数和等级:yilian,1,Business | Price:$346.94 Total:$346.94 | 成功 |
第一步:录制脚本,选择“Record”如图(2-2-1);

(2-2-1)
第二步:在Agent Nnamesh输入名字,Password中都输入Mercury点击“OK”按钮,如图(2-2-2);

图(2-2-2)
第三步:输入飞机的时间、出发地、目的地,然后选择“Flights”选择航班,如图(2-2-3);

图(2-2-3)
第四步:选择要乘坐飞机的航班,然后点击确定,如图(2-2-4);

图(2-2-4)
第五步:输入顾客的姓名、票数、票的类型、点击“insert”,如图(2-2-5);
图(2-2-5)
第六步:点击“Stop”结束录制过程,脚本录制成功,如图(2-2-6);
图(2-2-6)
第七步:在容易出错的点上右击鼠标,选择“Insert Standard Checkpoint”,如图(2-2-7);

图(2-2-7)
第八步:点击“确定”,如图(2-2-8);

图(2-2-8)
脚本(截图),图(2-2-9);

图(2-2-9)
传真订单实例是传真订票成功的订单,在传真订单中,需要输入传真号、确定是否输入签名等。选择打开存在的订单,传真订单是设置前面是汉字“田”,预览传真,开始传真。
打开飞机订票系统,在系统的File中打开Open Order,会出现Open Order对话框,有顾客姓名、日期、航班等选项,如下图(2-3-1);

图(2-3-1)
输入顾客的姓名,即可查询到顾客订购的机票信息,如下图(2-3-2);

图(2-3-2)
打开File下的Fax Order,可以生成传真,填写Fax Number,输入086-010-1234,同时设置签名为“田”字。此时,录制签名之前,需要改变录制模式,录制模式修改为“Analog Recording”,修改后再录制签名,签名录制完后,再切换到“Recording”模式,发送传真,完成录制,如下图(2-3-3);

图(2-3-3)
在传单的录制过程中,还要添加对象,添加Flight Reservation对象,飞机航班的Flights Table对象,如下图(2-3-4);

图(2-3-4)
添加对象完成后,选择“All Object Types”,如下图(2-3-5);

图(2-3-5)
在“All Object Respositories“的对话框里,可以看到添加进去的所有对象,如下图(2-3-6);

图(2-3-6)
飞机订票成功后,也可以对订单进行删除。在Flight Reservation中提前订购好的订单挑出来,用QTP录制删除订单的过程,且欲删除订单必须确认订单有效,根据用户名查询订单,删除订单。
首先打开飞机订票系统,同时打开QTP进行录制,在File中打开Open Order,若输入顾客的姓名正确,此时会跳出顾客飞机航班的订票情况,并添加到对象库中,如下图(2-4-1);

图(2-4-1)
在File中打开Open Order,在Customer Name中输入一个错误的顾客姓名,此时会弹出一个顾客姓名错误的提示框,在QTP中添加此对象,如下图(2-4-2);

图(2-4-2)
最后添加确认删除的对话框,如下图(2-4-4);

图(2-4-4)
在所有的对象都添加到对象库中,在All Object Repositories会显示所有的对象,如图(2-4-5);

图(2-4-5)
通过运用QTP对飞机订票系统的测试,将已设计好的测试用例添加到QTP中,通过脚本的参数化设置,对测试用例进行自动化循环测试,如下图(1-1);


图(1-1)
QTP对测试用例的自动化测试后,分别将可以登陆成功和不能登陆成功的测试用例进行测试,运行结果如图(1-2);

图(1-2)
可以登录飞机订票系统的测试用例,QTP在测试后会显示登陆成功,如下图(1-3);

图(1-3)
不可以登录飞机订票系统的测试用例,QTP在测试后会显示登录失败,并且会说明错误的信息,如下图(1-4);


执行QTP生成的脚本,结果如图(2-1);

图(2-1)
SystemUtil Run"C \Proaram Files(x86)\samples\flight\app\light4a.exe"
Dialog("Login").WinEdit("Agent Name:")Set"zhang”
Dialog("Login").WinEdit("Password:").SetSecure"636ba7e21e486292e9a8291ab222bf69281a2a08"Dialog("Login”).WinButton("OK").Click
Window("Flight Reservation").WinObject("Date of Flight).Type "112022"
Window("Flight Reservation”.WinComboBox("Fly From:).Select"Frankfurt"
Window("Flight Reservation").WinComboBox("Fly To:" Select"London"
Window("Flight Reservation").WinButton("FLIG TMClick
Window("Flight Reservation").Dialog("Flights Table").WinList("From").Select"13130FRA 01:24 PM LON 02Window("Flight Reservation").Dialog("Flights Table”).WinButton("OK").Click
Window("Flight Reservation").WinEdit("Name:").Set"zhangbaihao"
Window("Flight Reservation").WinRadioButton("Business").Set
Window("Flight Reservation").WinButton("lnsert Order").Click
Window("Flight Reservation").Close
在添加完所有的对象后,录制的脚本才可以运行,同时也能在回放中看到缩写的签名,运行结果如图(2-3-7);

SystemUtil.Run"C:\Program Files(x86)\samples\flight\app\flight4a.exe"
Dialog("Login").WinEdit("Agent Name:".Set'zhang"
Dialog("Login) WinEdit('Password:").SetSecure "636cd70a06fbcbaa6465117d25b41f4b8fec4dce"Dialog("Login").WinButton("OK").Click
Window("Flight Reservation").WinMenu("Menu”) Select"File:Open Order.
Window("Fliaht Reservation).Dialog("Open Order").WinCheckBox("Customer Name").Set "ON”Window("Flight Reservation").Dialog("Open Order")WinEdit("Edit").Set"zhang"
Window("Flight Reservation").Dialog("Open Order").WinButton("OK").Click
Window"Fliaht Reservation") Dialog(Open Order) Dialog("Search Results").WinButton("OK").Click Window("Flight Reservation").WinMenu("Menu").Select"File:Fax Order.."
Window("Flight Reservation").Dialog("Fax Order No.11”).WinObject("Fax Number").Type"12345678911Desktop.RunAnalog"Track1"
Window("Flight Reservation").Dialog("Fax Order No. 11”).Activate
Window("Flight Reservation").Dialog('Fax Order No.11").WinButton("Send').Click
Window("Flight Reservation").Activate
Window("Flight Reservation").Close
完成对象添加的操作,就可以开始修改脚本了,添加了判断订单查询对话框是否存在,如果存在则循环管操作订单存在的列表,随机选择一个订单,确定删除该订单,运行结果如下图(4-1);

图(4-1)
Dim IntNumber_SearchResults,Str_SearchResults
Dim Delete_OrderNo
Window("Flight Reservation").Activate
Window("FlightReservation").WinMenu("Menu").Select"File;Open Order..."
Window("FlightReservation").Dialog("Open Order").WinCheckBox("Customer Name").Set "ON"
Window("Flight Reservation").Dialog("Open Order").WinEdit("Edit").Set "tianyanqin"
Window("FlightReservation").Dialog("Open Order").WinButton("OK").Click
While Window("Flight Reservation").Dialog("Open Order").Dialog("Search Results").Exist(5)
Intnumber_SearchResults = Window("Flight Reservation").Dialog("Open Order").Dialog("Search Results").WinList("Flight No.").GetItemsCount
Str_SearchResults = Window("Flight Reservation").Dialog("Open Order").Dialog("SearchResults").WinList("Flight No.").GetItem(RandomNumber(0,IntNumber_SearchResults-1))
Window("Flight Reservation").Dialog("Open Order").Dialog("Search Results").WinList("Flight No.").Select Str_SearchResults
Window("Flight Reservation").Dialog("Open Order").Dialog("Search Results").WinButton("OK").Click
Window("Flight Reservation").Activate
Delete_Order = Window("Flight Reservation").WinEdit("Order No:").GetROProperty("text")
Window("Flight Reservation").WinButton("Delete Order").Click
Window("FlightReservation").Dialog("Flight Reservations").WinButton("是(Y)").Click
Window("Flight Reservation").Activate
Reporter.ReportEvent micPass,"删除的订单号是:"&Delete_OrderNo,"删除的订单是:"&Str_SearchResults
Window("Flight Reservation").Activate
Window("Flight Reservation").WinMenu("Menu").Select"File;Open Order..."
Window("FlightReservation").Dialog("Open Order").WinCheckBox("Customer Name").Set"ON"
Window("FlightReservation").Dialog("Open Order").WinEdit("Edit").Set"tianyanqin"
Window("FlightReservation").Dialog("Open Order").WinButton("OK").Click
Wend
Window("Flight Reservation").Dialog("Open Order").Dialog("Flight Reservations").WinButton("确定").Click
Window("FlightReservation").Dialog("Open Order").WinButton("Cancel").Click
Reporter.ReportEvent micPass,"订单删除成功","
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h