记录阿里巴巴QA架构组成长点滴。2008年关键词为效率,技术,影响力!QA/测试架构师定义:开发和设计测试框架测试库;纵横全局的考虑产品的功能,设计复杂的测试系统;负责研发某一项特定的测试技术;为公司考虑如何提高测试效率。领导公司测试技术的发展和测试策略上的方向,关注整个公司的测试部门的问题,前瞻性的考虑未来的版本的测试策略和技术。测试架构师计划/设计测试平台,关注着产品的测试过程,提供咨询服务,影响到公司内的测试机构测试社区,以及开发机构等,对产品各个方面施加深远而正确的影响,最终提高整体软件质量。

发布新日志

  • [论坛] 关于jmeter源码编译的问题

    2008-07-28 15:23:43

    by jack

    有人问我,从apache Jakarta上下载的jmeter源码包打开后编译通不过。源码包是在http://jakarta.apache.org/site/downloads/downloads_jmeter.cgi上下在的

    这个问题在我刚开始做jmeter扩展的时候也遇到过。

    ant install编译错误截屏:

    提示很清楚,三方库缺失;只是可能不知道三方库哪里有。不用多想,binary包里找,肯定有,不然咋运行。

    解决方法很简单:从jmeter的binary包的lib目录里把三方库的jar包拷贝过来,再编译就可以了

    另外源码包里是没有jmeter的执行脚本和配置文件的,也要拷贝过来才能执行,在bin目录下

    注意:jmeter编译生成的bin目录下ApacheJMeter.jar和lib目录下的ext目录中的jar包以及bshclient.jar、jorphan.jar包,不要删除或覆盖。

    其实更简单的办法是直接从svn上拿代码,只读主干url是:

    http://svn.apache.org/repos/asf/jakarta/jmeter/trunk/

    拿下来的很完整,直接ant编译就可以了

  • OpenAPI 测试畅想

    2008-07-28 12:51:03

    淘宝网新近开放了TOP平台,阿里软件的同事们根据平台测试的实践编写了《互联网单元测试及实践》,阿里巴巴技术部也在实现Open API给第三方开发商的项目,国内互联网公司Open API开放状况参考http://fairyfish.net/2008/07/16/chinese- open-api/。本月程序员杂志Open API大篇幅占据版面。chinaunix专门开辟openapi专栏 http://bbs.chinaunix.net/forum-137-1.html
       这些信息都表明,OPEN API是增强网站个性化、定制化的方式之一,将成为主流网站的一个趋势。

    一种新的研发模式也必然对测试带来一定的影响。对于开放API的平台商而言,Open API本身的测试也会有自己个性化的特征。

    (1) 安全测试要求更高。由于涉及关键数据众多,在用户输入验证、输出展现、安全交互、权限系统设计方面的要求更高。防止SQL注入、命令注入、XSS、缓冲区溢出、整数溢出等主要安全问题围绕整个软件生命周期。

    (2) 流量、资源消耗、计费等监控粒度更加细致。

       从第三方开发商过来的请求流量设计方面必须足够聪明,做到有效控制DOS攻击。
       
       需要评估审核第三方开发商研发能力,加强对其管理。
       
       API调用需要大量计算资源,有效监控资源变化包括系统级别的资源(如CPU\IO\网路\内存\进程间通信\打开文件描述符、数据库的CRUD等)以及业务级别资源(页面响应时间、资源下载时间等),全方位的监控体系保证网站安全。

    (3) 性能测试的需求更加迫切。
        大规模的应用访问会让系统感受到PV的强烈冲刺。
        一般应用程序关注用户访问模式,Open API更为关注API自身的调用频率。各种性能profile工具将发挥极致威力
              
    (4)非常适合应用单元测试、应用代码覆盖以及做到daily build/test。

       由于提供给第三方开发商使用,其接口必然比较稳定,以及复用程度较高。从成本效益角度衡量,适合单元测试。同时借助代码覆盖率度量工具,增加测试用例。
       由于存在良好的单元测试代码,daily build/test体系建立将让BUG主动跳出来。
         
    (5)demo应用程序以及API函数说明书。
       
       demo程序以及API函数说明书同样需要测试。第三方开发商借助这些demo应用程序以及API函数说明书才能有效发挥开放API的威力,由于分处两地,为了减少沟通成本,demo程序以及说明书应该相当详备。

    (6) 部署模式测试。

       API部署范围不应局限于在PC/PC Serer上, Open API也应该部署在流行的google application engine平台以及Amazon AWS上进行测试,以满足不同层次的开发商需求。

    (7)支持的开发语言调用测试

       针对Open API声称支持的各种开发语言对应的API都做测试。每种语言的数据类型都有差异,这个微小差异有时会导致致命的问题。
      
    (8)架构设计文档本身的测试,核心代码尽早执行性能测试
       
        应该有资深的架构师尽早介入,评审关键应用的设计文档,在早期介入减少设计失误。

        核心代码尽早执行性能测试,避免后期大规模修改。
       
      欢迎各位朋友拍砖。
  • 搭建Discuz论坛以及mediawiki平台过程

    2008-07-22 21:12:50

    第1章        概述
    尝试搭建一个论坛以及wiki平台。

    软件版本分别是:

    httpd-2.2.6.tar.gz
    mysql-5.0.51a-linux-i686_2.tar.gz
    php-5.2.6.tar.gz
    Discuz!_6.0.0_SC_UTF8.zip
    mediawiki-1.11.1.tar.gz

    不上MemCache模块
    当然论坛也可以采用phpbb,免费的
    系统版本:Linux alitest144 2.6.9-42.ELsmp,gcc version 3.4.6.

    第2章        部署Mysql
    2.1        安装
    groupadd  mysql
    useradd   -g mysql  -d  /home/mysql  mysql
    tar  -zxvf mysql-5.0.51a-linux-i686_2.tar.gz  到/home/mysql下

    默认目录权限修正: (mysql运行时所需的目录)
    mkdir -p /var/lib/mysql
    chown -R mysql:mysql /var/lib/mysql
    mkdir -p /var/run/mysqld
    chown -R mysql:mysql /var/run/mysqld

    建立默认数据库
    cd /home/mysql
    ./scrīpts/mysql_install_db
    chown -R mysql:mysql /var/lib/mysql
    ln -s /var/lib/mysql/mysql.sock  /tmp/

    启动
            bin/safe_mysqld&
           
            注意这里编码格式是默认的utf-8.
    关闭
    mysqladmin -u root  -p  shutdown

    2.2        测试

    安装好后,root密码默认为空
    Mysql  -uroot  -p 进入


    第3章        部署Apache
    3.1        安装
    ./configure   --prefix=/usr/local/apache2    --with-mpm=prefork  --enable-so   
    3.2        测试
    http://10.0.4.144:80/index.html
    第4章        部署PHP
    4.1        安装(这个环节最多问题)
    网上的多篇文档都是有错误的,集中在MYSQL连接上。
    有一文章很好,http://www.blogjava.net/tufanshu/archive/2006/10/20/76389.html
    但php configure时指定的选项不正确。
    mediaWiki需要图形库zlib \ gd2的支持。

    Ldconfig –v |grep mysql
    Ldconfig

    ./configure --prefix=/usr/local/apache2/php5 --with-apxs2=/usr/local/apache2/bin/apxs  --with-mysql=/home/mysql/mysql-5.0.51a-linux-i686 --with-zlib   --with-zlib-dir=/url/local/zlib  --with-libxml-dir=/usr/local/  --with-gd=/usr/local/gd2 --with-jpeg-dir=/usr/local/jpeg6 --with-png-dir=/usr/local/libpng2   --with-config-file-path=/usr/local/apache2/php5/lib  --disable-debug --enable-safe-mode --enable-trans-sid --enable-short-tags --disable-posix --enable-exif --enable-ftp --enable-sockets


    make && make install
    cp /usr/src/php-5.1.6/php.ini-dist   /usr/local/apache2/php5/lib/php.ini


    修改apache 的httpd.conf文件:
    LoadModule php5_module        modules/libphp5.so
    AddType application/x-httpd-php .php
    DirectoryIndex index.html index.php


    另外,为了不显示目录,删除index
    <Directory "/usr/local/apache2//htdocs">
        #
        # Possible values for the Options directive are "None", "All",
        # or any combination of:
        #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
        #
        # Note that "MultiViews" must be named *explicitly* --- "Options All"
        # doesn't give it to you.
        #
        # The Options directive is both complicated and important.  Please see
        # http://httpd.apache.org/docs/2.2/mod/core.html#options
        # for more information.
        #
    Options FollowSymLinks
       
    </Directory>


    部分目录为了保护起来,可以利用认证

    bin/htpasswd  -c passwords wiki  生成密码,然后把下面这段放到httpd.conf
    <Directory /usr/local/apache2/htdocs/portal>
    AuthType Basic
    AuthName "Restricted Files"
    AuthUserFile /usr/local/apache2/passwords
    Require user wiki
    </Directory>


    不必修改php.ini
    4.2        测试PHP引擎
    Index.php放在/usr/local/apache2/htdocs,内容如下:

    <html>
    <head>
            <title>HP Test</title>
            <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    </head>
    <body>
            <h1>HP Test</h1>
            <p>
            <b>An Example of PHP in Action</b><br />
                    <?php echo "The Current Date and Time is: <br>";
                            echo date("g:i A l, F j Y.");?>
            </p>

            <h2>HP Information</h2>
            <p>
                    <?php phpinfo(); ?>
            </p>
    </body>
    </html>

    4.3        测试MYSQL连接
    Connect_mysql.php放在/usr/local/apache2/htdocs,内容:
    <?php
    $link = mysql_connect('localhost', 'qauser', 'qauser');
    if (!$link) {
        die('Could not connect: ' . mysql_error());
    }
    echo 'Connected successfully';
    mysql_close($link);
    ?>


    第5章        部署Discuz
    5.1        安装
    建立MYSQL数据库及用户

    Mysql  -uroot  -p
    Create database  db_aliqakb;
    grant all  privileges    on db_aliqakb.*   to  qauser@'localhost'   identified by 'qauser';
    grant all  privileges    on db_aliqakb.*   to  qauser@'10.0.%'   identified by 'qauser';
    flush privileges;

    在/usr/local/apache2/htdocs 目录下解压

    unzip   -d  discuz  Discuz\!_6.0.0_SC_UTF8.zip

    设置目录权限:
    Cd  /usr/local/apache2/htdocs/discuz/upload
    [root@alitest144 upload]# chmod  777 templates/
    [root@alitest144 upload]# chmod  777  templates/default
    [root@alitest144 upload]# chmod  777  templates/default/*.*
    [root@alitest144 upload]# chmod  777  attachments
    [root@alitest144 upload]# chmod  777  customavatars
    [root@alitest144 upload]# chmod  777  forumdata/
    [root@alitest144 upload]# chmod  777  forumdata/cache/
    [root@alitest144 upload]# chmod  777  forumdata/templates/
    [root@alitest144 upload]# chmod  777  forumdata/threadcaches
    [root@alitest144 upload]# chmod  777  forumdata/logs/
    [root@alitest144 upload]# chmod  666  config.inc.php

    修改config.inc.php内容

            $dbhost = 'localhost';                  // 数据库服务器
            $dbuser = 'qauser';                     // 数据库用户名
            $dbpw = 'qauser';                               // 数据库密码
            $dbname = 'db_aliqakb';                 // 数据库名
            $pconnect = 0;                          // 数据库持久连接 0=关闭, 1=打开

    // [CH] 如您对 cookie 作用范围有特殊要求, 或论坛登录不正常, 请修改下面变量, 否则请保持默认

            $cookiepre = '8AB_';                    // cookie 前缀
            $cookiedomain = '';                     // cookie 作用域
            $cookiepath = '/';                      // cookie 作用路径

    // [CH] 论坛投入使用后不能修改的变量

            $tablepre = 'cdb_';                     // 表名前缀, 同一数据库安装多个论坛请修改此处

    // [CH] 小心修改以下变量, 否则可能导致论坛无法正常使用

            $database = 'mysql';                    // 论坛数据库类型,请勿修改
            $dbcharset = 'utf8';                    // MySQL 字符集, 可选 'gbk', 'big5', 'utf8', 'latin1', 留空为按照论坛字符集设定

            $charset = 'utf-8';                     // 论坛页面默认字符集, 可选 'gbk', 'big5', 'utf-8'


    建立MYSQL数据库及用户
    Mysql  -uroot  -p
    Create database  db_aliqakb;
    grant all  privileges    on db_aliqakb.*   to  qauser@'localhost'   identified by 'qauser';
    grant all  privileges    on db_aliqakb.*   to  qauser@'10.0.%'   identified by 'qauser';
    flush privileges;


    网页上执行初始化安装动作

    http://10.0.4.144/discuz/upload/install.php

    中间某一步检查有错误的话导致无法成功导入数据


    管理员权限初始化设置论坛
    http://10.0.4.144/discuz/upload/
    比如admin/

    5.2        测试
    http://10.0.4.144/discuz/upload/

    第6章        部署mediaWiki
    6.1        安装

    建立Mysql数据库以及用户权限
    Create database wikidb;
    grant all  privileges    on wikidb.*   to  wikiuser@'localhost'   identified by 'wikiuser';
    grant all  privileges    on wikidb.*   to  wikiuser@'10.0.%'   identified by 'wikiuser';
    flush privileges;
    修改php5/lib/php.ini保存session信息
    session.save_path = "/tmp"
    解压并置执行权限

    Tar  -zxvf  mediawiki-1.11.1.tar.gz解压在 /usr/local/apache2/htdocs/mediawiki

    Chmod 777  config

    执行安装
    http://10.0.4.144/mediawiki/config/index.php




    数据库帐号同上。

    Siteconfig 选择language=zh_cn 中国大陆

    以及更改管理员账号、密码。

    提示成功后,

    Cd  /usr/local/apache2/htdocs/mediawiki/config
    Mv mv LocalSettings.php ..
    6.2        配置文件上传权限

    Vi   /usr/local/apache2/htdocs/mediawiki/LocalSettings.php
    ## To enable image uploads, make sure the 'images' directory
    ## is writable, then set this to true:
    $wgEnableUploads       = true;


    建立目录
    /usr/local/apache2/htdocs/mediawiki/images/public
    Chmod 777 /usr/local/apache2/htdocs/mediawiki/images



    http://10.0.4.144/mediawiki/index.php/Special:Upload
    可以支持jpg,png格式文件。
    6.3        更改首页信息
    更改/usr/local/apache2/htdocs/mediawiki/languages/messages/MessagesZh_cn.php内容

    6.4        URL编码
    默认是utf-8编码
    6.5        测试
    http://10.0.4.144/mediawiki/index.php
  • XPath在watir自动化测试中的应用

    2008-07-22 19:17:23

    1.1.   Xpath是什么?

    1, 为什么要用xpath

    watir支持对象属性操作上看,唯一较多document对象支持的识别属性,一个是ID 一个是xpath属性。

    从现在网站代码来看,很多对象是没有ID的,如果此时让开发为了自动化, 加这样的ID

    可谓是工程浩瀚。。。, 由下表,可得出结论:

     http://wiki.openqa.org/display/WTR/Methods+Supported+by+Element

    xpath表达式,是watir 强有力的标识web对象的方法。其内部原理是把页面HTML 转换成为

    XHTML,然后REXML来解析它,以致于可以用xpath表达式语言在文档结构中作查询定位。

    另外,用xpath可以让watir开发脚本,更简炼。

    最后,xpath可以操作html中扩展tag, watir不支持的tag操作

     

           基于以上三种原因,我们需要研究xpath技术。。。

     

    2, 工具

     Tutorial:

    http://www.w3schools.com/xpath/default.asp

     

    view xpath:

    安装firefox: http://www.mozillaonline.com/

    https://addons.mozilla.org/zh-CN/firefox/addon/1192?id=1192

    安装xpath checker: https://addons.mozilla.org/zh-CN/firefox/addon/1095?id=1095

     

    3, 包安装

    已上传到SVN

        1.2.  Xpath格式与语法

     总结一下,xpath查询需要搞清楚,以下三种语法

     1, Select Nodes (选择结点)

     2, Predicates(断言)

     3, 模糊与条件表达

     具体格式请参照: http://www.w3schools.com/xpath/xpath_syntax.asp

     

    注意:Unfortunately, there are different ways of dealing with XML and XPath in Internet Explorer based browsers and other browsers (like Mozilla based browsers).

     

    1.3.  应用场景

    1, watir 不支持的tag, 可以用element_by_xpath方法

    如:

    <html>

      <body>

        <map name="chart">

          <area shape="poly" coords="150,16,159,17,168,20,175,25,182,32,150,56,150,56" >

          <area shape="poly" coords="182,32,188,43,190,56,150,56,150,56" href="PieChart.html?category=Critical&pieIndex=0">  

        </map>

      </body>

    </html>

    脚本实现如下:

     

    # get the underlying object and execute click method

    ie.element_by_xpath("//area[contains(@href , 'PieChart.html')]/").click

      2, 使用xpath在标准HTML对象属性识别上

      <table>

      <tr>

        <td><img src="1.jpg">First Image</td>

      </tr>

    </table>

    <table>

      <tr>

        <td><img src="2.jpg">Second Image</td>

      </tr>

    </table>

    <table>

      <tr>

        <td><img src="3.jpg">Third Image</td>

      </tr>

    </table>

     

    若不用xpath, 实现只点击3.jpg的方法:

     

    ie.tables.each do |t|                      # since you don't have ID's, look at every table

      for i in 1..t.row_count                  # for every row in this table

        t[i].each do |cell|                    # for every column in this row, look at its contents

          if cell.image(:src, /3.jpg/).exists? # if true, this is your cell

            puts cell.text

          end

        end

      end

    end

     

     但是用xpath就是非常简练:

     

    ie.cell(:xpath, "//img[@src='3.jpg']/").click()

     

     

    3, tag中含有tag不识别的属性, IE没有报错

      

     <select foo="bar"> <option value="1">1< /option> < /select>

     如上对象是一个下拉框, 但若foo="bar"select tag不支持的,

    基于现有watir版本,不提供识别此对象的方法, xpath也可以访问到

    如:element = browser.select(:xpath, "//select[@foo='bar']")

    watir API来看,很多对象都支持xpath方法, 后面我也会不断补充应用场景

     

    1.4.  Xpath其它内置方法

     

    <<请参照watir 技术集锦>>

     

  • AUTOIT在watir自动化测试中的应用

    2008-07-22 19:15:06

    签于评估的目标,1 异常对象识别与操作 2, 框架移植.

    下面文档,简单罗列了我在技术评估时,经过自己学习,加工整理,总结的文档。由于时间急促不可能涉及方方面面,但常用基础的可以先从下面开始着手。。。,

     

    如果期望成为autoIT高手,最好还是参看其help文档,国外有专门招聘auitit做自动化的, 国内很少。

     

    1.      AUTOIT

    1.1.      AutoIT是什么?

    AutoIT是一款自由软件, 现在最新版本是autoit v3.

    从此介绍上看,其诞生目的就是为了解决某些语言,像 vbs and sendkeys, 在操作windows gui时不稳定,或无法实现的技术提供解决方案。其主要功能是用来模拟键盘和鼠标来进行windows 控件操作来实现操作自动化的目的。 与我们要做的自动化相关,具体有如下特征,

    A, 使用类basic 语法脚本

    B, 模拟键盘和鼠标操作

    C, 与标准windows控件交互

    D, 生成GUI

    E, com支持

    F, 正则表达式支持

    G, 调用外部dll windows api

    H, 独立装载,编译,运行,可打包成可执行的exe

     

    联系我们做自动化,脱离与iedocument对象的 windows对象,watir就力不从心,如:上传,下载,JS写的控件/第三方非web控件 alerts window,  JS pop up window, 几乎所有的非web, windows 弹出框都是。

     

    从了解watir底层代码,其解决windows对象识别与操作没有用其它技术,就是采用autoit

    最后,从搞自动化技术角度来看,autoit是一样非常强大的利器,不使用它非常遗憾。

    因为只要在win OS上操作,不管做web、还是windows自动化都需要它帮助, 在操作的稳定性

    与可能性上autoIT提供了相对较强的解决方案。

      

    1.2.  AutoIT安装与部署

     

    A, 下载:

    http://www.autoitscrīpt.com/autoit3/downloads.shtml

     

    b, 注册:

    先下载安装, 再找到AutoItX3.dll进行手工注册一下,

    注意:watir 1.5. 6在安装时,其安装目录里提供的AutoItX3.dll似乎不能正常工作

     regsvr32 D:\AutoIt3\AutoItX\AutoItX3.dll

     

    c, 讨论:

    http://www.autoitscrīpt.com/forum/index.php?

     

    1.3.  AutoIT SPY工具

     

    A, autoIT v3 window info 工具

    非常类似QTP object spy工具, 拖拽到要识别的windows control 对象上,

    会立即显示Title, class, Advanced(class), ID, ClassnameNN, ControlClick Coords:  

    Text等字段。这些属性对于操作windows对象,起到很好的标识作用。供autoiT中内置方法提供操作句柄 与操作引用.

     

    1.4.      AutoIT scrīpt

     

    Auto IT提供一整套的脚本语法,与程序开发规范.

    提供特定的数据类型,操作符与保留字, 条件语句与函数、子程序结构。

    其采用分号; 作为脚本注释。

     另外也提供基于命令行的 编译与运行环境, 不过可以用其自带IDE: sciTE, 缺点是

    不能debug.

     

    下面的操作方法, 将会在watir中比较常用到,

     

    1, MsgBox(0, "My First scrīpt!", "Hello World!")

    2, TestFunc()

    Func TestFunc()
        MsgBox(0, "My Second scrīpt!", "Hello from the functions!")
    EndFunc

     

    3, WinWaitActive ( "title", ["text"], [timeout] )/ WinClose("[ACTIVE]", "")

    4, ControlSend("Untitled - Notepad", "", "Edit1", "This is some text") /

    ControlClick("My Window", "", "[ID:254]")

    5, ControlFocus "title", "text", "controlID"

     6, 正则 StringRegExp( "test", "pattern" [, flag ] )

     7, Send "keys" [, flag]/ Sleep delay

     

     

    1.5.      应用场景

     

    更多的example请参考:autoit3\examples\helpfile\*.*

     1, 下载文件

     

    def save_file(filepath)

        ai = WIN32OLE.new("AutoItX3.Control")

        ai.WinWait("文件下载", "", 5)

        ai.ControlFocus("文件下载", "", "保存(&S)")

        sleep 1

        ai.ControlClick("文件下载", "", "保存(&S)", "left")

        ai.WinWait("另存为", "", 5)

        sleep 1

        ai.ControlSend("另存为", "", "Edit1",filepath)

        ai.ControlClick("另存为", "", "保存(&S)", "left")

        ai.WinWait("下载完毕", "", 5)

        ai.ControlClick("下载完毕", "", "关闭")

      end

    ie.span(:text, "导出Excel").click_no_wait

    save_file("C:\\abc.xls")

     

    有没有看到,每个autoit方法在call的时候都传入一些参数?

    我怎么知道的呢?都是从autoit sby工具获得的。。。

     

    2, 点击弹出框

     

    def check_for_popups

        autoit = WIN32OLE.new('AutoItX3.Control')

        #

        

        # Do forever - assumes popups could occur anywhere/anytime in your application.

        loop do

            # Look for window with given title. Give up after 1 second.

           

            ret = autoit.WinWait('Microsoft Internet Explorer', '', 1)

            #ret = WinActivate("Microsoft Internet Explorer", "")

            autoit.ControlClick("Microsoft Internet Explorer", "", "[CLASS:Button; INSTANCE:1]", 2)

            #强行点击,以使其获得focus

            puts(ret)

            #

            # If window found, send appropriate keystroke (e.g. {enter}, {Y}, {N}).

           

            if (ret==1) then autoit.Send("{Enter}") end

           

            #

            # Take a rest to avoid chewing up cycles and give another thread a go.

            # Then resume the loop.

            sleep(3)

        end

      end

     

     

    ie.button(:name, "btnUpload").click_no_wait

    sleep(20)

     

    $popup = Thread.new { check_for_popups }  # start popup handler

     

    at_exit { Thread.kill($popup) }

     

    还有很多例子,可以以此类推, 只要第1: 激活,第2步:获得焦点,第3步:就可以sendkey了。

    是不是已经搞定99.999%的问题了?

     

    注意:在watir中使用autoIT, 别忘记 require 'win32ole'

  • 安全测试之windows后门程序监控--iceSword

    2008-07-15 11:57:31

    现在的系统级后门功能越来越强,一般都可轻而易举地隐藏进程、端口、注册表、文件信息,一般的工具根本无法发现这些“幕后黑手”,iceSword是一款基于win内核技术的软件,可以轻易的查看到所有的后门程序。

    绿色软件,免费,如下图:

  • 如何引入代码覆盖率度量提高测试质量

    2008-07-12 15:48:57

    by liangjz

    我们面临的困境
    1) 开发编写的单元测试代码可信度
    2) 功能测试或者自动化测试效果可信度

    为了提高测试过程的质量,是一个复杂系统过程。国外好些年前就引入代码覆盖率工具,比如
    EMMA/Clover。
    呵呵,据了解ebay中国的开发采用EclEmma。

    经过初步评估,针对java语言的EMMA 和针对 linux+ c/c++ +gcc的gcov/lcov都只能做到语句覆盖、函

    数覆盖、类覆盖。对于路径覆盖、条件覆盖等无法做。要做到更加精细,可以考虑结合Jester。

    代码覆盖率工具最让人震撼的是,无须单元测试代码,可以清楚看到执行过/未执行过的代码行,以及由

    宏观到微观的度量结果。另外引入代码覆盖率工具,无须修改代码,成本极低。

    这个结果对于开发而言,可以增加自己负责的模块的单元测试代码,或者去除死代码。
    对于测试而言,可以增加测试用例提高覆盖率,提高测试结果的信心度。

    尽管代码覆盖率工具有这样或者那样的不足,也极难做到100%覆盖,但综合权衡,引入工具还是有积极

    的意义。

    推广代码覆盖率的规划:

    1) 选取一个小型WEB应用代码覆盖工具,结果供测试工程师,分析代码覆盖率效益
    2) 大型项目应用代码覆盖工具
    3) 在研发部门推广EclEmma插件 和gcov/lcov
    4) 经过一段时间实践,在开发提交代码给测试时,要求一起提交代码覆盖率源文件。

    难点:

    1) 测试工程师面对未覆盖的代码行,要有阅读代码能力呼应到业务操作,以有针对性增加测试用例
    1) 加入代码覆盖率结果,意味对上游输出把握更加严格,要求研发部门经理和开发的意识转变以及实质性支持

    欢迎这方面有实践的朋友多提建议,谢谢

     

  • 采用EMMA对JMeter执行代码覆盖率分析

    2008-07-12 12:33:23

    by liangjz

    emma度量代码覆盖率不需要额外编写单元测试代码。
    支持JAVA GUI、JAVA CONSOLE、JAVA APP SERVER。

    一 安装与配置
    EMMA支持jdk1.2 或以上。

    下载: http://emma.sourceforge.net/
    在我的电脑里面设置CLASSPATH加入emma.jar.
    显示:
    E:\jakarta-jmeter-2.3.1\bin>echo %CLASSPATH%
    E:\alibaba\tools\emma-stable-2.1-lib\emma.jar;.


    二 收集应用的元信息

    这一步必须有.class文件或者包含.class文件的jar包。
    而且必须在应用执行的目录下进行(非源代码的路径),否则第四步收集信息时出现异常"emma ctl:

    coverage.get: RPC failure while executing [coverage.get]
    Exception in thread "main" com.vladium.emma.EMMARuntimeException: coverage.get:
    RPC failure while executing [coverage.get]
            at com.vladium.emma.ctl.CtlProcessor._run(CtlProcessor.java:242)"

     

    收集元信息(会改写ApacheJmeter.jar内容)
    java emma instr -m overwrite   -cp  ApacheJMeter.jar  -out coverage.em

    正常时当前目录生成coverage.em。

    三 执行应用程序

    jmeter.bat导致异常
    Exception in thread "main" java.lang.NoClassDefFoundError: com/vladium/emma/rt/R
    T
            at org.apache.jmeter.NewDriver.$VRi(NewDriver.java)
            at org.apache.jmeter.NewDriver.<clinit>(NewDriver.java)
    errorlevel=1

    分析确认由于java加载ApacheJMeter.jar包时ClassLoader顺序非预期,通过-

    Xbootclasspath/p:E:\alibaba\tools\emma-stable-2.1-lib\emma.jar  强制优先加载emma.jar。

    故修改jmeter.bat为
    %JM_START% %JM_LAUNCH%  -Xbootclasspath/p:E:\alibaba\tools\emma-stable-2.1-lib\emma.jar  %

    JVM_ARGS% %ARGS%   -jar "%JMETER_BIN%ApacheJMeter.jar" %JMETER_CMD_LINE_ARGS%

    再次启动jmeter.bat,出现提示

    EMMA: collecting runtime coverage data ...
    EMMA: runtime controller started on port [47653]

    netstat 检查47653端口处于Listening状态。

    在JMeter界面上操作。后台会记录代码执行状况

    四 收集代码行、函数、类覆盖信息

    在Jmeter不退出的情况下,执行
    java -cp %CLASSPATH%  emma ctl -connect localhost:47653 -command coverage.get,coverage.ec

    或者Jmeter正常退出的情况下,也会主动收集信息存放在默认的coverage.ec。

    五  生成报告

    java -cp %CLASSPATH%   emma report -r html -in  coverage.em,coverage.ec -

    Dreport.html.out.file=coverage.html -Dreport.metrics=class:50

  • 前端web分析工具pagetest核心技术

    2008-06-02 00:27:20

    pagetest分析web 页面解析时间。PageTest为AOL 开放源码的,
    可从http://pagetest.wiki.sourceforge.net/ 下载。

    作用同ibm pagedetailer ,yahoo yslow。

    pagetest用visual .net工程。

    核心技术
    1 Winsock2 SPI
    参考
    http://www.microsoft.com/msj/0599/LayeredService/LayeredService.aspx
    http://www.vckbase.com/document/viewdoc/?id=643
    或者windows 网络编程第14章winsock2服务提供者接口
    如加载 SPI
    wspStartup = new CAPIHook("mswsock.dll", "WSPStartup", (PROC)::WSPStartup_Hook, TRUE);  
       nspStartup = new CAPIHook("mswsock.dll", "NSPStartup", (PROC)::NSPStartup_Hook, TRUE); 

    主要函数如:
    NSPLookupServiceBegin;NSPLookupServiceNext;NSPLookupServiceEnd
    WSPSocket,WSPBind

    2 WinInet

    internetOpen

    3  IE插件技术

    class ATL_NO_VTABLE CIEHook :
     public IObjectWithSiteImpl<CIEHook>,
     public IOleCommandTarget,
     public IDispEventImpl<1, CIEHook, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>,
        public IIEHook

    STDMETHOD_(void,OnBeforeNavigate2)( IDispatch *pDisp, VARIANT * url, VARIANT * Flags, VARIANT * TargetFrameName, VARIANT * PostData, VARIANT * Headers, VARIANT_BOOL * Cancel );
     STDMETHOD_(void,OnDocumentComplete)( IDispatch *pDisp, VARIANT * url );
     STDMETHOD_(void,OnDownloadBegin)( VOID );
     STDMETHOD_(void,OnDownloadComplete)( VOID );
     STDMETHOD_(void,OnNavigateComplete)( IDispatch *pDisp, VARIANT * url );
     STDMETHOD_(void,OnNavigateError)( IDispatch *pDisp, VARIANT *url, VARIANT *TargetFrameName, VARIANT *StatusCode, VARIANT_BOOL *Cancel);
     STDMETHOD_(void,OnNewWindow)( IDispatch ** pDisp, VARIANT_BOOL *cancel );
     STDMETHOD_(void,OnQuit)( VOID );

     // IOleObjectWithSite Methods
     STDMETHOD(SetSite)(IUnknown *pUnkSite);


    然后在IE浏览器初始化时做
    void CIEHook::InstallHooks(void)
    {
     // load ourselves to make sure we stay loaded until the browser goes away
     // otherwise some of the API hooks will crash
     LoadLibrary(_T("Pagetest.dll"));

     // hook the browser wndProc (to supress crashes)
     #ifndef DEBUG
     if( !dispatch_hook )
      dispatch_hook = new CAPIHook("user32.dll", "DispatchMessageW", (PROC)::DispatchMessageW_hook, TRUE);
     #endif
     
     // hook winsock
     WinsockInstallHooks();
     
     // hook wininet
     WinInetInstallHooks();
    }

    4 windows精确计时

             EnterCriticalSection(&cs);
      QueryPerformanceCounter((LARGE_INTEGER *)&lastActivity);
      LeaveCriticalSection(&cs);

    5 各个环节的衔接
      这个才是重中之重。

  • c++如何调用java程序

    2008-05-18 01:25:03

    今天看阿里巴巴搜索技术中心文档,无意发现:

    “camera内部是采用java语言来实现的,本接口把camerajava接口封装成C++接口,通过c语言构建jvm来调用camerajava接口

    我就很想一看究竟c++如何调用java程序了。

     

    参考http://www.velocityreviews.com/forums/t145612-jni-call-java-from-c.html

     

     

    D:\lr_scrīpt\MyJNI>java -version

    java version "1.5.0_06"

     

    DemoMain.java内容如:

    import java.io.*;

    public class DemoMain {

    public static void main(String[] args) throws java.io.IOException, java.lang.NullPointerException

    {

    System.out.println("This is a test.");

    }// end main().

    }// end class DemoMain.

     

    采用vc6++ IDE,采用JNI技术实现。

    (1)    编译时:

    C++  preprocessor->additional include directories:

      加入 D:\Sun\AppServer\jdk\include

    2)运行时,

    D:\Sun\AppServer\jdk\jre\bin\server\jvm.dll 加入环境变量。

     

    #ifndef __cplusplus

    #define __cplusplus

    #endif

    #include "jni.h"

    #include <stdio.h>

    #include <stdlib.h>

    #include <windows.h>

    #pragma comment (lib,"D:\\Sun\\AppServer\\jdk\\lib\\jvm.lib")

     

    void main() {

     

    JavaVM *jvm;

    JNIEnv *env;

     

    JavaVMInitArgs vm_args;

    JavaVMOption options[3];

     

    options[0].optionString = "-Djava.compiler=NONE";

    options[1].optionString = "-Djava.classpath=.";

    options[2].optionString = "-verbose:jni";

     

    vm_args.version = JNI_VERSION_1_4;

    vm_args.nOptions = 3;

    vm_args.options = options;

    vm_args.ignoreUnrecognized = JNI_TRUE;

     

    jint res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

    if (res < 0) {

    fprintf(stderr, "Can't create Java VM\n");

    exit(1);

    };

     

    jclass cls = env->FindClass("DemoMain");

    if (cls == 0) printf("Sorry, I can't find the class");

     

    fprintf(stdout, "This is invokeSimplified4.\n");

     

    jmethodID get_main_id;

     

    if(cls != NULL)

    {

     

    get_main_id =env->GetStaticMethodID(cls,"main","([Ljava/lang/String;)V");

     

    fprintf(stdout, "This is invokeSimplified5.\n");

     

    if(get_main_id != NULL )

    {

          jclass string = env->FindClass("java/lang/String");

          jobjectArray args = env->NewObjectArray(0,string, NULL);

     

          fprintf(stdout, "This is invokeSimplified6.\n");

          int i = env->CallIntMethod(cls, get_main_id, args);

          fprintf(stdout, i+ "This is invokeSimplified7.\n");

    }

    }// end IF.

     

    jvm->DestroyJavaVM();

    fprintf(stdout, "Java VM destory\n");

    }//end main.

     

     

    程序的关键在

    jint res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); 等 jni.h里面的函数

     

  • 从一安全测试PPT中摘录的安全测试工具

    2008-05-12 22:58:14

    by liangjz

    HTTPAnalyzer IE实时分析HTTP流
    Companion js—逆向查看java语言编写的网页源码
    Nessus——扫描服务器(协议与端口)
    Paros——扫描工具
    Sss——系统扫描工具
    Sds——数据库扫描工具
    wikto——spider、google hack等
    X-scan

    HTTPAnalyzer 、paros工具都已经下载并实际试验.

    httpAnalyzer能实时扑捉http流,同样包含duration以及header、reponse信息。貌似可以达到ibm pagedetailer、yahoo yslow、firebug的功能。找个时间好好比划。看来前端web页面分析分析的工具也是很多的

     

     

  • ajax 应用程序

    2008-05-02 13:18:22

      by liangjz

      经过测试在IE6 以及firefox2.0 都可以正常运行的ajax程序。可以用firebug 或者ibm page detailer感觉交互过程

     

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
    <title>ajax demo</title>

    <scrīpt type="text/javascrīpt" language="javascrīpt">
     var httpRequest =false;
        function makeRequest(url) {       
     document.getElementById("result").innerHTML="";
            if (window.XMLHttpRequest) { // Mozilla, Safari, ...
                httpRequest = new XMLHttpRequest();
                if (httpRequest.overrideMimeType) {
                    httpRequest.overrideMimeType('text/xml');
                    // See note below about this line
                }
            }
            else if (window.ActiveXObject) { // IE
      var versions = ['Microsoft.XMLHTTP', 'MSXML2.XMLHTTP','MSXML.XMLHTTP', 'Msxml2.XMLHTTP.7.0',

    'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', ];
       for(var i=0; i<versions.length; i++) {
            try {
           httpRequest = new ActiveXObject(versions[i]);     
        } catch(e) {}
       }
             }
            if (!httpRequest) {
                alert('Cannot create an XMLHTTP instance');
                return false;
            }
     
            httpRequest.onreadystatechange = alertContents;   //function() { alertContents(httpRequest); };
            httpRequest.open('GET', url, true);
     httpRequest.setRequestHeader('Cache-Control','no-cache');
            httpRequest.send('');
        }

        function alertContents(){
            if (httpRequest.readyState == 4) {
                if (httpRequest.status == 200) {
                    //alert(httpRequest.responseText);
      document.getElementById("result").innerHTML =httpRequest.responseText;
                } else {
                   document.getElementById("result").innerHTML='There was a problem with the request.';
                }
            }
        }
    </scrīpt>
    </head>
    <body>
    <span
        style="cursor: pointer; text-decoration: underline"
        ōnclick="makeRequest('http://127.0.0.1:3000/my_test/')">
            Make a request
    </span>
    <br>
    <span id="result" style="" >
    </body>
    </html>

     

    在本地启动mongrel服务器侦听3000端口

  • web前端性能分析工具

    2008-05-02 00:20:18

     

        以前关注服务器端性能测试,现在投了一些精力在了解web前端性能测试。有几个很趁手的工具

    1)ibm page detailer。注册IBM 帐号后,下载了basic版本的。第一个感觉就是惊艳,能把网页duration(切分服务器时间、下载时间等,与loadrunner page break down类似),item等等.基本上满足我们目前需求.

      在启动page detailer后,再启动IE后的HTTP 请求都被截获。

    2) firefox插件firebug。呵呵,这个工具开源的,功能也很强大,而且javascrīpt调试能力好。呵呵,目前 ALIBABA的部分应用支持firefox不如ie好啊。

    3)yahoo yslow。也是firefox插件。偶还没有试用过:)

      看来好工具还是很多的,关键是要有发现的眼光:)

     

     

     

     

     

  • 前端技术-- ajax框架

    2008-05-02 00:06:35

        by liangjz

         以前性能测试关注重心在服务器端,最近有几个应用提出客户端性能度量问题。呵呵,正在了解前端技术领域。

         前端技术包括Javascrīpt、Actionscrīpt、CSS、xHTML等传统技术与Adobe AIR、Google Gears等新技术。 淘宝网大规模应用ajax框架

       Ajax框架主要有如下几种 :

    Prototype http://prototypejs.org, http://scrīpt.aculo.us
    JQuery    http://jquery.com      
    Ext JS2.0-  javascrīpt library    http://www.extjs.com
    scrīpt.aculo.us
    Mootools
    YUI              http://developer.yahoo.com/yui,淘宝网采用YUI,现在自主研发Tbra(不是100%确信)
    JSON
    Dojo             http://dojotoolkit.org
    BackBase

      另外找到一个firefox上调试js的好插件:firebug

  • 截取mysql 慢语句

    2008-04-30 20:22:25

    by liangjz

     

    最近和开发、DBA一起对MYSQL作性能调优,发现几个点对抓取MYSQL慢语句很有帮助

    在/etc/my.cnf 文件加入

    log_slow_queries
    log-queries-not-using-indexes
    log_long_format
    long_query_time=1

     

      将在mysql数据目录下( datadir = /home/mysql ) 生成一个如test-slow.log的文件,内容有:

    # Time: 080430 20:06:53
    #
    User@Host: match_account[match_account] @  [10.0.4.114]
    # Query_time: 0  Lock_time: 0  Rows_sent: 9  Rows_examined: 18
    SELECT * FROM `tree_menus`   WHERE (parentid = 0)  ORDER BY sequence desc, id desc;
    # Time: 080430 20:09:04

     

    查询用了0秒,返回9行,一共查了18

     

    如何利用呢,有2 种方法:

    1) [root@test mysql]# grep Rows_examined   test-slow.log  | sort -g -k9 -r|uniq -u |head -100
    # Query_time: 0  Lock_time: 0  Rows_sent: 30  Rows_examined: 24460
    # Query_time: 0  Lock_time: 0  Rows_sent: 10  Rows_examined: 24440
    # Query_time: 0  Lock_time: 0  Rows_sent: 9  Rows_examined: 24439
    # Query_time: 0  Lock_time: 0  Rows_sent: 2  Rows_examined: 24432
    # Query_time: 0  Lock_time: 0  Rows_sent: 1  Rows_examined: 24430
    # Query_time: 0  Lock_time: 0  Rows_sent: 0  Rows_examined: 12043
    # Query_time: 0  Lock_time: 0  Rows_sent: 34  Rows_examined: 2441
    # Query_time: 0  Lock_time: 0  Rows_sent: 12  Rows_examined: 1449
    # Query_time: 0  Lock_time: 0  Rows_sent: 15  Rows_examined: 30
    # Query_time: 0  Lock_time: 0  Rows_sent: 5  Rows_examined: 23
    # Query_time: 0  Lock_time: 0  Rows_sent: 6  Rows_examined: 22
    # Query_time: 0  Lock_time: 0  Rows_sent: 9  Rows_examined: 18
    # Query_time: 0  Lock_time: 0  Rows_sent: 1  Rows_examined: 6
    # Query_time: 0  Lock_time: 0  Rows_sent: 1  Rows_examined: 5
    # Query_time: 0  Lock_time: 0  Rows_sent: 2  Rows_examined: 2
    [root@test mysql]# grep -A 1 -B 2  "Rows_examined: 24460"  test-slow.lo
    grep: test-slow.lo: No such file or directory
    [root@test mysql]# grep -A 1 -B 2  "Rows_examined: 24460"  test-slow.log
    # Time: 080430 20:02:29
    #
    User@Host: match_account[match_account] @  [10.0.4.114]
    # Query_time: 0  Lock_time: 0  Rows_sent: 30  Rows_examined: 24460
    SELECT * FROM `profiles`    ORDER BY position, created_at DESC LIMIT 0, 30;

     

    2)方法2:

    [root@test mysql]# mysqldumpslow   -s  t   -t  20

    Reading mysql slow query log from /home/mysql/test-slow.log
    Count: 1  Time=0.00s (0s)  Lock=0.00s (0s)  Rows=6.0 (6), match_account[match_account]@[10.0.4.114]
      SELECT * FROM `reports`    ORDER BY sequence desc LIMIT N

    Count: 1  Time=0.00s (0s)  Lock=0.00s (0s)  Rows=15.0 (15), match_account[match_account]@[10.0.4.114]
      SELECT * FROM `experts`   WHERE (email IS NULL)  ORDER BY sequence desc LIMIT N

     

    一般我们关注的3类,参见

    http://blog.dreamhosters.com/kbase/index.cgi?area=2868

     

    A) "Rows_examined" is more than 2000
    B) "Rows_examined" is less than 2000 but that query is being run 20 times a second.
    C) "Rows_examined" is three times bigger than "Rows_sent"

     

  • 解决 perl xml getNodeValue 为空值的过程

    2008-04-19 22:31:29

     今天翻到以前写的一段程序,决定改变文本方式为xml方式描述增强可读性。不想碰到了一个问题折腾了几个小时。

    一 网络安装xml 模块

    ActivePerl-5.8.8.819-MSWin32-x86-267479.msi安装后的路径c:\perl 加入环境变量

    ppm  install  XML::Writer
    ppm  install  XML::DOM

    二 编写XML文件scenarios.xml

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!--
    loadrunner  scenario  drive  events 
    -->
    <scenarios>
     <scenario name="test1"> 
      <loadrunnerscenario>
       <path>f:\1.lrs</path>
       <resultlocation></resultlocation>
      </loadrunnerscenario>   
     </scenario>
     <scenario name="test2">
      <loadrunnerscenario>
       <path>f:\2.lrs</path>
       <resultlocation></resultlocation>
      </loadrunnerscenario>
     </scenario>
    </scenarios>

     

    三 编程获取 path元素的值

     第一次写的程序

     use XML::DOM;
     XML::DOM::Element;
     my $parser = new XML::DOM::Parser;
     my $doc = $parser->parsefile ("scenarios.xml");
     my $nodes = $doc->getElementsByTagName ("loadrunnerscenario");
     my $n = $nodes->getLength;

     for (my $i = 0; $i < $n; $i++)
     {
         my $node = $nodes->item ($i);
         #print  "value=" . $node->toString() . "\n";
         my $subNodes= $node->getElementsByTagName("path");
         my  $subel =$subNodes->item(0);
         print  "nodetype=". $subel->getNodeTypeName . ",value=". $subel->getNodeValue();
              
     }
     # Print doc file
     #$doc->printToFile ("out.xml");
     # Print to string
     #print $doc->toString;
     # Avoid memory leaks - cleanup circular references for garbage collection
     $doc->dispose;

    执行导致
    C:\Perl\bin>perl part2.pl
    nodetype=ELEMENT_NODE,value=
     

    不明白为何getNodeValue=空值?

    再看上下文:
    getNodeValue and setNodeValue (value)
    Returns a string or undef, depending on the node type. This method is provided for completeness. In other languages it saves the programmer an upcast. The value is either available thru some other method defined in the subclass, or else undef is returned. Here are the corresponding methods: Attr::getValue, Text::getData, CDATASection::getData, Comment::getData, ProcessingInstruction::getData.

    似乎也没有错误。到底问题在哪里?

    没有很好的办法,google 到 http://www.ibm.com/developerworks/library/xml-perl2/?S_TACT=105AGX52&S_CMP=cn-a-x


    改写如下,得以解决。问题的关键在于:($node->getNodeType() == TEXT_NODE 才能获取到element的值

     use XML::DOM;
     XML::DOM::Element;
     sub traverse($)
     {
     
      my($node)= @_;

      if ($node->getNodeType == ELEMENT_NODE)
      {
          foreach my $child ($node->getChildNodes())
         {
           return traverse($child);
         }
      }
      elsif ($node->getNodeType() == TEXT_NODE)
      {
        #print $node->getData . "\n";
        $data=$node->getData;
        return $data;
      }
    }

     my $parser = new XML::DOM::Parser;
     my $doc = $parser->parsefile ("scenarios.xml");
     my $nodes = $doc->getElementsByTagName ("loadrunnerscenario");
     my $n = $nodes->getLength;
     for (my $i = 0; $i < $n; $i++)
     {
         my $node = $nodes->item ($i);
         #print  "value=" . $node->toString() . "\n";
         my $subNodes= $node->getElementsByTagName("path");
         my  $subel =$subNodes->item(0);
         #print  "nodetype=". $subel->getNodeTypeName . ",value=". $subel->getNodeValue() . "\n"; 
       
         my $rv=&traverse($subel);

         print $rv ."\n";
         if ($subel->getNodeType == ELEMENT_NODE)
         {
     print  "nodetype=". $subel->getChildNodes()->item(0)->getNodeTypeName. ",nodevalue=". $subel->getChildNodes()->item(0)->getNodeValue(). "\n";
         }
            
     }
     # Print doc file
     #$doc->printToFile ("out.xml");
     # Print to string
     #print $doc->toString;
     # Avoid memory leaks - cleanup circular references for garbage collection
     $doc->dispose;

     

     

  • Acunetix web vulnerality scanner 安全测试使用

    2008-04-19 13:19:39

    推荐一款非常强悍的web 安全测试工具

    http://bbs.51testing.com/thread-112410-1-1.html

  • 借助jclasslib与javassist修改java class字节码

    2008-04-05 20:18:59

     

    http://bbs.51testing.com/thread-110784-1-1.html

      有时候,我们在没有java源程序的情况下,想改变.CLASS文件的部分内容输出或者改变跳转流,怎么办呢?
      介绍2个java hacker的工具javassist 以及jclasslib。

  • 免费跨站攻击扫描工具

    2008-04-02 00:14:42

    免费跨站攻击扫描工具paros与appscan 对比

    2者对比发现paros的结果有很多的不足

     

    1)      SQL 注入扫描貌似有问题

    2)      跨站脚本有遗漏

    3)      Lotus dimino 有安全问题误报

    4)      报表、修复建议没有appscan强大

    5)      Appscan集成强大的安全规范

    6)     

    更多见http://bbs.51testing.com/viewthread.php?tid=110473&extra=page%3D1&frombbs=1

  • 修改HTTP Post/get数据利器TamperIE

    2008-04-01 23:31:07

    近期关注安全测试,将陆续介绍接触到的一些很好的工具。

    安全工具是一把双刃剑,用好了给测试工作带来很大的便利。

    本期介绍修改HTTP Post/get数据利器TamperIE。

    http://bbs.51testing.com/thread-110474-1-1.html

402/2<12
Open Toolbar