珍惜现在的每一分钟,全力以赴自己的梦想。 Jump for the sun, at least you land on the moon.

发布新日志

  • [StepbyStep]: Notes for JavaScript - 基础+实例

    2008-12-25 12:22:07

    <html>
     
     <head>

      <scrīpt src="D:\My Documents\Visual Studio 2008\ExternalJS.js">
       /* 外部JS
       function _message()
       {
          alert("该消息是通过外部JS调用");
       }
       */
      </scrīpt>

      <scrīpt type="text/javascrīpt">

       //Call ExternalJS
       _message();

       // Variable definition
       var alertMessage;
       alertMessage = "该提示框是通过 onload 事件调用的。";
       
       function message()
       {
        alert(alertMessage);
       }

       // display alert
       function disp_alert()
       {
        alert("I'm alert!" + '\n' + "This is 2nd line.");
       }

       //display confirm
       function disp_confirm()
       {
        var r=confirm("按下按钮")
        if (r==true)
        {
         alert("您按了确认!");
        }
        else
        {
         alert("您按了取消!");
        }
       }

       //display prompt
       function disp_prompt()
       {
        var name=prompt("请输入您的名字","Enter Your Name Here!");
        if (name!=null && name!="")
        {
         alert("Hello, " + name + ". How's your today?");
        }
       }

      
      </scrīpt>

     </head> 
     
     <body ōnload="message()"><!--Call InternalJS Function while page loading-->
      
      <input type="button" ōnclick="disp_alert()" value="显示警告框" />
      
      <p>

      <input type="button" ōnclick="disp_confirm()" value="显示确认框" />
      
      <p>

      <input type="button" ōnclick="disp_prompt()" value="显示提示框" />
      
      <p>

      <scrīpt type="text/javascrīpt">

       var _text;
       _text = "<h1>生成普通文本和标签<h1>";

       document.write("生成文本");

       document.write(_text);
       
       document.write("<h1>这是标题</h1>");

       document.write("<p>这是段落</p>");
       
       document.write("<p>单行注释//</p><p>多行行注释/* ... */</p>");

      </scrīpt>

     </body>

    </html>

  • [StepbyStep]: Notes for WDSL - 实例分析

    2008-12-24 15:02:28

        public class WS_MyService1 : System.Web.Services.WebService
        {

            [WebMethod]
            public string _print(string _str)
            {
                return _str;
            }
        }

    以上是一个WebService中的一个类。以下是其对应WDSL的片段,

    <wsdl:message name="_printSoapIn">

    <wsdl:part name="parameters" element="tns:_print" />

    </wsdl:message>

     

    <wsdl:message name="_printSoapOut">

            <wsdl:part name="parameters" element="tns:_printResponse" />

    </wsdl:message>

     

    <wsdl:portType name="WS_MyService1Soap">

    <wsdl:operation name="_print">

    <wsdl:input message="tns:_printSoapIn" />

    <wsdl:output message="tns:_printSoapOut" />

    </wsdl:operation>

    </wsdl:portType>

     

    分析:

     

    l  <portType> 元素把 " WS_MyService1Soap " 定义为某个端口的名称,把 "_print " 定义为某个操作的名称。操作 " _print " 拥有一个名为 "_printSoapIn" 的输入消息,以及一个名为 "_printSoapOut " 的输出消息。

    l  <message> 元素可定义每个消息的部件,以及相关联的数据类型。对比传统的编程,WS_MyService1Soap是一个函数库,而 "_print " 是带有输入参数 "_printSoapIn" 和返回参数_printSoapOut的一个函数。

  • [StepbyStep]: Notes for SOAP 2 - SOAP元素:HTTP Binding

    2008-12-24 14:33:27

    HTTP 协议

     

    HTTP TCP/IP 之上进行通信。HTTP 客户机使用 TCP 连接到 HTTP 服务器。在建立连接之后,客户机可向服务器发送 HTTP 请求(Request)消息:

     

    POST /item HTTP/1.1

    Host: 189.123.345.239

    Content-Type: text/plain

    Content-Length: 200

     

    随后服务器会处理此请求,然后向客户机发送一个 HTTP 响应(Response)。此响应包含了可指示请求状态的状态代码:

     

    200 OK

    Content-Type: text/plain

    Content-Length: 200

     

    在上面的例子中,服务器返回了一个 200 的状态代码。这是 HTTP 的标准成功代码。

     

    假如服务器无法对请求进行解码,它可能会返回类似这样的信息:

     

    400 Bad Request

    Content-Length: 0

     

    SOAP HTTP Binding

     

    SOAP 方法指的是遵守 SOAP 编码规则的 HTTP 请求/响应。

     

    HTTP + XML = SOAP

     

    SOAP 请求可能是 HTTP POST HTTP GET 请求。

     

    HTTP POST 请求规定至少两个 HTTP Content-Type Content-Length

     

    Content-Type

     

    SOAP 的请求和响应的 Content-Type 头可定义消息的 MIME 类型,以及用于请求或响应的 XML 主体的字符编码(可选)。

     

    语法

     

    Content-Type: MIMEType; charset=character-encoding

     

    例子

     

    POST /item HTTP/1.1

    Content-Type: application/soap+xml; charset=utf-8

     

    Content-Length

     

    SOAP 的请求和响应的 Content-Length 头规定请求或响应主体的字节数。

     

    语法

     

    Content-Length: bytes

     

    例子

    POST /item HTTP/1.1

    Content-Type: application/soap+xml; charset=utf-8

    Content-Length: 250

  • [StepbyStep]: Notes for SOAP 2 - SOAP元素:Fault

    2008-12-24 14:25:26

    SOAP Fault 元素

     

    来自 SOAP 消息的错误消息被携带于 Fault 元素内部。

     

    如果已提供了 Fault 元素,则它必须是 Body 元素的子元素在一条 SOAP 消息中,Fault 元素只能出现一次。

     

    SOAP Fault 元素用于下列子元素: 

    子元素

    描述

    <faultcode>

    供识别故障的代码

    <faultstring>

    可供人阅读的有关故障的说明

    <faultactor>

    有关是谁引发故障的信息

    <detail>

    存留涉及Body元素的应用程序专用错误信息

     

    SOAP Fault Codes

     

    在下面定义的 faultcode 值必须用于描述故障时的 faultcode 元素中: 

    错误

    描述

    VersionMismatch

    SOAP Envelope元素的无效命名空间被发现

    MustUnderstand

    元素的一个直接子元素(带有设置为"1"mustUnderstand属性)无法被理解。

    Client

    消息被不正确地构成,或包含了不正确的信息。

    Server

    服务器有问题,因此无法处理进行下去。

  • [StepbyStep]: Notes for SOAP 2 - SOAP元素:Body

    2008-12-24 14:14:12

    SOAP Body 元素

     

    必需的 SOAP Body 元素可包含打算传送到消息最终端点的实际 SOAP 消息。

     

    SOAP Body 元素的直接子元素可以是合格的命名空间。SOAP 在默认的命名空间中("http://www.w3.org/2001/12/soap-envelope")定义了 Body 元素内部的一个元素。即 SOAP Fault 元素,用于指示错误消息。

     

    <?xml version="1.0"?>

    <soap:Envelope

    xmlns:soap="http://www.w3.org/2001/12/soap-envelope"

    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

     

    <soap:Body>

       <m:GetPrice xmlns:m="http://www.w3school.com.cn/prices">

          <m:Item>Apples</m:Item>

       </m:GetPrice>

    </soap:Body>

     

    </soap:Envelope>上面的例子请求(Request)苹果的价格。请注意,上面的 m:GetPrice Item 元素是应用程序专用的元素。它们并不是 SOAP 标准的一部分。

     

    而一个 SOAP 响应(Reponse)应该类似这样:

     

    <?xml version="1.0"?>

    <soap:Envelope

    xmlns:soap="http://www.w3.org/2001/12/soap-envelope"

    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

     

    <soap:Body>

       <m:GetPriceResponse xmlns:m="http://www.w3school.com.cn/prices">

          <m:Price>1.90</m:Price>

       </m:GetPriceResponse>

    </soap:Body>

     

    </soap:Envelope>

  • [StepbyStep]: Notes for SOAP 2 - SOAP元素:Header

    2008-12-24 13:57:24

    SOAP Header 元素

    可选的 SOAP Header 元素可包含有关 SOAP 消息的应用程序专用信息(比如认证、支付等)。如果 Header 元素被提供,则它必须是 Envelope 元素的第一个子元素

     

    注释:所有 Header 元素的直接子元素必须是合格的命名空间。

     

    <?xml version="1.0"?>

    <soap:Envelope

    xmlns:soap="http://www.w3.org/2001/12/soap-envelope"

    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

     

    <soap:Header>

    <m:Trans

    xmlns:m="http://www.w3school.com.cn/transaction/"

    soap:mustUnderstand="1">234</m:Trans>

    </soap:Header>

     

    ...

    ...

     

    </soap:Envelope>上面的例子包含了一个带有一个 "Trans" 元素的头部,它的值是 234,此元素的 "mustUnderstand" 属性的值是 "1"

     

    SOAP 在默认的命名空间中 ("http://www.w3.org/2001/12/soap-envelope") 定义了三个属性。这三个属性是:actor mustUnderstand 以及 encodingStyle。这些被定义在 SOAP 头部的属性可定义容器如何对 SOAP 消息进行处理。

     

    actor 属性

     

    通过沿着消息路径经过不同的端点,SOAP 消息可从某个发送者传播到某个接收者。并非 SOAP 消息的所有部分均打算传送到 SOAP 消息的最终端点,不过,另一个方面,也许打算传送给消息路径上的一个或多个端点。

     

    SOAP actor 属性可被用于将 Header 元素寻址到一个特定的端点。

     

    语法

     

    soap:actor="URI"

     

    实例

     

    <?xml version="1.0"?>

    <soap:Envelope

    xmlns:soap="http://www.w3.org/2001/12/soap-envelope"

    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

     

    <soap:Header>

    <m:Trans

    xmlns:m="http://www.w3school.com.cn/transaction/"

    soap:actor="http://www.w3school.com.cn/appml/">

    234

    </m:Trans>

    </soap:Header>

     

    ...

    ...

     

    </soap:Envelope>

     

    mustUnderstand 属性

     

    SOAP mustUnderstand 属性可用于标识标题项对于要对其进行处理的接收者来说是强制的还是可选的。

     

    假如您向 Header 元素的某个子元素添加了 "mustUnderstand="1",则它可指示处理此头部的接收者必须认可此元素。假如此接收者无法认可此元素,则在处理此头部时必须失效。

     

    语法

     

    soap:mustUnderstand="0|1"

     

    实例

     

    <?xml version="1.0"?>

    <soap:Envelope

    xmlns:soap="http://www.w3.org/2001/12/soap-envelope"

    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

     

    <soap:Header>

    <m:Trans

    xmlns:m="http://www.w3school.com.cn/transaction/"

    soap:mustUnderstand="1">

    234

    </m:Trans>

    </soap:Header>

     

    ...

    ...

     

    </soap:Envelope>

  • [StepbyStep]: Notes for SOAP 2 - SOAP元素:Envelope

    2008-12-24 13:47:47

    SOAP Envelope 元素

     

    必需的 SOAP Envelope 元素是 SOAP 消息的根元素。它可把 XML 文档定义为 SOAP 消息。注意 xmlns:soap 命名空间的使用。它的值应当始终是:http://www.w3.org/2001/12/soap-envelope并且它可把封装定义为 SOAP 封装:

     

    <?xml version="1.0"?>

    <soap:Envelope

    xmlns:soap="http://www.w3.org/2001/12/soap-envelope"

    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

      ...

      Message information goes here

      ...

    </soap:Envelope>

     

    xmlns:soap 命名空间

     

    SOAP 消息必须拥有与命名空间 "http://www.w3.org/2001/12/soap-envelope" 相关联的一个 Envelope 元素。如果使用了不同的命名空间,应用程序会发生错误,并抛弃此消息。

     

    encodingStyle 属性

     

    SOAP encodingStyle 属性用于定义在文档中使用的数据类型。此属性可出现在任何 SOAP 元素中,并会被应用到元素的内容及元素的所有子元素上。SOAP 消息没有默认的编码方式。

     

    语法

     

    soap:encodingStyle="URI"

     

    实例

     

    <?xml version="1.0"?>

    <soap:Envelope

    xmlns:soap="http://www.w3.org/2001/12/soap-envelope"

    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

    ...

    Message information goes here

    ...

    </soap:Envelope>

  • [StepbyStep]: Notes for SOAP 1

    2008-12-24 13:22:26

    什么是 SOAP?

    SOAP(Simple Object Access Protocol)是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。or更简单地说:SOAP 是用于访问网络服务的协议。

    l  SOAP 指简易对象访问协议

    l  SOAP 是一种通信协议

    l  SOAP 用于应用程序之间的通信

    l  SOAP 是一种用于发送消息的格式

    l  SOAP 被设计用来通过因特网进行通信

    l  SOAP 独立于平台

    l  SOAP 独立于语言

    l  SOAP 基于 XML

    l  SOAP 很简单并可扩展

    l  SOAP 允许您绕过防火墙

    l  SOAP 将被作为 W3C 标准来发展

     

    SOAP 构建模块

    一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:

    l  必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息

    l  可选的 Header 元素,包含头部信息

    l  必需的 Body 元素,包含所有的调用和响应信息

    l  可选的 Fault 元素,提供有关在处理此消息所发生错误的信息

    所有以上的元素均被声明于针对 SOAP 封装的默认命名空间中:

    http://www.w3.org/2001/12/soap-envelope

    以及针对 SOAP 编码和数据类型的默认命名空间:

    http://www.w3.org/2001/12/soap-encoding

     

    语法规则

    这里是一些重要的语法规则:

    l  SOAP 消息必须用 XML 来编码

    l  SOAP 消息必须使用 SOAP Envelope 命名空间

    l  SOAP 消息必须使用 SOAP Encoding 命名空间

    l  SOAP 消息不能包含 DTD 引用

    l  SOAP 消息不能包含 XML 处理指令

     

    SOAP 消息的基本结构

    <?xml version="1.0"?>

    <soap:Envelope

    xmlns:soap="http://www.w3.org/2001/12/soap-envelope"

    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

     

    <soap:Header>

      ...

      ...

    </soap:Header>

     

    <soap:Body>

      ...

      ...

      <soap:Fault>

        ...

        ...

      </soap:Fault>

    </soap:Body>

     

    </soap:Envelope>

  • [转] Web性能测试指标

    2008-08-13 11:41:57

    Memory: 内存使用情况可能是系统性能中最重要的因素。如果系统“页交换”频繁,说明内存不足。“页交换”是使用称为“页面”的单位,将固定大小的代码和数据块从 RAM 移动到磁盘的过程,其目的是为了释放内存空间。尽管某些页交换使 Windows 2000 能够使用比实际更多的内存,也是可以接受的,但频繁的页交换将降低系统性能。减少页交换将显著提高系统响应速度。要监视内存不足的状况,请从以下的对象计数器开始:
    Available Mbytes:可用物理内存数. 如果Available Mbytes的值很小(4 MB 或更小),则说明计算机上总的内存可能不足,或某程序没有释放内存。

    page/sec: 表明由于硬件页面错误而从磁盘取出的页面数,或由于页面错误而写入磁盘以释放工作集空间的页面数。一般如果pages/sec持续高于几百,那么您应该进一步研究页交换活动。有可能需要增加内存,以减少换页的需求(你可以把这个数字乘以4k就得到由此引起的硬盘数据流量)。Pages/sec 的值很大不一定表明内存有问题,而可能是运行使用内存映射文件的程序所致。

    page read/sec:页的硬故障,page/sec的子集,为了解析对内存的引用,必须读取页文件的次数。阈值为>5. 越低越好。大数值表示磁盘读而不是缓存读。


    Pages per second :每秒钟检索的页数。该数字应少于每秒一页。
    Process:
    %Processor Time: 被处理器消耗的处理器时间数量。如果服务器专用于sql server,可接受的最大上限是80-85%
    InetinfPrivate Bytes:此进程所分配的无法与其它进程共享的当前字节数量。如果系统性能随着时间而降低,则此计数器可以是内存泄漏的最佳指示器。
    % DPC Time:越低越好。在多处理器系统中,如果这个值大于50%并且Processor:% Processor Time非常高,加入一个网卡可能会提高性能,提供的网络已经不饱和。
    表明由于硬件页面错误而从磁盘取出的页面数与页的硬故障不明白是意思。

  • QTP描述性编程之我见(1)

    2008-06-11 13:56:25

    一直听说QTP描述性编程如何如何,亲自试了试,感觉说不上来,如果Mercury能够将ObjectRepository分类就好了,一类对象是录制脚本时候自动添加的object,另一类可能就是用户自定义或需要进行描述性编程时用到的手动添加的object。

    在动手之前,也去网上搜索了一些描述性编程的介绍,实例什么的,真到自己手动还真费了不少劲道。

    下面是录制脚本和描述性编程脚本的对比片段:

    录制脚本:

    '描述性编程
    Browser("Google").Page("Google").WebEdit("q").Set "losing the love"
    Browser("Google").Page("Google").WebRadioGroup("meta").Select "lr=lang_zh-CN|lang_zh-TW"
    Browser("Google").Page("Google").WebButton("Google 搜索").Click

    描述性脚本:

    '描述性编程
    Browser("title:=Google").Page("title:==Google").WebEdit("name:=q").Set "losing the love"
    Browser("title:=Google").Page("title:=Google").WebRadioGroup("name:=meta").Select "lr=lang_zh-CN|lang_zh-TW"
    Browser("title:=Google").Page("title:=Google").WebButton("name:=Google 搜索").Click

    大家注意上述代码中的红色文本,如果有过开发经验的测试人员更容易理解,ms描述性编程就是将对象用属性来描述,并且描述的属性还必须唯一,否则QTP就无法正确识别。

    接下来就说说描述性编程的语法了:

    对象0("属性名0:=值0",..."属性名n:=值n").~对象m("属性名0:=值0",..."属性名n:=值n")

    注意:
    1)如果需要两个以上特性来描述一个对象,需要使用逗号(,)对描述性语言进行分割;
    2)使用:=来连接属性和属性值,并且:=两边不能有空格;
    3)使用SPY或ObjectRepository查看对象的属性名和值;

    另外,如果能够事先取得某属性的值并以变量的形式出现,那么在使用描述性编程的时候就能够更加的灵活了。如:

    Dim BrowserTitle, PageTitle, SearchKeyWords
    BrowserTitle="Google"
    PageTitle="Google"
    SearchKeyWords="Losing the Love"
    Browser("title:=" & BrowserTitle).Page("title:" & PageTitle).WebEdit("name:=q").Set SearchKeyWords

    http://www.51testing.com/html/51/133.html

  • QTP 9 不能识别对象的新解(原创)

    2007-08-02 16:37:58

    前几天,在测公司外包的时候需要批量验证数据,500条数据需要一条一条验证,如果眼睛跟着检查的话...... 会死人的。

    QTP来检查吧,想到就做。录脚本,设参数,运行... 报错!而且还是Cannot identify object。立马查看对象库,奇怪啊,对象库中有不能识别的对象,但就是无法运行通过。上网查了好多资料,基本都无效。郁闷啊...

    第二天,和同事商讨,原来她和我遇到了同样的问题,也试了好多方法,无效。

    第三天,怀疑自己QTP问题,之前装Build 8.2,现在卸载改装9。接着又是一阵忙活,问题依旧。哎,都是撞墙的准备了 555。然后同事建议采用编辑的方式录制看看是否能通过。这点提醒了我,我怎么没想到呢,好歹我也算是写过代码的。出于习惯,在录制过后,稍微留意了下原始脚本,果然被我看出问题来,如下:

    插入的检查点的脚本:

    Browser("MS/B Express_2").Page("MS/B Express_2").WebEdit("EMail").Check CheckPoint("CompareEmail")

    插入的编辑时的脚本:

    Browser("MS/B Express_2").Window("MS/B Express -- Web Page").Page("MS/B Express").WebEdit("EMail").Set “xxx@xxx.xxx

    问题就出在这里,确实是由于对象找不到,但是QTP在设检查点(手动添加的对象)的时候没有自动和其依赖的父对象进行关联,才导致这一问题。

    修改后的脚本:

    Browser("MS/B Express_2").Window("MS/B Express -- Web Page").Page("MS/B Express").WebEdit("EMail").Check CheckPoint("CompareEmail")

    另外,检查点的Name应该和源对象名不同,便于后期手工检查出错数据。

    QTP Help对于此问题的解决方案如下:

    Run Error: Cannot identify object

    This error indicates that there is no object in the current view of the application that matches the descrīption saved in the object repository for the object.

    This error occurs in one of two basic situations:

    The object is not (or not yet) displayed in the application at the time of the error.

    The object is present, but the descrīption in your application has changed so that it no longer matches the test object descrīption that QuickTest is using to identify the object.

     

  • 测试远程Web项目时判断故障发生网内还是网外(原创)

    2006-12-18 15:47:28

     

    前几天在测公司的外包项目(欧美)的时候,浏览器总是提示无法连接站点,于是下意识的用Ping来判断是否连通。刚开始以为是那边站点出了问题,但是其他人却能够正常访问,虽然公司内网有时不稳定,但也不至于长时间啊。由于需要亲自跑到机房重启“小锚”(路由的配置IP公司是保密的),次数多了也嫌麻烦(本人也不算很勤劳的那类人)。心想要是能有个工具来判断是否内网/外网问题,我也好偷个懒少走点冤枉路。哈哈,终于今天让我给找到了,就是dos下的命令Tracert(跟踪路由),顺便也把它给了解个透彻。

     

    Tracert(跟踪路由)是路由跟踪实用程序,用于确定 IP 数据报访问目标所采取的路径。Tracert 命令用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定从一个主机到网络上其他主机的路由。

     

    原理:

     

    通过向目标发送不同 IP 生存时间 (TTL) 值的“Internet 控制消息协议 (ICMP)”回应数据包,Tracert 诊断程序确定到目标所采取的路由。要求路径上的每个路由器在转发数据包之前至少将数据包上的 TTL 递减 1。数据包上的 TTL 减为 0 时,路由器应该将“ICMP 已超时”的消息发回源系统。

    Tracert 先发送 TTL 1 的回应数据包,并在随后的每次发送过程将 TTL 递增 1,直到目标响应或 TTL 达到最大值,从而确定路由。通过检查中间路由器发回的“ICMP 已超时”的消息确定路由。某些路由器不经询问直接丢弃 TTL 过期的数据包,这在 Tracert 实用程序中看不到。

    Tracert 命令按顺序打印出返回“ICMP 已超时”消息的路径中的近端路由器接口列表。如果使用 -d 选项,则 Tracert 实用程序不在每个 IP 地址上查询 DNS

     

     

    Sample

     

    数据包必须通过7个路由器才能到达主机218.1.64.33。主机的默认网关是 10.10.1.252218.1.0.0 网络上的路由器也有3个,最后一个IP地址是目标地址。

     

     

     

    Tracert命令的help

     

     

    参数中文描述:

     

    (1)Do not resolve addresses to hostnames.(指定不将 IP 地址解析到主机名称)

    (2)Maximum number of hops to search for target.(指定跃点数以跟踪到称为 target_name 的主机的路由)

    (3)Loose source route along host-list (IPv4-only).(指定 Tracert 实用程序数据包所采用路径中的路由器接口列表)

    (4)Wait timeout milliseconds for each reply.(等待 timeout 为每次回复所指定的毫秒数)

    (5)target_name 目标主机的名称或 IP 地址

    使用经验:

     

    1Tracert 对于解决大网络问题非常有用,此时可采取几条路径到达同一个目标。

    2Tracert 也能够确定数据包在网络上的停止位置。如果从网关处报错(网关 reports:Destination net unreachable., 这可能是路由器配置的问题,或者是目标网络不存在(错误的 IP 地址)。

    3)另外,如果需要通过网络来测试远端Web系统,一旦网络出现问题,Tracert可以很快地缩小网络故障的范围。

     

Open Toolbar