I don't make software; I make it better

发布新日志

  • 小评《我们需要专职的QA吗?》

    2012-06-01 15:31:07

    看了《我们需要专职的QA吗?》有点感触,简单发表下感受:
    1.中小型企业的Dev素质没那么高,连功能开发任务都完成不好,更不用说关心质量了,QA的作用更多的是验证需求,提升程序交互,同时让低级错误尽可能少的展现在用户面前。
    2.目前中国QA的素质没那么高,高一点的QA要么转做开发要么去大公司做SDET了,即懂Dev又懂Test比好一点的码农还少
    3.我赞同他的意见,优秀的工程师应该是即懂Dev又懂QA,这个是大的趋势,也是中国IT发展的方向。
    4.中国人骨子里都是自己瞧不起自己人,不少Dev or QA都是通过贬低对方抬高自己
    5.你以前那家公司的QA太挫了,担当少还自恃清高。
    6.给中国的QA一些时间,少一些偏见多一些理解
  • testlink安装过程及关键点

    2009-09-25 11:03:00

    在安装Testlink之前,需要首先安装Apache, PHP, Mysql支持软件包,例如XAMPP或EASYPHP等。
    下面以XAMPP为例进行说明。

    1 访问http://www.apachefriends.org/zh_cn/xampp.html 下载并安装最新的XAMPP版本。比如我下载的是:xampp-win32-1.7.2.exe

    2 安装“xampp-win32-1.7.2.exe”采用默认方式,一直“下一步”操作即可;

    3 启动“Apache”,“Mysql”服务,“filezila”服务

    4  访问 http://testlink.sourceforge.net/docs/testLink.php    下载Testlink1.81

    5   安装TestLink1.81

    (1)    将TestLink解压缩到D:\xampp\htdocs,命名为testlink;

    (2)    在IE中访问http://localhost/testlink/install/index.php;

    (3)    点击“New Installation”安装TestLink;

    (4)   Mysql数据库和TestLink数据库访问权限设置;(Mysql初始用户名是root,密码为空)

    Database Type Mysql

    Database host   localhost

    //配置访问Mysql的地址;

    Database login   root

    Database password “为空”

    //配置访问mysql的权限;

    TestLink DB login “你的用户名”

    TestLink DB passwaord “你的面貌”

    //配置访问Testlink数据库的权限 ;

    6 点击“同意许可协议”,继续

    7 安装完成,点击最后一行的(Please Click Me!)

    8 在Testlink第一次安装成功后,默认管理员帐户为admin,密码admin,使用其登录

    9 登录Testlink成功后,在菜单栏中的Personal中更改admin的密码,然后注销;

    10 删除C:\xampp\htdocs\testlink\install目录;

    11 在IE中访问http://localhost/testlink/index.php,弹出Testlink页面为英文,修改配置文件使其默认为中文;

    打开C:"xampp"htdocs"testlink下的config.inc.php文件;
    查找$g_default_language = 'en_GB';
    修改为$g_default_language = 'zh_CN';

    12 汉化TestLink:下载utf8版本的strings.txt替换C:\xampp\htdocs\testlink\locale\zh_CN目录下的strings.txt即可;

    13 搜索找到穆鲁下的配置文件const.inc.php,解决日期乱码问题;查询’zh_CN’ =>,修改为如下图红框所示:'zh_CN' => "%Y-%m-%d %H:%M:%S"

    14.搭建OK

    15.关键点
    (1)由于xampp-win32-1.7.2.exe下的php版本号大于5.2,目前是5.3,所以需要修改部分地方
    找到目录 testlink\lib\functions\ and change line number 173 in the file lang_api.php .
    Change this line:
    $t_lang_var = ereg_replace( '^TLS_', '', $t_var );
    to be this line:
    $t_lang_var = preg_replace( '/^TLS_/', '', $t_var );

    2.登录成功进入后页头的一个安全错误:
    To disable any reference to these checkings, set $tlCfg->config_check_warning_mode = SILENT;
    解决方案,找到config.inc.php,找到“Cfg->config_check_warning_mode”,修改如下:

    /** $tlCfg->config_check_warning_mode = 'FILE';        */
    $tlCfg->config_check_warning_mode = 'SILENT';  

    至此:完成安装与基本配置工作
    使用过程中发现更多问题下面再补充

    PS:部分参考卖烧烤鱼的文章

  • 测试工程师的职业发展

    2009-09-25 10:58:20

    1.技术类
    基础:
    (1)精通测试理论知识
    (2)精通1,2种测试类型及工具(性能测试,自动化测试,安全类测试)(Loadrunner+Jmeter;WVS+APPSCAN+其他工具)
    中级:
    (3)熟练掌握2,3种编程语言(C#+VBS+php)
    (4)熟练掌握数据库知识(MSSQL+MYSQL)
    (5)熟练掌握windows和Linux(能搭建各类测试环境)(testlink+bugzilla+WordPress+公司产品)
    (6)熟练掌握应用服务器及中间件知识(IIS,Apache)
    高级:
    (7)熟悉各个平台下的系统架构及本公司的产品技术架构(petshop+PHP架构)
    (8)熟悉各类算法,数据结构等
    (9)独立建立完善的自动化测试架构(QC+QTP+Loadrunner)
    2.管理类
    基础:
    (1)精通测试理论知识
    (2)项目管理知识
    中级:
    (3)熟练掌握质量管理,流程管理和控制,配置管理的知识
    (4)熟悉掌握各种测试类型
    (5)非常熟悉公司的产品及产品的发展策略
    高级:
    (6)职业经理人

     

  • HTTP协议详解

    2009-08-04 11:34:46

    引言                                       


    HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。
    HTTP协议的主要特点可概括如下:
    1.支持客户/服务器模式。
    2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
    3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
    4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
    5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。



    一、HTTP协议详解之URL篇

        http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。

    HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下:
    http://host[":"port][abs_path]
    http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用缺省端口80;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。
    eg:
    1、输入:www.guet.edu.cn
    浏览器自动转换成:http://www.guet.edu.cn/
    2、http:192.168.0.116:8080/index.jsp



    二、HTTP协议详解之请求篇

        http请求由三部分组成,分别是:请求行、消息报头、请求正文

    1、请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF 
    其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。

    请求方法(所有方法全为大写)有多种,各个方法的解释如下:
    GET     请求获取Request-URI所标识的资源
    POST    在Request-URI所标识的资源后附加新的数据
    HEAD    请求获取由Request-URI所标识的资源的响应消息报头
    PUT     请求服务器存储一个资源,并用Request-URI作为其标识
    DELETE  请求服务器删除Request-URI所标识的资源
    TRACE   请求服务器回送收到的请求信息,主要用于测试或诊断
    CONNECT 保留将来使用
    OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
    应用举例:
    GET方法:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源,eg:GET /form.html HTTP/1.1 (CRLF)

    POST方法要求被请求服务器接受附在请求后面的数据,常用于提交表单。
    eg:POST /reg.jsp HTTP/ (CRLF)
    Accept:image/gif,image/x-xbit,... (CRLF)
    ...
    HOST:www.guet.edu.cn (CRLF)
    Content-Length:22 (CRLF)
    Connection:Keep-Alive (CRLF)
    Cache-Control:no-cache (CRLF)
    (CRLF)         //该CRLF表示消息报头已经结束,在此之前为消息报头
    user=jeffrey&pwd=1234  //此行以下为提交的数据

    HEAD方法与GET方法几乎是一样的,对于HEAD请求的回应部分来说,它的HTTP头部中包含的信息与通过GET请求所得到的信息是相同的。利用这个方法,不必传输整个资源内容,就可以得到Request-URI所标识的资源的信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。
    2、请求报头后述
    3、请求正文(略)



    三、HTTP协议详解之响应篇

        在接收和解释请求消息后,服务器返回一个HTTP响应消息。

    HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文
    1、状态行格式如下:
    HTTP-Version Status-Code Reason-Phrase CRLF
    其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。
    状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
    1xx:指示信息--表示请求已接收,继续处理
    2xx:成功--表示请求已被成功接收、理解、接受
    3xx:重定向--要完成请求必须进行更进一步的操作
    4xx:客户端错误--请求有语法错误或请求无法实现
    5xx:服务器端错误--服务器未能实现合法的请求
    常见状态代码、状态描述、说明:
    200 OK      //客户端请求成功
    400 Bad Request  //客户端请求有语法错误,不能被服务器所理解
    401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
    403 Forbidden  //服务器收到请求,但是拒绝提供服务
    404 Not Found  //请求资源不存在,eg:输入了错误的URL
    500 Internal Server Error //服务器发生不可预期的错误
    503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
    eg:HTTP/1.1 200 OK (CRLF)

    2、响应报头后述

    3、响应正文就是服务器返回的资源的内容



    四、HTTP协议详解之消息报头篇

        HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有CRLF的行),消息正文(可选)组成。

    HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。
    每一个报头域都是由名字+“:”+空格+值 组成,消息报头域的名字是大小写无关的。

    1、普通报头
    在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。
    eg:
    Cache-Control   用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制),HTTP1.0使用的类似的报头域为Pragma。
    请求时的缓存指令包括:no-cache(用于指示请求或响应消息不能缓存)、no-store、max-age、max-stale、min-fresh、only-if-cached;
    响应时的缓存指令包括:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage.
    eg:为了指示IE浏览器(客户端)不要缓存页面,服务器端的JSP程序可以编写如下:response.sehHeader("Cache-Control","no-cache");
    //response.setHeader("Pragma","no-cache");作用相当于上述代码,通常两者//合用
    这句代码将在发送的响应消息中设置普通报头域:Cache-Control:no-cache


    Date普通报头域表示消息产生的日期和时间

    Connection普通报头域允许发送指定连接的选项。例如指定连接是连续,或者指定“close”选项,通知服务器,在响应完成后,关闭连接

    2、请求报头
    请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
    常用的请求报头
    Accept
    Accept请求报头域用于指定客户端接受哪些类型的信息。eg:Accept:image/gif,表明客户端希望接受GIF图象格式的资源;Accept:text/html,表明客户端希望接受html文本。
    Accept-Charset
    Accept-Charset请求报头域用于指定客户端接受的字符集。eg:Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
    Accept-Encoding
    Accept-Encoding请求报头域类似于Accept,但是它是用于指定可接受的内容编码。eg:Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。
    Accept-Language
    Accept-Language请求报头域类似于Accept,但是它是用于指定一种自然语言。eg:Accept-Language:zh-cn.如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。
    Authorization
    Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。
    Host(发送请求时,该报头域是必需的)
    Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的,eg:
    我们在浏览器中输入:http://www.guet.edu.cn/index.html
    浏览器发送的请求消息中,就会包含Host请求报头域,如下:
    Host:www.guet.edu.cn
    此处使用缺省端口号80,若指定了端口号,则变成:Host:www.guet.edu.cn:指定端口号
    User-Agent
    我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息。User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不过,这个报头域不是必需的,如果我们自己编写一个浏览器,不使用User-Agent请求报头域,那么服务器端就无法得知我们的信息了。
    请求报头举例:
    GET /form.html HTTP/1.1 (CRLF)
    Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF)
    Accept-Language:zh-cn (CRLF)
    Accept-Encoding:gzip,deflate (CRLF)
    If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)
    If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF)
    User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)
    Host:www.guet.edu.cn (CRLF)
    Connection:Keep-Alive (CRLF)
    (CRLF)

    3、响应报头
    响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。
    常用的响应报头
    Location
    Location响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。
    Server
    Server响应报头域包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。下面是
    Server响应报头域的一个例子:
    Server:Apache-Coyote/1.1
    WWW-Authenticate
    WWW-Authenticate响应报头域必须被包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。
    eg:WWW-Authenticate:Basic realm="Basic Auth Test!"  //可以看出服务器对请求资源采用的是基本验证机制。


    4、实体报头
    请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文(eg:有无实体正文)和请求所标识的资源的元信息。
    常用的实体报头
    Content-Encoding
    Content-Encoding实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。Content-Encoding这样用于记录文档的压缩方法,eg:Content-Encoding:gzip
    Content-Language
    Content-Language实体报头域描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言阅读
    者。eg:Content-Language:da
    Content-Length
    Content-Length实体报头域用于指明实体正文的长度,以字节方式存储的十进制数字来表示。
    Content-Type
    Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型。eg:
    Content-Type:text/html;charset=ISO-8859-1
    Content-Type:text/html;charset=GB2312
    Last-Modified
    Last-Modified实体报头域用于指示资源的最后修改日期和时间。
    Expires
    Expires实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和降低服务器负载)的页面,我们可以使用Expires实体报头域指定页面过期的时间。eg:Expires:Thu,15 Sep 2006 16:23:12 GMT
    HTTP1.1的客户端和缓存必须将其他非法的日期格式(包括0)看作已经过期。eg:为了让浏览器不要缓存页面,我们也可以利用Expires实体报头域,设置为0,jsp中程序如下:response.setDateHeader("Expires","0");



    五、利用telnet观察http协议的通讯过程

        实验目的及原理:
        利用MS的telnet工具,通过手动输入http请求信息的方式,向服务器发出请求,服务器接收、解释和接受请求后,会返回一个响应,该响应会在telnet窗口上显示出来,从而从感性上加深对http协议的通讯过程的认识。

        实验步骤:

    1、打开telnet
    1.1 打开telnet
    运行-->cmd-->telnet

    1.2 打开telnet回显功能
    set localecho

    2、连接服务器并发送请求
    2.1 open www.guet.edu.cn 80  //注意端口号不能省略

        HEAD /index.asp HTTP/1.0
        Host:www.guet.edu.cn
       
       /*我们可以变换请求方法,请求桂林电子主页内容,输入消息如下*/
        open www.guet.edu.cn 80
      
        GET /index.asp HTTP/1.0  //请求资源的内容
        Host:www.guet.edu.cn 

    2.2 open www.sina.com.cn 80  //在命令提示符号下直接输入telnet www.sina.com.cn 80
        HEAD /index.asp HTTP/1.0
        Host:www.sina.com.cn


    3 实验结果:

    3.1 请求信息2.1得到的响应是:

    HTTP/1.1 200 OK                                              //请求成功
    Server: Microsoft-IIS/5.0                                    //web服务器
    Date: Thu,08 Mar 200707:17:51 GMT
    Connection: Keep-Alive                                
    Content-Length: 23330
    Content-Type: text/html
    Expries: Thu,08 Mar 2007 07:16:51 GMT
    Set-Cookie: ASPSESSIONIDQAQBQQQB=BEJCDGKADEDJKLKKAJEOIMMH; path=/
    Cache-control: private

    //资源内容省略

    3.2 请求信息2.2得到的响应是:

    HTTP/1.0 404 Not Found       //请求失败
    Date: Thu, 08 Mar 2007 07:50:50 GMT
    Server: Apache/2.0.54 <Unix>
    Last-Modified: Thu, 30 Nov 2006 11:35:41 GMT
    ETag: "6277a-415-e7c76980"
    Accept-Ranges: bytes
    X-Powered-By: mod_xlayout_jh/0.0.1vhs.markII.remix
    Vary: Accept-Encoding
    Content-Type: text/html
    X-Cache: MISS from zjm152-78.sina.com.cn
    Via: 1.0 zjm152-78.sina.com.cn:80<squid/2.6.STABLES-20061207>
    X-Cache: MISS from th-143.sina.com.cn
    Connection: close


    失去了跟主机的连接

    按任意键继续...

    4 .注意事项:1、出现输入错误,则请求不会成功。
              2、报头域不分大小写。
              3、更深一步了解HTTP协议,可以查看RFC2616,在http://www.letf.org/rfc上找到该文件。
              4、开发后台程序必须掌握http协议

    六、HTTP协议相关技术补充

        1、基础:
        高层协议有:文件传输协议FTP、电子邮件传输协议SMTP、域名系统服务DNS、网络新闻传输协议NNTP和HTTP协议等
    中介由三种:代理(Proxy)、网关(Gateway)和通道(Tunnel),一个代理根据URI的绝对格式来接受请求,重写全部或部分消息,通过 URI的标识把已格式化过的请求发送到服务器。网关是一个接收代理,作为一些其它服务器的上层,并且如果必须的话,可以把请求翻译给下层的服务器协议。一 个通道作为不改变消息的两个连接之间的中继点。当通讯需要通过一个中介(例如:防火墙等)或者是中介不能识别消息的内容时,通道经常被使用。
         代理(Proxy):一个中间程序,它可以充当一个服务器,也可以充当一个客户机,为其它客户机建立请求。请求是通过可能的翻译在内部或经过传递到其它的 服务器中。一个代理在发送请求信息之前,必须解释并且如果可能重写它。代理经常作为通过防火墙的客户机端的门户,代理还可以作为一个帮助应用来通过协议处 理没有被用户代理完成的请求。
    网关(Gateway):一个作为其它服务器中间媒介的服务器。与代理不同的是,网关接受请求就好象对被请求的资源来说它就是源服务器;发出请求的客户机并没有意识到它在同网关打交道。
      网关经常作为通过防火墙的服务器端的门户,网关还可以作为一个协议翻译器以便存取那些存储在非HTTP系统中的资源。
        通道(Tunnel):是作为两个连接中继的中介程序。一旦激活,通道便被认为不属于HTTP通讯,尽管通道可能是被一个HTTP请求初始化的。当被中继 的连接两端关闭时,通道便消失。当一个门户(Portal)必须存在或中介(Intermediary)不能解释中继的通讯时通道被经常使用。

    2、协议分析的优势—HTTP分析器检测网络攻击
    以模块化的方式对高层协议进行分析处理,将是未来入侵检测的方向。
    HTTP及其代理的常用端口80、3128和8080在network部分用port标签进行了规定

    3、HTTP协议Content Lenth限制漏洞导致拒绝服务攻击
    使用POST方法时,可以设置ContentLenth来定义需要传送的数据长度,例如ContentLenth:999999999,在传送完成前,内 存不会释放,攻击者可以利用这个缺陷,连续向WEB服务器发送垃圾数据直至WEB服务器内存耗尽。这种攻击方法基本不会留下痕迹。
    http://www.cnpaf.net/Class/HTTP/0532918532667330.html

    4、利用HTTP协议的特性进行拒绝服务攻击的一些构思
    服务器端忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应,这种情况我们称作:服务器端受到了SYNFlood攻击(SYN洪水攻击)。
    而Smurf、TearDrop等是利用ICMP报文来Flood和IP碎片攻击的。本文用“正常连接”的方法来产生拒绝服务攻击。
    19端口在早期已经有人用来做Chargen攻击了,即Chargen_Denial_of_Service,但是!他们用的方法是在两台Chargen 服务器之间产生UDP连接,让服务器处理过多信息而DOWN掉,那么,干掉一台WEB服务器的条件就必须有2个:1.有Chargen服务2.有HTTP 服务
    方法:攻击者伪造源IP给N台Chargen发送连接请求(Connect),Chargen接收到连接后就会返回每秒72字节的字符流(实际上根据网络实际情况,这个速度更快)给服务器。

    5、Http指纹识别技术
       Http指纹识别的原理大致上也是相同的:记录不同服务器对Http协议执行中的微小差别进行识别.Http指纹识别比TCP/IP堆栈指纹识别复杂许 多,理由是定制Http服务器的配置文件、增加插件或组件使得更改Http的响应信息变的很容易,这样使得识别变的困难;然而定制TCP/IP堆栈的行为 需要对核心层进行修改,所以就容易识别.
          要让服务器返回不同的Banner信息的设置是很简单的,象Apache这样的开放源代码的Http服务器,用户可以在源代码里修改Banner信息,然 后重起Http服务就生效了;对于没有公开源代码的Http服务器比如微软的IIS或者是Netscape,可以在存放Banner信息的Dll文件中修 改,相关的文章有讨论的,这里不再赘述,当然这样的修改的效果还是不错的.另外一种模糊Banner信息的方法是使用插件。
    常用测试请求:
    1:HEAD/Http/1.0发送基本的Http请求
    2:DELETE/Http/1.0发送那些不被允许的请求,比如Delete请求
    3:GET/Http/3.0发送一个非法版本的Http协议请求
    4:GET/JUNK/1.0发送一个不正确规格的Http协议请求
    Http指纹识别工具Httprint,它通过运用统计学原理,组合模糊的逻辑学技术,能很有效的确定Http服务器的类型.它可以被用来收集和分析不同Http服务器产生的签名。

    6、其他:为了提高用户使用浏览器时的性能,现代浏览器还支持并发的访问方式,浏览一个网页时同时建立多个连接,以迅速获得一个网页上的多个图标,这样能更快速完成整个网页的传输。
    HTTP1.1中提供了这种持续连接的方式,而下一代HTTP协议:HTTP-NG更增加了有关会话控制、丰富的内容协商等方式的支持,来提供更高效率的连接。

    Author :Jeffrey  

    参考资料:http://www.javaeye.com/wiki/topic/390731

  • 如何建立一个相对完善的测试团队

    2009-07-24 11:27:50

    今天逛了逛淘宝的QA团队网站,学习并了解他们的测试的最新情况。从中读到一篇文章,感触颇深。

    《测试新人入职体验》讲的是一个测试新人在淘宝工作段时候后的总结,以管窥豹,可以看到淘宝测试团队的基本测试工作情况,结合我目前公司的测试的情况,发现有许多值得借鉴并改进的地方。

    从测试类型上看,测试可以分为:功能测试、性能测试、自动化测试、接口测试、安全性测试、易用性测试等等。

    从测试的过程来分,测试可以分为:产品/项目的升级测试流程、日常测试流程。

    其中,测试的过程里,具体的测试中,需要使用到的测试类型是根据实际情况(测试团队的人力资源,测试人员的素质,测试的进度安排,测试的深度与广度需求等)来进行安排的。

    测试类型上看,每种测试类型又涉及不同的测试工具和不同的测试技术需求。从web测试来说,涉及web前段的测试和web后端的测试,前端又涉及UI测试,易用性测试,安全性测试等,web后端如CMS涉及功能测试,接口测试等。UI测试需要了解UI设计的一些知识,需要了解并使用firebug,ie develop,httpwatch等辅助工具,更深层次的发展还需要了解设计相关知识如css,JavaScript,html等。安全性测试需要学习xss,sql注入,社会工程学等知识,需要了解并使用WVS,webinspect,appscan等扫描工具,更深层次安全测试需要学习如操作系统,数据库,Apache,IIS等知识。易用性测试需要了解User Experience Design等知识了,更高层次的发展就是产品经理了。web后端的测试,功能测试相对简单,主要是各个功能点的测试验证有效与否,深层次的发展就是白盒测试与自动化测试。接口测试主要涉及产品之间的兼容性,有效性测试,每次关联产品的变更,都需要对在本产品中用到的相关接口进行测试。

    另外,性能测试作为单独一块提下,性能测试是一个系统工程,涉及的知识非常多,以loadrunner为例主要涉及3大块:虚拟用户的脚本开发(涉及C语言编程,深层次涉及.NET,JAVA的整合应用),用户场景的设计(涉及用户行为分析等),测试结果分析(设计监控器,服务器优化调优等)。总之,非常复杂,建议参考《学习性能测试线路图》,jackei的blog性能测试模块。

    从上述的总结来看,每种测试类型都有其发展深度,每个测试人员都应该有一个相对主要的发展目标,把有限的精力放在一个相对稳定的目标上,更有利于测试人员的职业发展。

    上面说了技能,工具,发展。下面谈下管理方面的心得。

    业务层面上,每个公司都有自己的拳头产品,也许小公司没有,但在以前的项目中也肯定有一些具有典型代表的意义项目。这些产品/项目都有其核心的业务流程,掌握这些核心流程是每个测试团队的成员的基本目标。只有熟悉了业务,才能完整的掌握软件的功能点,才能在产品的升级测试,新项目的工程测试中高效率的工作。

    这里如何提高整个测试团队的工作效率呢?个人认为建立一个相对完善的测试体系是重中之重。无规矩不成方圆,没有套测试体系,那在实际测试工作中肯定是比较混乱的。而测试体系的建立要根据公司的实际情况来进行,现在参考一下淘宝的体系。以下是我猜想的淘宝体系:

    测试部=测试架构组+各测试小组+质量保证组

    测试架构组主要从整个测试层面来考虑问题,通常由资深的开发人员或架构师担任,需要精通公司各个产品的架构,需要精通测试的几大块:白盒测试+自动化测试+性能测试+安全性测试+功能测试。这里看阿里巴巴招聘的条件上就可以了解到。

    各测试小组,主要包括功能测试小组,自动化测试小组,性能测试小组,安全性测试小组,白盒测试小组(这个估计淘宝还没有)。

    质量保证组,更多的是配置管理,CMMI管理,考核统计的职能。

    然后对本公司的测试团队做一个简单的分析,找出可以改进的地方。

  • 短期-中期-长期 学习计划

    2009-03-30 17:33:47

    短期-中期-长期 学习计划
    1.开发方面:C#,偏向于asp.net
    2.测试方面:QTP,LOADRUNNER,QC
    3.基本功:数据结构,算法,Linux
    4.基本技能:英语
    5.行业方面:电子商务
    6.考研
    7.创业

    大公司:数据结构,算法,C#,英语

    中小公司:行业知识,QTP,LOADRUNNER

    王道:考个牛B的研

    霸道:自己创业

  • HTML复习

    2008-12-26 12:53:02

    参考文章:

    http://www.51testing.com/?59943/action_viewspace_itemid_98728.html

    HTML.chm

    一、 HTML基础
        1、HTML标记符的作用
        2、网页的基本结构,html、head、title、body标记
        3、网页中插入注释和特殊符号

    二、文本格式
        1、字符格式:font、b、i、u、hn
        2、段落格式:p、pre、hr、br
        3、列表格式:ol、ul、li、dl、dt、dd


    三、超级链接和图像
        1、超级链接a的使用
        2、插入图像
        3、图像映射

    四、表格和框架
        1、表格的使用:table、tr、td和th标记,细线表格和不规则表格
        2、创建框架结构:frameset、frame、iframe

    五、其它网页元素
        1、 表单:form、input、textarea、select、label。
        2、滚动字幕marquee
        3、网页插件的使用


    六.CSS+DIV
    DIV元素是用来为HTML文档内大块(block-level)的内容提供结构和背景的元素。DIV的起始标签和结束标签之间的所有内容都是用来构成这个块的,其中所包含元素的特性由DIV标签的属性来控制,或者是通过使用样式表格式化这个块来进行控制。
      CSS单元的位置和层次-div标签
      div接口=数字图像数据接口
    Cascading Style Sheets(CSS)是 DHTML 的基础。CSS 用来设定你网页上的元素是如何展示的。Cascading Style Sheets Positioning(CSS-P)是 CSS 的一个扩展,它可用来控制任何东西在网页上或是说在窗口中的位置。

    ul: unordered lists
    ol: ordered lists
    li: Lists
    ol 有序列表:
    <ol>
    <li>……</li>
    <li>……</li>
    <li>……</li>
    </ol>
    表现为:
    1……
    2……
    3……

    ul 无序列表,表现为li前面是大圆点而不是123:
    <ul>
    <li>……</li>
    <li>……</li>
    </ul>

    很多人容易忽略 dl dt dd的用法:
    dl 内容块
    dt 内容块的标题
    dd 内容
    可以这么写:
    <dl>
    <dt>标题</dt>
    <dd>内容1</dd>
    <dd>内容2</dd>
    </dl>

    dt 和dd中可以再加入 ol ul li和p,理解这些以后,在使用div布局的时候,会方便很多,w3c提供了很多元素辅助布局。

    七.表格 
    看看表格的基本语法:
    <table>...</table> - 定义表格
    <tr> ...</tr>- 定义表行
    <th> ...</th>- 定义表头
    <td> ...</td>- 定义表元
      下面看看它的示例:
       <table border="1">     <!--border是表格的边框属性,=“1”,即边框的宽为一象素-->
       <tr>       <!--定义表格的行-->
       <th>Food</th><th>Drink</th><th>Sweet</th>  <!--定义表格的表头,即标题-->
       </tr>      <!--行结束-->
       <tr>
       <td>A</td><td>B</td><td>C</td>   <!--定义表格的表元--> 
       </tr>
       </table>

       跨多行、多列的表元(Table Span)
       跨多列的表元 <th colspan=#>

       <table border>
       <tr><th colspan=3> Morning Menu</th></tr>   <!--colspan=3,跨三列表元-->
       <tr><th>Food</th><th>Drink</th><th>Sweet</th></tr>
       <tr><td>A</td><td>B</td><td>C</td></tr>
       </table>

       跨多行的表元 <th rowspan=#>

       <table border>
       <tr><th rowspan=3> Morning Menu</th>   <!--rowspan=3,跨三行表元-->
           <th>Food</th> <td>A</td></tr>
       <tr><th>Drink</th> <td>B</td></tr>
       <tr><th>Sweet</th> <td>C</td></tr>
       </table>
       其余的如表格居中,间隙,大小等省略。

    八.框架
    <HTML>
    <HEAD>
    <TITLE>框窗实作</TITLE>
    </HEAD>
    <FRAMESET COLS="120,*" >
     <FRAME SRC="a.htm" NAME="1">
     <FRAME SRC="b.htm" NAME="2">
    </FRAMESET>
    </HTML> 

    九.表单
    <FORM>
    喜好:
    <INPUT TYPE="CHECKBOX" NAME="SEX" VALUE="MOVIE">电影
    <INPUT TYPE="CHECKBOX" NAME="SEX" VALUE="BOOK">看书
    </FORM>

    十.排版卷标
    分段卷标p
    <p align="left">文字靠左</p> 文字靠左
    <p align="center">文字置中</p> 文字置中
    <p align="right">文字靠右</p> 文字靠右
    置中卷标<center>
    <center>这是最中间</center>
    向右缩排卷标<blockquote>
    <blockquote>缩排1单位</blockquote> 
    <blockquote><blockquote>缩排2单位</blockquote></blockquote>

    十一.链接
    网站链接 好站 <a href="http://www.wrclub.net">好站</a>
    电子邮件链接 写信给朋友 <a href="mailto:fuxing@wrclub.net">写信给朋友</a>
    ftp链接 下载档案 <a href="ftp://ftp.wrclub.net">下载档案</a>
    news链接 seednet news服务 <a href="news:news.wrclub.net">seednet news服务</a>
    gopher链接 seednet gopher服务 <a href="gopher://gopher.wrclub.net/">seednet gopher服务</a>
    bbs链接 seednet gopher服务 <a href="telnet://bbs.wrclub.net/">seednet bbs服务</a>
    o target=框窗名称:这在『框架标志』中也有提到,而且也只有在框架(框窗 or frame)中才用得到。正常而言,框窗有各自的名称,因此,我们可以利用此标志,来指定链接的内容显示到哪一个框窗中。

    o target=_blank:将链接的画面内容,开在新的浏览窗口中。

    o target=_parent:将链接的画面内容,当成文件的上一个画面。

    o target=_self:将链接的画面内容,显示在目前的窗口中。

    o target=_top:这个参数可以解决新链接的画面内容,被旧框窗包围的困扰,使用这参数,会将整个画面重新显示成链接的画面内容。

    十二.背景标识
    背景卷标<body bgcolor="#ffffff" background="bg.jpg">
    内文、连结文字颜色设定:<body text="#000000" link="#0000ff" vlink="#ff00ff" alink="#ff0000">

    十三.HTML示例

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
     <HEAD>
      <TITLE> New Document </TITLE>
      <META NAME="Generator" CONTENT="EditPlus">
      <META NAME="Author" CONTENT="">
      <META NAME="Keywords" CONTENT="">
      <META NAME="Descrīption" CONTENT="">
      <link rel="" type="text/css" href="">
      <link rel="" type="text/css" href="">
      <scrīpt src="XX/xx/xx.JS" type="txt/javascrīpt">
      <scrīpt src="XX/xx/xx.JS" type="txt/javascrīpt">
      ...
     </HEAD>

     <BODY>
      <scrīpt src="XX.JS" type="text/javascrīpt">
      <scrīpt src="XX.JS" type="text/javascrīpt">
      <div id="head">
     <div class="top">
     <div class="top_banner">
      <div id="logo"></div>
      <div id="HOME_top_fla">
     <div id="new_menu">
      <ul>
       <li class="top_nav4"/>
        <a href="XX.html">首 页</a>
       <li class="top_nav4"/>
       <li class="top_nav4"/>
       ...
      </ul>
     ...
    <div id="home_no1">
     </BODY>
    </HTML>

     


     

  • WEB安全测试所需的基础知识

    2008-12-19 16:29:53

    WEB安全测试所需的基础知识

    来自:http://bbs.51testing.com/thread-121779-1-1.html

    第一章:BS架构体系安全渗透测试基础
    1. HTTP协议基本概念
    (1)介绍HTTP标示URL
    (2)HTTP响应状态码
    (3)HTTP协议传输内容
    2. WEB应用认证基本概念
    (1)HTTP常见认证机制
    (2)BASE64编码介绍
    3. BS架构常见安全问题
    (1)拒绝服务攻击基础
    (2)Smurf攻击模型
    (3)Fraggle攻击模型
    (4)SynFlooding攻击模型
    (5)碎片攻击
    4. 嗅探理论基础
    (1)网络嗅探原理
    (2)密码嗅探介绍
    (3)协议分析基础介绍
    第二章:BS架构体系安全渗透测试攻击基础
    1. BS架构结构端口扫描分析
    (1)SuperScan工具
    (2)Nmap端口扫描工具

    2. 输入验证攻击基础知识
    (1)输入验证攻击基本概念
    (2)Unicode漏洞介绍
    (3)输入验证二次解码漏洞介绍
    3. ASP脚本注入基础知识
    (1)ASP脚本注入基本概念
    (2)ASP脚本注入检测
    (3)ASP脚本注入信息获取
    (4)AASP脚本注入提权
    4. PHP脚本注入基础知识
    (1)PHP脚本注入基本概念
    (2)PHP脚本注入检测
    (3)PHP脚本注入信息获取
    (4)PHP脚本注入提权
    5.跨站脚本原理及防御
    (1)跨站脚本基本概念
    (2)跨站脚本实例
    (3)跨站脚本解决方法
    6、 Web权限提升分析
    (1)Web权限提升基本概念
    (2)WeBShell上传方法
    (3)Web权限提升7大方法:密码破解、本地提权、Gina木马…
    7.APR嗅探基础
    (1)APR协议概念
    (2)APR欺骗攻击
    (3) 交换域网络嗅探
    第三章:BS架构体系安全渗透测试攻击与测试工具
    1、 攻击工具介绍
    (1)注入攻击工具原理
    (2)注入攻击工具分析
    (3)攻击测试平台搭建
    2.注入攻击工具使用练习(ASP+SQL Server注入攻击实战)
    (1)注入攻击工具使用
    (2)域名检查攻击工具使用及域名信息查询用
    3.拒绝服务攻击工具使用练习
    (1)SynFlooding攻击工具测试
    (2)UDPflood攻击工具测试
    (3)畸形DDOS攻击工具
    4.嗅探攻击工具使用练习
    (1)ARP欺骗攻击工具 密码嗅探练习
    (2)嗅探协议分析练习
    5. BS安全评估工具使用练习
    (1)Web脚本评估工具安装
    (2)BS架构扫描
    (3)评估报告分析撰写模版

  • sql基础复习

    2008-12-17 17:35:39

    基本SQL语句
    1.select prod_id,prod_name,prod_price form products order by prod_name,prod_price;
                       by 2,3;
                       by prod_price desc;降序
    2.select prod_id,prod_name,prod_price form products oder by 3 desc,2;
    3.select prod_id,prod_price form products where prod_price=3.3;
                      >0;
    4.select wend_id,prod_name from products where wend_id<>'DLL01';等价于!=
    5.select prod_name,prod_price form products where prod_price between 5 and 100;
    6.select prod_name form products where prod_price is null;
    7.select prod_id,prod_name,prod_price from products where vend_id="DLL01" and prod_price<=4;
    8.select prod_id,prod_name,prod_price form products where vend="DLL01" or vend_id='DLL02'
    9.select prod_id,prod_name,prod_price form products where vend_id='DLL01' or vend_id='DLL02' and prod_pric>=10;供应商DLL01所有的产品,DLL02价格为10美元以上的产品
                  (vend_id='DLL01' or vend_id='DLL02' )and prod_pric>=10;供应商DLL01,02所有价格为10美元以上的产品 AND优先级高于or
    10.select prod_name,prod_price form products where vend_id in ('DLL01'.'DLL02') oder by prod_name;等价于
                   vend_id='DLL01' or vend_id='DLL02' order by prod_name;
    11.select prod_nam,prod_price form products where not vend_id='DLL01' order by prod_name;
                 vend_id<>'DLL01'
    12.select prod_name,prod_id form products where prod_name like 'Fish%'; 通配符
                       '%bean bag%'
                       'F%y'                                     %匹配多个字符
                       '__ inch teddy bear '           _匹配单个字符
                       ‘[JM]%’                                  开头是J或M的
    13.select vend_name+'('+RTRIM(vend_country)+')'  AS vend_title form Vendors order by vend_name;  RTRIMsh()函数是去掉右边的所有空格
    14.select prod_id,quantity,item_price,quantity*item_price AS expanded_price form orderItems where order_num = 20008;
    15.select vend_name,UPPER(vend_name) AS vend name_upcase from vendors order by vend_name; UPPER()函数是转化为大写
    16.select order_num from orders where datepart(yy,order_date)=2004;
    17.select AVG(prod_price) AS avg_price from Products where  vend_id = 'DLL01';
    18.select count(*) as num_cust from Customers;
    19.select count(*) as num_cust,MAX(prod_price) as max_price,MIN(prod_price) as min_price,AVG(prod_price) as avg(prod_price) from productors;
    20.select  order_num,count(*) as items from OrderItems group by order_byn having count(*)>=3;
    21.inser into customers values('10006','Tony Land','New York','1234'.'null');
    22.inser into customers(cust_id,cust_name,cust_adress,cust_state,cust_email) values('10006','Tony Land','New York','1234'.'null'); 此句比上句更安全
    23.inser into customers(cust_id,cust_name,cust_adress,cust_state,cust_email) select cust_id,cust_name,cust_adress,cust_state,cust_email from CustNew
    24.select * into CustCopy from Customers;  从一个表复制到另一个表
    25.update customers set cust_email='newemail@email.com' where cust_id='000001';
    26.update customers set cust_contact='Sam robers',cust_email='newemail@email.com' where cust_id='10000000001';
    27.delete from customers where cust_id='11101';
    28.create table products
    {
     prod_id  char(10)  not null,
     vend_id  char(10)  not null,
     prod_name char(254) not null,
     prod_price decimal(8,2) not null,
     prod_desc varchar(100) null
    };
    29.alter products drop clumn prod_desc;
    30.delete table products;
    31.create view vendorlocation as select rtrim(vend_name)+'('+rtrim(vend_country)+')' as vend_title from vendors; 创建视图,并参见格式 vend_title
    32.create view customerEmailList as select cust_id,cust_name,cust_email from customers where cust_email is not null; 创建个包含 cust_id,cust_name,cust_email 并且email不为空的视图
          select  * from customerEmailList; 查询刚才建立的表内容
    33.begin transaction;
     insert/update/delete ...;
     save transaction startorder;
     insert/ipdate/delete ...;
     if @@error<>0 rollback transaction startorder;
     commit transaction           commit和rollback来进行事务管理
    34.DELARE CustCursor CURSOR
     FOR
     SELECT * FROM Customers
     WHERE cust_email IS NULL
    35.create index prod_name_ind on products(prod_name);
    常见SQL问题
    1. SQL Server存储过程,与触发器的作用,与优缺点
    存储过程就是为了以后使用而保存的一条或多条SQL语句的集合。优点:简化复杂的操作,保证数据的一致性,简化对变动的改动,一定程度提高性能,方便扩展更强大的功能;缺点:不同的DBMS的存储过程的语法有所不同,编写比较复杂,需要更高的技能。
    触发器是特定的存储过程,一般与特定表上的insert,update,delete相关联,在其操作执行之前或之后执行。优点:保证数据一致,对于某个表的变动在其他表上执行活动,进行额外的验证并根据需要汇退所有数据,计算计算列的值或更新时间戳。
    2.标准的SQL与T-SQL的区别?写出4个SQL命令和3个T-SQL命令。
    Transact-SQL 是 Microsoft SQL Server 中对标准 SQL 语言的增强,它是用来让应用程序与 SQL Server 沟通的主要语言。T-SQL 是使用 SQL Server 的核心。与 SQL Server 实例通信的所有应用程序都通过将 Transact-SQL 语句发送到服务器(不考虑应用程序的用户界面)来实现这一点。T-SQL 提供标准 SQL 的 DDL 和 DML 功能,加上延伸的函数、系统内置程序以及程序设计结构(例如 IF 和 WHILE)让程式设计更有弹性。 在 Oracle 数据库中则是 PL/SQL 语言
    3.数据库的第三范式
    第一范式(1NF):在关系模式R中的每一个具体关系r中,如果每个属性值 都是不可再分的最小数据单位,则称R是第一范式的关系。
    第二范式(2NF):如果关系模式R(U,F)中的所有非主属性都完全依赖于任意一个候选关键字,则称关系R 是属于第二范式的。例:如S1(SNO,SNAME,DNO,DNAME,LOCATION) 各属性分别代表学号,
    姓名,所在系,系名称,系地址。关键字SNO决定各个属性。由于是单个关键字,没有部分依赖的问题,肯定是2NF。
    1NF:一个table中的列是不可再分的(即列的原子性)
    2NF:一个table中的行是可以唯一标示的,(即table中的行是不可以有重复的)
    3NF:一个table中列不依赖以另一个table中的非主键的列。举个例子吧:有一个部门的table,我们叫它tbl_department, 它有这么几列(dept_id(pk),dept_name,dept_memo...) 有一个员工table,我们叫它tbl_employee,在这个table中有一列dept_id(fk)描述关于部门的信息,若tbl_employee要满足3NF,则在tbl_employee中就不得再有除dept_id列的其它有关部门信息的列!
    5NF:将一个table尽可能的分割成小的块,以排除在table中所有冗余的数据
    4.数据库表user pk ID int Name (char) Age(int) Sex(bit)
      (1) sex=0,age=20的name降序
      (2) 当sex=1时,age+1
      (3) 删除所有奇数据
      (4) 统计age>20的个数
      (5) 年龄最大的人的名字
    (1).Select user_ID,user_name from users where user_sex=0 and user_age=20 order by user_name;
    (2).Update users set user_age=user_age+1 where user_sex=1;
    (3).Delete from users where user_id ???
    (4).Select count(*) as num_age from users where user_age>20;
    (5).Select user_name from users where user_age=MAX(user_age);
    5.什么是基本表?什么是视图?两者的区别和联系是什么?
    表示数据库最重要的容器,存储各类数据。视图是虚拟的表。只包含使用时动态检索数据的查询。视图可以嵌套,不能索引
    6.所有的视图是否都可以更新?为什么?
    理论上不能,只能察看
    视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
    但在Oral数据库里有一种视图可以操作
    好像叫“实例化视图”
    7.ASCII和Unicode有什么区别?
    Unicode是2000以上系统,多平台交流就使用Unicode,ascii是98以前系统的编码方式,单字节编码方式
    8.什么是mvc模式
    MVC(Model/View/Controller)模式是国外用得比较多的一种设计模式,好象最早是在Smaltalk中出现。MVC包括三类对象。Model是应用对象,View是它在屏幕上的表示,Controller定义用户界面对用户输入的响应方式。
    模型-视图-控制器(MVC)是80年代Smalltalk-80出现的一种软件设计模式,现在已经被广泛的使用。

     

  • [总结]性能测试

    2008-04-29 11:41:00

        从事软件测试快1年了,各方面的书籍和知识也看了不少,实践却不是很多,虽然学了不少非测试的知识,对软件工程也算有了比较清晰的认识,但对于把测试作为主要学习对象的我来说。测试上的技术还远远不够,测试工具的使用有待进一步的加强。所以,这里也把一些知识总结一下,方便自己以后查询和复习。

    1.介绍

    软件性能:是一种指标,是参考一定标准的表现,表明软件系统或构件对于其及时性要求的符合程度,即在相应的硬件和软件环境下,该软件系统应该达到的一个水平。另外,性能是一种特性,可以用时间和空间来进行度量。

    3种角度看性能:(1)用户角度:直观印象,主要是从响应时间来看;(2)管理员角度:建立在响应时间基础上,要考虑系统状态如系统资源的利用率,系统的扩展性和系统的稳定性;(3)开发人员:主要从系统架构,数据库设计,代码的优化来看待。

    2.主要关键词

    响应时间:对请求作出响应所需要的时间。web的普遍标准是2/5/10秒,即2秒以内的客户响应被认为是“非常好非常吸引人”的,5秒内是“比较不错”的,10秒是能接受的上限。但是响应时间具有相对性,如:一个月才进行一次的操作,20分钟是一个可以接受的等待时间。即:具体环境具体判断。

    用户并发数:主要取决于服务端和客户端的性能。对服务端来说,每个用户和服务断都是离散的,用比较形象的话来说,就是一群小孩对着一堵墙踢球,每个小孩都有一个球,具体多少个小孩,每个小孩每次对着墙踢球的时间是不确定的或有一定规律的。而墙能承受多少小孩踢球而不跨掉,便是一个用户并发数的问题。而对客户端来说,每个小孩踢球的时间都是根据自己的实际情况来决定的,即根据用户实际的业务场景来决定的。所以,系统的服务端能承受的最大并发访问数主要取决于并发用户数和业务场景,一般可以通过对服务器日志的分析可以得到。                                                                                 并发数确定的理论公式:C=nL/T (C是平均的并发用户数,n是login session“用户从登陆系统到退出系统的时间段”,T是考察的时间段即用户可能使用系统的总时间段)C^=C+3根号C。

    例如:一OA系统,该系统有200用户,每天大约100人访问系统,一天内用户从登陆系统到退出系统的平均时间是4小时,一天内,用户最多使用8小时。

    那么可以得到C=200*4/8=100     (并发用户数)

              C^=100+3*根号100    (最大用户数)

    吞吐量:单位时间内系统处理的客户请求的数量,主要体现软件系统的性能承载能力。

    吞吐量的单位不定,可以是:请求数/秒,人数/天,业务数/小时……对于web系统来说,常用的是请求数(点击数)/秒或字节数/秒来体现

    计算公式:F=N*R/T

    F代表吞吐量,N代表Virtuae User的个数,R代表每个用户的请求数,T代表性能测试的时间

    可以看到上列公式在图表里显示理论上是一根平滑的斜线,理论上随着用户数的请求数增加,时间也跟着增加,如果实际测试中。系统的性能出问题时,即用户数增加到一定数量,系统不能及时处理,此时,图表表现出来就会发生变化。

    一般来说,2个不同的系统可能具有不同的用户数和用户使用模式,但如果具有基本一致的吞吐量,则可以说,他们具有基本相同的平均处理能力。

    性能计数器(Counter)是描述服务器或操作系统性能的一些数据指标。例如,对windows操作系统来说,使用内存数,进程时间等都是常见的计数器。

    思考时间:指用户在进行操作时,每个请求之间的间隔时间。

    待续。。。

  • QTP学习笔记

    2008-04-01 11:11:27

    2008.4.1

    下面是今天上午录制的一个脚本,然后进行了少量编写:

    Dim iStatus
    Browser("XXX").Page("XXX").WebEdit("txt_user").Set DataTable("username", dtGlobalSheet)
    Browser("XXX").Page("XXX").WebEdit("txt_Password").SetSecure DataTable("password", dtGlobalSheet)
    Browser("XXX").Page("XXX").Image("Btn_Login").Click 25,8
    iStatus = DataTable("status", dtGlobalSheet)
    If iStatus = ""  Then
     Browser("XXX")
    End If
    If iStatus = "用户或密码错误!"    Then
     Browser("XXX").Dialog("Microsoft Internet Explorer").WinButton("确定").Click
         Reporter.ReportEvent micFail, "登录过程", "登录失败."
    End If
    Browser("XXX").Close

    小结:1.录制过程很简单,但要保证脚本全部通过还是有点麻烦,老是出各种各样的小错误。其中一个是datatable的新增,变量iStatus声明后还需在global中增加个属性,在显示栏上双击输入Status。

    2.第2个经验是保证脚本的连贯性,由于qtp脚本执行的不连贯,当出错时需要手工调试,虽然有小工具帮忙进行处理,但是能自己在编脚本里处理最好。录制登陆过程有2种,一种是正确登陆,一种是错误登陆,开始我只录制了正确登陆的情形,结果,因为后面还有错误登陆的情形,结果执行到错误登陆时,没法继续进行下去。于是我录制了错误登陆的脚本,把其中的提示点掉的代码复制到了end if的后面去: Browser("XXX").Dialog("Microsoft Internet Explorer").WinButton("确定").Click。最后顺利自动执行完所有脚本。

    3.函数:Reporter.ReportEvent EventStatus, ReportStepName, Details [, in]

    主要功能:Reports an event to the test results.
    EventStatus:事件情形,主要4种 micPass;micFail;micDone;micWarning

    ReportStepName:报告中的步骤名称

    Details:具体细节

    示例:Reporter.ReportEvent micFail, "Custom Step", "The user-defined step failed."

    4.编制脚本2种方式:一是视图模式,编写形象化,但效率低;一是专家模式,编写抽象化,但效率高。

    “高手”大概就是能熟练的用专家模式快速编写脚本吧!

    2008.4.2

    今天主要阅读了QTP专区的部分精华帖,总结如下:

    1.录制带有ActiveX插件的WEB系统,回放第一次没问题,第二次就有问题的解决方案。这个问题以前遇到过,解决方法: (1)延迟可用WAIT X(X单位是秒)(2)可以安装插件添加新的浏览器
              SystemUtil.Run "file” "params" "dir" "op'' "mode"(3)依次点击 Tools ---> Options... ----> Active Screen ,  然后点开 Advanced.. 按钮,  选中 Load ActiveX  controls (就是前面出现 对号); 同时把  Run scrīpts 的选项改为  Disabled 就可以了!
    2.校验码的解决方案:(1)暂时屏蔽校验码;(2)跟程序员拿程序,然后自己在脚本里面写FUCNTION

    3.QTP无法录制某些控件的操作的解决方法

    4.QTP调用外部动态库的方法

    主要用到的函数是:Extern.declare(RetType,MethodName,LibName,Alias[[,ArgType(s)],...])
    例子:

    Extern.Declare micHwnd,"FindWindow","user32.dll","FindWindowA",micString,micString

    其中VC中的INT在QTP中用micInteger表示,char*在QTP中用micString表示。

    启示:QTP这种调用外部动态库的机制保证了QTP的扩展性。

    5.什么是Keyword-Driven Testing

    一般开发的前一步是设计,通常会做出用户界面 (UI)来给客户看,然后确认后就可以展开测试工作。自动化测试就可以从模型确认后这一步开始。通过Object Repository可以先于开发一步建立测试脚本。

    启示:测试人员可以更早就开始建立测试脚本,测试先行。不过实际运作中必须保证需求和设计完全匹配,且变化不大的情况下。否则实际意义不大。QTP还是做回归测试更好一些。

    2008.4.3

    1.实际录制了脚本,发现对于日期类控件,采用低层次录制比较合适,如此类控件

    而对于richtext类控件,则使用virtual object比较合适。

    2008.4.8

    今天复习了oldsidney的QTP学习手册,下面是做的笔记。

    1.浏览器设置:IE工具-内容-个人信息-“自动完成”上的"表单上的使用者名称合密码"取消;
    2.Expert View的分析:
    Browser("Welcome: Mercury Tours").Page("Welcome: Mercury Tours").WebEdit("userName").Set

    "jojo"
    一般几个部分构成:第一层:Browser(" ")表示的是打开的网站
        第二层:Page(" ")表示的是打开的网页
        第三层:控件类型("名称")
        第四层:操作方式("操作内容")
    3.检查点:标准/图片/表格/网页/文字/图像/数据库/accessiibility/XML检查点
    (1)标准检查点:主要时检查控件。不仅仅是检查文字,还可以检查该控件的属性等发生变化没,比如

    同样是text,如果源代码里控件名字变化了,那么最后检查的结果仍然是错误的。而对属性的调整不能在

    专家模式里调整。
    (2)网页检查点:包括检查链接数与网页上的图片以及坏链接的检查,还有加载时间等。不过检查时间

    比较长,做功能测试时一般不要写进去,可单独检查时使用。
    (3)文字检查点:2种,一种固定的,一种活动的。活动的即关联前面选择的文字,如飞机订票里,飞行

    起点选择的是哪里参数化,后面检查也关联此参数化的字典。
    (4)表格检查点:同标准检查见一样,只需检查必要的字段,无需检查所有属性。
    4.动态值的检查
    对于如飞机票价格的检查一般是动态的值,因为随着飞行起点和终点的变化,飞机票的价格也随之变化。

    所以要先建立飞机票价格的输出值,再进行关联。主要是用Insert Output把动态值先建立起来,然后在

    后检查时再关联起来。
    5.万用字符表示法
    象正则表达式一样,通过特殊字符如. 8 ^ []等来组合搜索。常见的如日期格式:[0-1][0-9]/[0-3][0-

    9]/200[0-9],但是用这个来匹配4/8/2008的时候却不行,改成[0-9]/[0-9]/200[0-9]就可以了。看来匹

    配非常严格,要把正则表达式学好。
    6.脚本切动作
    有点象分类,把不同业务切出来单独做一起。把一个Action切成2个Action。步骤:Step>Split Action
    然后再把动作设置为可再使用动作:选择[Action Properties]后,点选【Reusable action】,然后点下

    OK。

    2008.4.9
    1.reporter.Filter='0/1/2/3'[]
    Reporter.filter分为四个属性:
                   0或者rfenableall 所有的报告都显示在test result中
                   1或者enableerrorandwarning错误和警告信息显示在test result中
                   2或者rfenableerroronly只把错误显示在test result中
                   3或者rfdisableall不在test result中显示任何信息

    2.关于getRoporperty ,getTopropertise, getToproperty
    书写格式: object.GetROProperty (Property) object.GetTOProperties
       object.GetTOProperty (Property)
    其中property为属性的名称
    例:
    下面的例子取出radio group的项目数,保存在numoflterms中
    NumOfItems = Browser("Mercury Tours").Page("Find Flights").WebRadioGroup("seat

    pref").GetROProperty("Items Count")
    如其中的index这项,他的值在录制的过程中是9,那么使用getToproperty返回的值就是9.
    index这个值做了参数化,发现index值不为9了,变为了10,使用getRoporperty返回的值就为10.

    2008.4.24

    1.在QTP中没有提供用于直接操作注册表的测试对象,但是利用Windows脚本的Shell对象,可以对注册表进行增删改等操作,例如下面的脚本:

    Dim WshShell, bKey

    ' 创建Shell对象
    Set WshShell = CreateObject("Wscrīpt.Shell")

    ' 使用Shell对象来读取注册表
    bKey = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox 1.5\Extensions\Plugins")
    Msgbox bKey

    ' 修改注册表
    WshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox 1.5\Extensions\Plugins", "D:\Program Files\Mozilla Firefox\Plugins", "REG_SZ"

    ' 删除注册表
    WshShell.RegDelete "HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox 1.5\Extensions\Plugins"

    ' 修改或写入注册表
    WshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox 1.5\Extensions\Plugins", "C:\Program Files\Mozilla Firefox\Plugins", "REG_SZ"

    2008.4.29

    1.QTP中的descrīptive programming

    详细参见:http://www.51testing.com/html/51/133.html

    摘要:

        通常情况下,当在录制一个操作时,QTP会将被操作对象加入到对象库里(Object Repository)。一旦对象存在于对象库里,我们就可以在专家视图里通过添加相关的对象方法来对该对象进行操作。我们可以通过引用层次型对象库里的对象描述(Object Descrīption)来添加相应的方法。
        然而对象库里如果没有这些对象,我们也无从引用。因此我们必须采用其他的技术来完成这类操作,这也就是我们需要讲解的Descrīptive Programming。
        为了满足上面提到的动态对象的处理问题,QTP允许用户通过将对象属性编码到测试脚本里来动态识别对象,这就是我们通常意义下称为的Descrīptive Programming。通过这种方式,我们可以指示QTP不通过引用对象库和对象名来对实际对象进行操作。具体操作中,我们只需要为QTP提供对象的一组属性和值,这样QTP就可以来识别相应的对象并对其进行操作。这相当于,告诉QTP要识别对象的一些关键特征,根据这些特征QTP就可以一一匹配然后识别出来这个对象。
        先看一个简单一点的情况,假设只有且仅有一个Yahoo主页面:那么我们可以用下面的方法来
    Window("Text:=Yahoo! - Microsoft Internet Explorer").Close
    我们可以看到语句里我们要查找的对象是Window窗口标题为“Yahoo! - Microsoft Internet Explorer”,然后把它关闭,但是上面的语句仅仅适合前面提到的条件“只有且仅有一个Yahoo主页面。

     

     

     

     

  • 测试空间开通

    2007-06-22 17:06:58

    测试空间开通,大家有空来访问!
Open Toolbar