﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-游闲子-随笔分类-功能自动化</title><link>http://www.cnitblog.com/andycai/category/8357.html</link><description>        ------尽自己的努力，做到最好...</description><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 13:08:42 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 13:08:42 GMT</pubDate><ttl>60</ttl><item><title>QTP关键技术--- 对象识别及存储技术基本常识</title><link>http://www.cnitblog.com/andycai/archive/2009/06/15/59394.html</link><dc:creator>枫晰落扬</dc:creator><author>枫晰落扬</author><pubDate>Mon, 15 Jun 2009 08:08:00 GMT</pubDate><guid>http://www.cnitblog.com/andycai/archive/2009/06/15/59394.html</guid><wfw:comment>http://www.cnitblog.com/andycai/comments/59394.html</wfw:comment><comments>http://www.cnitblog.com/andycai/archive/2009/06/15/59394.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/andycai/comments/commentRss/59394.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/andycai/services/trackbacks/59394.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">1）<a onclick="javascript:tagshow(event, '%B2%E2%CA%D4');" href="javascript:;" target=_self>测试</a>对象模型（Test Object Model）</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">测试对象模型是<a onclick="javascript:tagshow(event, 'QTP');" href="javascript:;" target=_self>QTP</a>用来描述应用程序中对象的一组对象类。每个测试对象类拥有一系列用于唯一确定对象属性和一组QTP能够录制的方法</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">2）测试对象（Test Object）</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">用于描述应用程序实际对象的对象，QTP存储这些信息用来在运行时识别和检查对象</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">3）运行时对象（Run-Time Object）:是应用程序中的实际对象，对象的方法将在运行中被执行</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A．确定用于描述当前操作对象的测试对象类，并创建测试对象</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B．读取当前操作对象属性的当前值，并存储一组属性和属性值到测试对象中</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C．为测试对象创建一个独特的有别于<a onclick="javascript:tagshow(event, '%C6%E4%CB%FB');" href="javascript:;" target=_self>其他</a>对象的名称，通常使用一个突出属性的值</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D．记录在对象上执行的操作</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">4）QTP的录制过程</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A．确定用于描述当前操作对象的测试对象类，并创建测试对象</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B．读取当前操作对象属性的当前值，并存储一组属性和属性值到测试对象中</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C．为测试对象创建一个独特的有别于其他对象的名称，通常使用一个突出属性的值</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D．记录在对象上执行的操作</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">5）QTP的回放过程</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A．根据对象的名称到对象存储库（Object Repository）中查找相应的对象</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B．读取对象的描述，即对象的属性和属性值</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C．基于对象的描述，QTP在应用程序中查找相应的对象</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D．执行相关的操作</p>
<img src ="http://www.cnitblog.com/andycai/aggbug/59394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/andycai/" target="_blank">枫晰落扬</a> 2009-06-15 16:08 <a href="http://www.cnitblog.com/andycai/archive/2009/06/15/59394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QTP关键技术---对Check Point的较为深入理解【转】</title><link>http://www.cnitblog.com/andycai/archive/2009/06/15/59393.html</link><dc:creator>枫晰落扬</dc:creator><author>枫晰落扬</author><pubDate>Mon, 15 Jun 2009 08:07:00 GMT</pubDate><guid>http://www.cnitblog.com/andycai/archive/2009/06/15/59393.html</guid><wfw:comment>http://www.cnitblog.com/andycai/comments/59393.html</wfw:comment><comments>http://www.cnitblog.com/andycai/archive/2009/06/15/59393.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/andycai/comments/commentRss/59393.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/andycai/services/trackbacks/59393.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">1. 定义：</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">将特定属性的当前数据与期望数据进行比较的检查点，用于判定被<a onclick="javascript:tagshow(event, '%B2%E2%CA%D4');" href="javascript:;" target=_self>测试</a>程序功能是否正确</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">Check Point可以分两类：<a onclick="javascript:tagshow(event, 'QTP');" href="javascript:;" target=_self>QTP</a>内置验证点和自定义验证点</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">2. QTP内置验证点实现原理及优缺点</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A．录制时，根据用户设置的验证内容，记录数据作为基线数据</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B．回放时，QTP捕获对象运行时的数据，与脚本中的基线数据进行比较</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C．如果基线数据和运行数据相同，结果为PASS，反之为Failed.</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D．优点是 操作简单方便</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E．缺点是 QTP默认的检查的属性有时不符合自己的要求，如希望得到检查的属性没有在里面， 而默认的属性不需要检查等。</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">注：<br>a.基线数据就是作为判断测试标准的数据。比如回归测试中可以用来上一次测试的数据作为基线数据判断新的程序是否提升</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">b.基线是软件<a onclick="javascript:tagshow(event, '%C5%E4%D6%C3%B9%DC%C0%ED');" href="javascript:;" target=_self>配置管理</a>中的一个概念，也就是说，软件版本在基线化后，进入受控状态，基线化后的软件版本成为一个静态的版本，在基线版本上的任何改动，都应该划归到下一个版本中。<br>举例子说明基线测试：<br>如果为了修改千年虫问题，需要对软件修改，修改后，需要对软件进行回归测试，回归测试基于未修改千年虫问题之前的的软件基线版本，去验证是否由于修改千年虫的问题，而使原基线版本软件的功能受到影响。<br>这就是一个极限测试的例子。</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">3. QTP内置验证点结果的应用</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A．录制的验证点在没有进行调整前，仅仅是给出了检查结果是通过还是错误的</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B．实际的测试过程中，可以根据验证点的结果进行不同的操作</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Window("Flight Reservation").WinEdit("Name:").Check(CheckPoint("Name:")) = True then</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msgbox "oh, success!"</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">Else</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msgbox "oh, failure!"</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">End If</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">4. 自定义验证点的应用及优缺点</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A．使用条件语句对实际值和期望值进行对比，然后用Reporter对象报告结果</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '检查Ticket Number</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">If CStr(dbTicketNumber) = CStr(DataTable("oTicketNumber", dtLocalSheet)) Then</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Reporter.ReportEvent micPass, "打开订单- TicketNumber", "期望结果是：" &amp; dbTicketNumber &amp; ", 界面显示实际结果是：" &amp; DataTable("oTicketNumber", dtLocalSheet)</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">Else</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Reporter.ReportEvent micPass, "打开订单- TicketNumber", "期望结果是：" &amp; dbTicketNumber &amp; ", 界面显示实际结果是：" &amp; DataTable("oTicketNumber", dtLocalSheet)</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">End If</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B．优点是 非常灵活，前者实现的所有检查都可以用此方法来实现；</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C．缺点是 代码量大，对测试人员的要求高。</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">5. 对Check Point的深入理解</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">摘自：51Testing，http://bbs.51testing.com/viewthread.php?tid=86742&amp;highlight=check</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">A．<a onclick="javascript:tagshow(event, '%B8%F6%C8%CB');" href="javascript:;" target=_self>个人</a>认为在比较简单的和有Active Screen的情况下可以使用QTP内置的Check Point，在比较复杂的情况下可以通过编程和使用Reporter来完成.</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">B．在使用check方法时，必须先在Keyword View或者Active Screen中新建CheckPoint。否则无法对该对象进行check，系统报错说无法在对象仓库中找到此对象。如果插入检查点，系统会自动把相关的对象添加到对象库中。</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">我认为检查点并不是一个实实在在的对象。因为你可以对同一个对象设置不同的检查点，可以把它的某个属性既设定成True，也可以设定为False。而对象库中的对象的属性值是必须依赖于对象的实际属性值的。如果随意更改有可能无法识别。还有就是可以针对同一个对象设定多个检查点。在测试窗口中可以看到这两个检查点的名称是区分开来的。所以我认为检查点并不是实际存在的对象，而是一些类似映射的东西。</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">尽管检查点并不是对象库中的实在的对象，但是它必须对应到对象库中的某个实实在在的对象，好像它的一个映像一样，而且在实际的操作过程中，QTP还是把它作为一个对象来处理的。</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">因为我们无法像<a onclick="javascript:tagshow(event, '%C6%E4%CB%FB');" href="javascript:;" target=_self>其他</a>对象一样把&#8220;检查点对象&#8221;添加到对象库中，而QTP又认为它是个对象，所以我们无法在专家视图中直接添加检查点脚本。但是我们可以采用编程描述的方式来实现检查点的功能。</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">CheckPoint 是一个依赖于Object Repository(对象库)中的某个对象的&#8220;虚拟对象&#8221;。其具体含义是：如果它所依赖的QTP 对象库中的对象没有了，那么此CheckPoint 也就不存在了；这个&#8220;虚拟对象&#8221;的属性是从它所依赖的对象的属性中&#8220;抽取&#8221;出来的，它具有它所依赖的对象的一个或几个属性，但不能增加它所依赖的对象没有的任何属性。</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">CheckPoint 是一个&#8220;虚拟对象&#8221;的重要原因是：每个Object都能在Object Repository找到它的Name、Class Properties，而CheckPoint 在Object Repository中就根本不存在。选择脚本中的某个对象后，在Object Property 的对话框里面有个Repository按钮，点击它后，你会看到此对象在Object Repository 的Name、Class 和 Properties。</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana" align=left>选择一个CheckPoint后，在CheckPoint Properties 的对话框里没有 Respository 按钮，在Object Respository中也找不到此CheckPoint的Name、Class 和 Properties（因为它在对象库中根本就不存在！）。</p>
<img src ="http://www.cnitblog.com/andycai/aggbug/59393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/andycai/" target="_blank">枫晰落扬</a> 2009-06-15 16:07 <a href="http://www.cnitblog.com/andycai/archive/2009/06/15/59393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QTP中Wait与同步点的区别</title><link>http://www.cnitblog.com/andycai/archive/2009/06/15/59392.html</link><dc:creator>枫晰落扬</dc:creator><author>枫晰落扬</author><pubDate>Mon, 15 Jun 2009 08:04:00 GMT</pubDate><guid>http://www.cnitblog.com/andycai/archive/2009/06/15/59392.html</guid><wfw:comment>http://www.cnitblog.com/andycai/comments/59392.html</wfw:comment><comments>http://www.cnitblog.com/andycai/archive/2009/06/15/59392.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/andycai/comments/commentRss/59392.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/andycai/services/trackbacks/59392.html</trackback:ping><description><![CDATA[<p><span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">&nbsp;&nbsp;&nbsp;先说wait函数,当脚本走到wait函数时,就开始执行这个函数.如:wait(10),就等待10秒种后再继续执行下面的语句.wait函数的这个等待的时间,那相对来说是比较固定的.如上例子,一定要等待完10秒后再执行.所以写脚本的时候要自己估算一下时间.不然可能造成时间的浪费,或者等待时间的不足.<br>&nbsp;&nbsp;&nbsp;那同步点呢.等待时间就比较灵活了,它的等待时间是不固定的.设置同步点后,当脚本执行到这句话后,脚本就开始执行等待.脚本会在规定时间内不断的去检查,所同步的对象有没有出现,一但出现,脚本就继续往下执行.不需要等完所有规定时间.如果在规定的时间内,所要同步对象还没有出现,那就提示超时的错误信息.51testing软件测试<br>例如:<br>&nbsp;&nbsp;&nbsp;Window("Flight Reservation").ActiveX("Threed Panel Control").WaitProperty "text", "Insert Done...", 10000<br>当脚本执行到这句话时,就开始执行同步等待时间.这里设置超时时间为10000.在这个时间内,脚本会不断去查看该对象的text属性的属性值Insert Done...,有没有出现.一但同步到这个属性值,就开始执行下面的脚本了.而不需要再继续等待,直到1000秒结束为止.那这样的话,这个等待时间不用自己去控制,设置好后由程序自己去判断,就比较灵活,也不会出现浪费时间的情况.能提高脚本的执行率.</span><br></p>
<img src ="http://www.cnitblog.com/andycai/aggbug/59392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/andycai/" target="_blank">枫晰落扬</a> 2009-06-15 16:04 <a href="http://www.cnitblog.com/andycai/archive/2009/06/15/59392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DataTable的操作可以很灵活【转】</title><link>http://www.cnitblog.com/andycai/archive/2009/06/15/59391.html</link><dc:creator>枫晰落扬</dc:creator><author>枫晰落扬</author><pubDate>Mon, 15 Jun 2009 08:03:00 GMT</pubDate><guid>http://www.cnitblog.com/andycai/archive/2009/06/15/59391.html</guid><wfw:comment>http://www.cnitblog.com/andycai/comments/59391.html</wfw:comment><comments>http://www.cnitblog.com/andycai/archive/2009/06/15/59391.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/andycai/comments/commentRss/59391.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/andycai/services/trackbacks/59391.html</trackback:ping><description><![CDATA[<p class=t_msgfont id=postmessage_50688 style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">由<a onclick="javascript:tagshow(event, 'QTP');" href="javascript:;" target=_self><u><strong><font color=#000000>QTP</font></strong></u></a>自动生成的语句是这样的：<br>DataTable("Col", dtLocalSheet)<br>DataTable("Col", dtGlobalSheet)<br>其中，dtLocalSheet就是当前Action的DataTable，dtGlobalSheet就是Global的DataTable，Col是列名<br><br>还有很多写法，比如<br>DataTable("Col", "Action2")<br>就是读取Action2的Col列。<br>你完全可以读取另一个Action的DataTable，而不需要跨Action传递变量，使用DataTable比变量更方便，因为结束后能在Result里看到<span class=t_tag href="tag.php?name=%D4%CB%D0%D0" ōnclick="tagshow(event)">运行</span>时的值<br>你可以在一个Action里读取另外一个Action的列，但是要注意另外一个Action的当前行<br>比如你在Action1里读取Action2的某列，如果Action1运行到第二行，你读取的Action2还是第一行的数据，解决办法就是写上这句：<br>DataTable.GetSheet("Action2").S<span class=t_tag href="tag.php?name=etC" ōnclick="tagshow(event)">etC</span>urrentRow(2)<br>你也可以用GetCurrentRow来获取Action1的行，然后再用<span class=t_tag href="tag.php?name=Set" ōnclick="tagshow(event)">Set</span>CurrentRow来保持两个Action的当前行一致：<br>CurrRow = DataTable.GetSheet("Action1").GetCurrentRow<br>DataTable.GetSheet("Action2").SetCurrentRow(CurrRow)<br><br>还有一种写法：<br>DataTable(1, "Action2")<br>这样就是读取Action2的第一列，不管第一列叫什么名字，都能读<br>这样就很方便，比如：<br>For i = 1 To 10<br>MsgBox DataTable(i, "Action2")<br>Next<br>这样就能循环读取Action2的1~10列了<br><br>同样，表也可以用数字代替：<br>DataTable(1, 2)<br>这样就是读取第二个Action表的第一列</p>
<img src ="http://www.cnitblog.com/andycai/aggbug/59391.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/andycai/" target="_blank">枫晰落扬</a> 2009-06-15 16:03 <a href="http://www.cnitblog.com/andycai/archive/2009/06/15/59391.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>qtp中的日期格式【转】</title><link>http://www.cnitblog.com/andycai/archive/2009/06/15/59390.html</link><dc:creator>枫晰落扬</dc:creator><author>枫晰落扬</author><pubDate>Mon, 15 Jun 2009 08:01:00 GMT</pubDate><guid>http://www.cnitblog.com/andycai/archive/2009/06/15/59390.html</guid><wfw:comment>http://www.cnitblog.com/andycai/comments/59390.html</wfw:comment><comments>http://www.cnitblog.com/andycai/archive/2009/06/15/59390.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/andycai/comments/commentRss/59390.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/andycai/services/trackbacks/59390.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">前几天的时候,用<a onclick="javascript:tagshow(event, 'QTP');" href="javascript:;" target=_self>QTP</a>别一个AX日期控件对象的时候</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">不知道是对象的关系还是QTP的关系不可以用SET方法瓷柚弥?只可以用SETdate来设置,</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">而且格式只有d-M-yyyy,如"7-Mar-2007"</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">而日期只有<st1:chsdate w:st="on" Year="2007" Month="3" Day="7" IsLunarDate="False" IsROCDate="False">2007-3-7</st1:chsdate>&nbsp;yyyy-m-d,</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">先是有FormatDateTime,cdate(vbs没format)来转换,我用的是简体中文系统,所以无果</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">看来只好自己做,如果自己做的话就要拼字符串,日-短英月-长年,日和年可以用day和year取出来</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">月的话就要写select来做吗?,我发现短英月就是英文月份的前3个字符,这样的话,我就只要取出一个英文月份名就可以了,如何取出英文月份名呢,我想了,日期格式是和区域设置有关,幸好vbs中有GetLocale和SetLocale,我就方便了,这样我先设置美国英文"en-gb",得到"07 March 2007"(dd MM yyyy),看来月份是有了,不过这个在中间,不太方便我就是试了试别的英语国家,终于在加拿大"en-ca"中有了"March 07, 2007" 这样我就只要取左3个字符了.</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">Function MyCdate(oDate)</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">currentLocale = GetLocale</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">original = SetLocale("en-ca")</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">on=left(cstr(FormatDateTime(oDate,1)),3)</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">original = SetLocale(currentLocale)</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">MyCdate=cstr(day(odate))+"-"+mon+"-"+cstr(year(odate))&nbsp;</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">End Function</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">摘自：<a href="http://www.114study.com/d0710190929060806" target=_blank>http://www.114study.com/d0710190929060806</a></p>
<img src ="http://www.cnitblog.com/andycai/aggbug/59390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/andycai/" target="_blank">枫晰落扬</a> 2009-06-15 16:01 <a href="http://www.cnitblog.com/andycai/archive/2009/06/15/59390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>参数化二之下拉框</title><link>http://www.cnitblog.com/andycai/archive/2009/06/15/59389.html</link><dc:creator>枫晰落扬</dc:creator><author>枫晰落扬</author><pubDate>Mon, 15 Jun 2009 07:59:00 GMT</pubDate><guid>http://www.cnitblog.com/andycai/archive/2009/06/15/59389.html</guid><wfw:comment>http://www.cnitblog.com/andycai/comments/59389.html</wfw:comment><comments>http://www.cnitblog.com/andycai/archive/2009/06/15/59389.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/andycai/comments/commentRss/59389.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/andycai/services/trackbacks/59389.html</trackback:ping><description><![CDATA[<p class=t_msgfont style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">这几天都在研究如何对下拉框中的值进行参数化，因为新手的原因，遇到了很多困难，知识的限制等等，经过了自己的努力和群中朋友的帮忙，终于解决了问题，也学到了很多东西，受益匪浅啊。个人觉得，通过对下拉框中的值的参数化，可以让<a onclick="javascript:tagshow(event, 'QTP');" href="javascript:;" target=_self><u><strong><font color=#000000>QTP</font></strong></u></a>自动的调用框中的值，自动运行程序，对于有大量数据来说是比较方便，灵活，并节约<a onclick="javascript:tagshow(event, '%B9%A4%D7%F7');" href="javascript:;" target=_self><u><strong><font color=#000000>工作</font></strong></u></a>的时间。<br>Dim id,itemname1,MyArray<br>For id =0 to 9<br>Browser("Welcome: <a onclick="javascript:tagshow(event, 'Mercury');" href="javascript:;" target=_self><u><strong><font color=#000000>Mercury</font></strong></u></a> Tours").Page("Welcome: Mercury Tours").WebEdit("userName").Set "mercury"<br>Browser("Welcome: Mercury Tours").Page("Welcome: Mercury Tours").WebEdit("password").SetSecure "47cf9c1063f49dee314fdac4c282898774372e5f"<br>Browser("Welcome: Mercury Tours").Page("Welcome: Mercury Tours").Image("Sign-In").Click 23,11<br>itemname1=Browser("Welcome: Mercury Tours").Page("Find a Flight: Mercury").WebList("fromPort").GetROProperty("all items")'获取下拉框中的所有值<br>MyArray=Split(itemname1,";",-1,1)'利用 Split 函数从字符串中返回数组。函数对分界符进行文本比较，返回所有的子字符串。<br>DataTable.SetCurrentRow(id+1)<br>DataTable.Value("weblist_item",Global)=MyArray(id)&nbsp;&nbsp;<br>DataTable.GetSheet("Global").SetNextRow&nbsp; &nbsp;&nbsp;&nbsp;'指向新的一行<br>Browser("Welcome: Mercury Tours").Page("Find a Flight: Mercury").WebList("fromPort").Select ("#")&amp; id<br>Browser("Welcome: Mercury Tours").Page("Find a Flight: Mercury").WebList("toPort").Select "San Francisco"<br>Browser("Welcome: Mercury Tours").Page("Find a Flight: Mercury").WebList("toMonth").Select "December"<br>Browser("Welcome: Mercury Tours").Page("Find a Flight: Mercury").Image("findFlights").Click 44,7<br>Browser("Welcome: Mercury Tours").Page("Select a Flight: Mercury").Image("reserveFlights").Click 75,13<br>Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebEdit("passFirst0").Set "andycai"<br>Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebEdit("passLast0").Set "cai"<br>Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebEdit("creditnumber").Set "8888888888888888"<br>Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebCheckBox("ticketLess").Set "ON"<br>Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").Image("buyFlights").Click 50,14<br>Browser("Welcome: Mercury Tours").Page("Flight Confirmation: Mercury").Image("home").Click<br>Browser("Welcome: Mercury Tours").Page("Welcome: Mercury Tours_2").Sync<br>Next</p>
<p class=t_msgfont style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">但其中有一缺陷：就是下拉框中的值的个数在本例子中无法使用，因为循环是贯穿整个程序，假如使用获取到的下拉框的值的个数，提示错误是:"找不到匹配对象"，所以暂时不知道怎么解决，只能用数字来代替了，如题中：For id =0 to 9</p>
<img src ="http://www.cnitblog.com/andycai/aggbug/59389.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/andycai/" target="_blank">枫晰落扬</a> 2009-06-15 15:59 <a href="http://www.cnitblog.com/andycai/archive/2009/06/15/59389.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用qtp进行回归测试</title><link>http://www.cnitblog.com/andycai/archive/2009/06/15/59388.html</link><dc:creator>枫晰落扬</dc:creator><author>枫晰落扬</author><pubDate>Mon, 15 Jun 2009 07:57:00 GMT</pubDate><guid>http://www.cnitblog.com/andycai/archive/2009/06/15/59388.html</guid><wfw:comment>http://www.cnitblog.com/andycai/comments/59388.html</wfw:comment><comments>http://www.cnitblog.com/andycai/archive/2009/06/15/59388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/andycai/comments/commentRss/59388.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/andycai/services/trackbacks/59388.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><span style="FONT-SIZE: 10pt">如何做回归</span><a onclick="javascript:tagshow(event, '%B2%E2%CA%D4');" href="javascript:;" target=_self><span style="FONT-SIZE: 10pt">测试</span></a><span style="FONT-SIZE: 10pt">并不是一个</span><a onclick="javascript:tagshow(event, 'QTP');" href="javascript:;" target=_self>QTP</a>的问题,而是一个回归测试的策略的问题.<br><br>那么什么是回归测试呢?简单的说,回归测试是贯穿在整个测试的各个阶段的一个测试活动.它的目的是检验已经被发现的缺陷有没有被正确的修改和修改过程中有没有引发新的缺陷.软件在测试或者<a onclick="javascript:tagshow(event, '%C6%E4%CB%FB');" href="javascript:;" target=_self>其他</a>活动中发现的缺陷经过修改后,都要进行回归测试的验证.<br><br>&nbsp; &nbsp; 我们在做回归测试的时候可以采用不同的策略.<br><br>策略(1) 可以选择完全重复测试.把所有的测试用例,全部再完全的执行一边,以确认问题修改的正确性和修改后周边是否受到影响.缺点是由于要把用例全部执行,所以会增加项目成本,也会影响项目进度.所以很难来完全执行,所以引出了回归测试策略(2) 选择性重复测试.<br><br>策略(2) 可以选择性重复测试.可以选择一部分进行执行,以确认问题修改的正确性和修改后周边是否受到影响.那么我们怎样去选择用例呢？这里有三个方法：１．覆盖修改法　针对发生错误的模块，选取这个模块的全部用例进行测试．这样只能验证本模块是否还存在缺陷，但不能保证周边与它有联系的模块不会因为这次改动而引发缺陷．所以引出第２个方法，即２．周边影响法．除了把出错模块的用例执行之外，把周边和它有联系的模块的用例也执行一边，保证回归测试的质量．当然我们还可以用量化的角度去分析模块的质量，比如：经过上面的一系列回归测试后，看看遗留的缺陷率是否已经在允许的范围之内了，那么我们以此为标准可以结束本次回归测试．也就是我要提到的第三个方法　３．指标达成法．<br><br>　　　回归测试的流程<br><br>１．在测试策略制定阶段，制定回归测试策略<br><br>２．确定回归测试版本<br><br>３．回归测试版本发布，按照回归测试策略执行回归测试<br><br>４．回归测试通过，关闭缺陷跟踪单<br><br>５．回归测试不通过，缺陷单返回开发人员．等重新修改，再次做回归测试．<br><br>那么我们为什么会把工具和回归测试联系起来呢?原因是在回归测试中我们会去做大量的重复的执行测试用例的操作.为了让测试员能够从这种重复的<a onclick="javascript:tagshow(event, '%B9%A4%D7%F7');" href="javascript:;" target=_self>工作</a>中解放出来,去测试更多新的用例,我们所以可以选用一些<a onclick="javascript:tagshow(event, '%D7%D4%B6%AF%BB%AF%B2%E2%CA%D4');" href="javascript:;" target=_self>自动化测试</a>工具,来录制脚本,代替一部分手工操作.但事实上并不是这些工具只能用在回归测试中,在其他操作上也可以应用.但有一点是工具不能完全代替手工测试,它只是手工测试的一种补助.所以QTP作为一款<a onclick="javascript:tagshow(event, '%B9%A6%C4%DC%B2%E2%CA%D4');" href="javascript:;" target=_self>功能测试</a>工具,可以运用到回归测试中.<br></p>
<img src ="http://www.cnitblog.com/andycai/aggbug/59388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/andycai/" target="_blank">枫晰落扬</a> 2009-06-15 15:57 <a href="http://www.cnitblog.com/andycai/archive/2009/06/15/59388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QTP读取文本问题</title><link>http://www.cnitblog.com/andycai/archive/2009/06/15/59387.html</link><dc:creator>枫晰落扬</dc:creator><author>枫晰落扬</author><pubDate>Mon, 15 Jun 2009 07:54:00 GMT</pubDate><guid>http://www.cnitblog.com/andycai/archive/2009/06/15/59387.html</guid><wfw:comment>http://www.cnitblog.com/andycai/comments/59387.html</wfw:comment><comments>http://www.cnitblog.com/andycai/archive/2009/06/15/59387.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/andycai/comments/commentRss/59387.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/andycai/services/trackbacks/59387.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">针对TXT文本中内容的读取问题，怎样能够一行一行读取，方法如下：<br><strong>方法一：</strong><br>Dim fso, MyFile,i,tmp<br>Set fso = CreateObject("Scripting.FileSystemObject")<br>Set MyFile= fso.OpenTextFile("e:\51test.txt", 1 , False)<br>Do Until MyFile.AtEndOfStream/AtEndOfLine（两个都可以用）<br>&nbsp;&nbsp;tmp=MyFile.ReadLine<br>&nbsp;&nbsp;MsgBox tmp<br>loop<br>MyFile.Close<br><br><strong>方法二：</strong><br>Dim fso, MyFile<br>Set fso = CreateObject("Scripting.FileSystemObject")<br>Set MyFile= fso.OpenTextFile("e:\51test.txt", 1 , False)<br>While myfile.AtEndOfStream &lt;&gt; True<br>Tmp = Split(MyFile.Readline, ",")<br>username=tmp(0)<br>password=tmp(1)<br>MsgBox username &amp;"/"&amp; password<br>wend<br>MyFile.Close<br></span>
<img src ="http://www.cnitblog.com/andycai/aggbug/59387.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/andycai/" target="_blank">枫晰落扬</a> 2009-06-15 15:54 <a href="http://www.cnitblog.com/andycai/archive/2009/06/15/59387.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>qtp表格检查点中日期函数问题</title><link>http://www.cnitblog.com/andycai/archive/2009/06/15/59386.html</link><dc:creator>枫晰落扬</dc:creator><author>枫晰落扬</author><pubDate>Mon, 15 Jun 2009 07:53:00 GMT</pubDate><guid>http://www.cnitblog.com/andycai/archive/2009/06/15/59386.html</guid><wfw:comment>http://www.cnitblog.com/andycai/comments/59386.html</wfw:comment><comments>http://www.cnitblog.com/andycai/archive/2009/06/15/59386.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/andycai/comments/commentRss/59386.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/andycai/services/trackbacks/59386.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">在使用<a onclick="javascript:tagshow(event, 'QTP');" href="javascript:;" target=_self><u><strong><font color=#000000>QTP</font></strong></u></a>创建表格检查点时，由于录制页面表格中日期是动态更新的，而使用旧的脚本运行就会出现检查点通不过的问题，我主要是想把这个表格中的日期用函数变量来代替，让它能够自动获取到系统的日期。QTP中的那个日期的格式是mar 17，2008，而我们日常获取到的日期方式3/17/2008,不知道如何才能转换成那种形式。不转换的话，检查点通过不了，可以使用一下方法解决：<br>Dim MyYear,MyMonth,MyDay,original,currentLocale,MyCdate<br>MyYear=Year(Now)<br>MyMonth=Month(Now)<br>MyDay=Day(now)<br>currentLocale = GetLocale'获取当前的区域设置<br>riginal = SetLocale("en-ca")'将区域设置设置为&#8220;加拿大英语&#8221;。<br>MyMonth=monthname（MyMonth,true)'把日期型格式化为长日期型<br>riginal = SetLocale(currentLocale)'使用 currentLocale 变量将区域设置设置为&#8220;加拿大英语&#8221;。<br>MyCdate=cstr(MyMonth&amp;" "&amp;MyDay&amp;","&amp;MyYear)<br>DataTable.Value ("sysdate1","Global")=MyCdate<br></p>
<img src ="http://www.cnitblog.com/andycai/aggbug/59386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/andycai/" target="_blank">枫晰落扬</a> 2009-06-15 15:53 <a href="http://www.cnitblog.com/andycai/archive/2009/06/15/59386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>